Remove unused rn-tester e2e tests (#45032)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/45032

Those tests haven't been running since ~1 year now.
I know it's not ideal but I'd rather remove them instead of keeping them around not executing.
We can still revert them back from the history once we decide to revive the E2E testing effort.

Changelog:
[Internal] [Changed] - Remove unused rn-tester e2e tests

Reviewed By: cipolleschi

Differential Revision: D58729123

fbshipit-source-id: f0f47e3c2e087141fdff506b7c5c9b460263721b
This commit is contained in:
Nicola Corti
2024-06-18 09:06:42 -07:00
committed by Facebook GitHub Bot
parent cdab5370af
commit a272e8ee66
42 changed files with 22 additions and 3349 deletions
-1
View File
@@ -63,7 +63,6 @@ These workflows are:
* `testAll.yml` => runs all the possible tests. This workflow is executed on main and on PRs which change set touches both iOS and Android
* `testAndroid.yml` => runs all the build steps and Android tests. This is used on changes that happens on the Android codebase and infra (`ReactAndroid` folder)
* `testIOS.yml` => runs all the build steps and iOS tests. This is used on changes that happens on the iOS codebase and infra (`React` folder)
* `testE2E.yml` => runs the E2E tests. As of today, E2E tests can be triggered if the commit message contains the `#run-e2e-tests` tag.
* `testJS.yml` => For all the changes that do not touch native/platform code, we only run JS tests.
Notice that if there are changes on files that do not represents code (for example `.md` files like this one or the `Changelog`) we don't run any CI.
-134
View File
@@ -107,140 +107,6 @@ jobs:
- store_test_results:
path: ./reports/junit
# -------------------------
# JOBS: iOS E2E Tests
# -------------------------
test_e2e_ios:
executor: reactnativeios
parameters:
ruby_version:
default: "2.7.8"
description: The version of ruby that must be used
type: string
steps:
- checkout_code_with_cache
- run_yarn
- setup_hermes_version
- run:
name: Install appium
command: npm install appium@2.0.0 -g
- run:
name: Install appium drivers
command: |
appium driver install uiautomator2
appium driver install xcuitest
- run:
name: Start Appium server
command: appium --base-path /wd/hub
background: true
- run:
name: Start Metro
command: |
cd packages/rn-tester
yarn start
background: true
- brew_install:
package: cmake
- setup_ruby:
ruby_version: << parameters.ruby_version >>
- run:
name: Boot iOS Simulator
command: source scripts/.tests.env && xcrun simctl boot "$IOS_DEVICE" || true
- with_xcodebuild_cache:
steps:
- run:
name: Install Bundler
command: |
cd packages/rn-tester
bundle check || bundle install
bundle exec pod setup
RCT_NEW_ARCH_ENABLED=1 bundle exec pod install --verbose
- run:
name: Build app
command: |
xcodebuild build \
-workspace packages/rn-tester/RNTesterPods.xcworkspace \
-configuration Debug \
-scheme RNTester \
-sdk iphonesimulator \
-derivedDataPath /tmp/e2e/
- run:
name: Move app to correct directory
command: mv /tmp/e2e/Build/Products/Debug-iphonesimulator/RNTester.app packages/rn-tester-e2e/apps/rn-tester.app
- run:
name: Check Appium server status
command: scripts/circleci/check_appium_server_status.sh
- run:
name: Run E2E tests
no_output_timeout: 30m
command: |
cd packages/rn-tester-e2e
(yarn test-e2e ios 2>&1 | tee /tmp/test_log) || true
- store_artifacts:
path: /tmp/test_log
# -------------------------
# JOBS: Android E2E Tests
# -------------------------
test_e2e_android:
executor:
name: android/android-machine
tag: 2023.07.1
steps:
- checkout_code_with_cache
- run_yarn
- android/create-avd:
avd-name: e2e_emulator
system-image: system-images;android-34;google_apis;x86_64
install: true
- android/start-emulator:
avd-name: e2e_emulator
no-window: true
restore-gradle-cache-prefix: v1a
post-emulator-launch-assemble-command: ""
- run:
name: Install appium
command: npm install appium@2.0.0 -g
- run:
name: Install appium drivers
command: |
appium driver install uiautomator2@2.29.1
appium driver install xcuitest@4.32.10
- run:
name: Start Appium server
command: appium --base-path /wd/hub
background: true
- run:
name: Start Metro
command: |
cd packages/rn-tester
yarn start
background: true
- with_gradle_cache:
steps:
- run:
name: Build app
command: |
./gradlew :packages:rn-tester:android:app:assembleHermesDebug -PreactNativeArchitectures=x86_64
- run:
name: Move app to correct directory
command: mv packages/rn-tester/android/app/build/outputs/apk/hermes/debug/app-hermes-x86_64-debug.apk packages/rn-tester-e2e/apps/rn-tester.apk
- run:
name: Check Appium server status
command: |
if ! nc -z 127.0.0.1 4723; then
echo Could not find Appium server
exit 1
fi
- run:
name: Run E2E tests
no_output_timeout: 30m
command: |
cd packages/rn-tester-e2e
(yarn test-e2e android 2>&1 | tee /tmp/test_log) || true
- store_artifacts:
path: /tmp/test_log
# -------------------------
# JOBS: Build Android
# -------------------------
@@ -1,9 +0,0 @@
tests_e2e:
when:
and:
- equal: [ false, << pipeline.parameters.run_release_workflow >> ]
- equal: [ false, << pipeline.parameters.run_nightly_workflow >> ]
jobs:
- test_e2e_ios:
ruby_version: "2.7.8"
- test_e2e_android
-26
View File
@@ -1,26 +0,0 @@
name: Run E2E Tests
# This workflow is used to trigger E2E tests on a PR when a comment is made
# containing the text "#run-e2e-tests".
on:
issue_comment:
types: [created]
permissions:
contents: read
jobs:
rebase:
name: Trigger E2E Tests
permissions:
contents: write # for cirrus-actions/rebase to push code to rebase
pull-requests: read # for cirrus-actions/rebase to get info about PR
runs-on: ubuntu-latest
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '#run-e2e-tests')
steps:
- name: Checkout the latest code
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0 # otherwise, you will fail to push refs to dest repo
- name: Push empty commit
run: |
git commit -m "#run-e2e-tests" --allow-empty
git push origin $(git branch --show-current)
-4
View File
@@ -159,9 +159,5 @@ vendor/
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*
# E2E files
/packages/rn-tester-e2e/apps/*.apk
/packages/rn-tester-e2e/apps/*.app
# CircleCI
.circleci/generated_config.yml
-1
View File
@@ -33,7 +33,6 @@ module.exports = {
'<rootDir>/packages/react-native/template',
'<rootDir>/packages/react-native/sdks',
'<rootDir>/packages/react-native/Libraries/Renderer',
'<rootDir>/packages/rn-tester/e2e',
'<rootDir>/packages/react-native-test-renderer/src',
],
transformIgnorePatterns: ['node_modules/(?!@react-native/)'],
-124
View File
@@ -1,124 +0,0 @@
# RNTester E2E folder
In this folder we have a the setup for running E2E testing in RNTester via the usage of [Appium](https://appium.io/) and [WebDriverIO](https://webdriver.io/) and [Jest](https://jestjs.io/).
- [Setting up locally](#setting-up-locally)
- [(one-off) Setting up Appium](#one-off-setting-up-appium)
- [Building RNTester app](#building-rntester-app)
- [Building for iOS](#building-for-ios)
- [Building for Android](#building-for-android)
- [Setting up the RNTester E2E folder](#setting-up-the-rntester-e2e-folder)
- [Testing the RNTester app E2E](#testing-the-rntester-app-e2e)
- [Adding new tests (and project structure)](#adding-new-tests-and-project-structure)
## Setting up locally
### (one-off) Setting up Appium
The first step you need to do is to ensure to install the tooling:
```bash
npm install appium@2.0.0 -g
appium driver install uiautomator2
appium driver install xcuitest
```
> More details about drivers in Appium [here](https://appium.github.io/appium/docs/en/2.0/guides/managing-exts/) and [here](https://appium.github.io/appium/docs/en/2.0/quickstart/uiauto2-driver/)
You should not need to run install commands for drivers separately more than once, even if you bump the dep in package.json.
### Building RNTester app
Building manually *.app* and *.apk* is required to run automation tests on local environment.
0. *(optional)* If you previously built RNTester, you may need to clean up build files and Pods:
```bash
yarn test-e2e-local-clean && yarn install
```
1. Step 1: install packages for the repository, then navigate in the rn-tester folder
```bash
cd react-native
yarn install
cd packages/rn-tester
```
Now, depending on the platform, there are some specific steps
#### Building for iOS
0. Make sure you have Bundler `gem install bundler` - we use it ensure installing the right version of CocoaPods locally.
1. Install Bundler and CocoaPods dependencies: `bundle install` then `bundle exec pod install` or `yarn setup-ios-hermes` for RNTester with Hermes. In order to use JSC instead of Hermes engine, run: `USE_HERMES=0 bundle exec pod install` or `setup-ios-jsc` instead.
2. You can build app with React Native CLI or manually with Xcode:
1. To build with React Native CLI:
1. Run `npx react-native build-ios --mode Debug --scheme RNTester --buildFolder /path/to/build-folder`, replace `/path/to/build-folder` with the real path.
2. Copy the built app using `mv` - `mv /path/to/build-folder/Build/Products/Debug-iphonesimulator/RNTester.app ~/react-native/packages/rn-tester-e2e/apps` or manually.
2. To build with Xcode, open the generated `RNTester.xcworkspace` and build.
1. Find the **RNTester.app** in `~/Library/Developer/Xcode/DerivedData/RNTesterPods-{id}/Build/Products/Debug-iphonesimulator`
2. Copy the app to the following directory `~/react-native/packages/rn-tester-e2e/apps`.
3. Change its name to: `rn-tester.app`
#### Building for Android
0. You'll need to have all the [prerequisites](https://reactnative.dev/contributing/how-to-build-from-source#prerequisites) (SDK, NDK) for Building React Native installed.
1. Start an Android emulator.
2. Build the app via
```bash
# In order to not use Hermes engine, run `yarn install-android-jsc` instead.
yarn install-android-hermes
yarn start
```
*Note: Building for the first time can take a while.*
3. Find the **app-*-debug.apk** in `~/react-native/packages/rn-tester/android/app/build/outputs/apk/hermes/debug`
4. Copy the app `app-*-debug.apk` to the following directory `~/react-native/packages/rn-tester-e2e/apps`
5. Change its name to: `rn-tester.apk`
### Setting up the RNTester E2E folder
In `react-native/packages/rn-tester-e2e` open the following file
```bash
/react-native/packages/rn-tester-e2e/e2e-config.js
```
And modify lines L24->L39 to reflect your local setup configuration (ex. `platformVersion`, `deviceName`). Make sure to **not** commit this change if you send a PR to add tests.
## Testing the RNTester app E2E
After you have done all the above correctly, and you have the Android/iOS apps in the `rn-tester-e2e/apps` folder, in a dedicated terminal window, run:
```bash
appium --base-path /wd/hub
```
This will start the Appium server - you will need this to keep running.
Then open a second terminal window and start the Metro terminal from the `packages/rn-tester` folder, via `yarn start --reset-cache`. This terminal window also needs to keep running.
Now, make sure that the iOS simulator/the Android emulator is up and running.
Finally, you can open a third terminal window and run:
```bash
yarn test-e2e android # for android
yarn test-e2e ios # for ios
```
Now you should see the RNTester app being open, and the defined test being run.
## Adding new tests (and project structure)
This project has 2 main folders:
- `apps`, where, as you have seen above, the iOS/Android RNTester apps need to be put so that appium will pick them and install in the emulator/simulator consistently.
- `tests`, where the tests and referencing files all live. The substructure is as follows:
- `screens` -> in this folder, you will find `*.screen.js` files, where each file represents a navigation screen for RNTester. So there are 3 root ones (`apis`, `bookmarks`, `components`) and then for subscreens, there's a folder with the same name - currently, that's only `components` that contains `buttonComponent.screen.js`. The content of these files is what was earlier mentioned as "references": they provide an easy way to define all elements present in said screen, so that they can be used for tests.
- `specs` -> this folder follows a similar 1:1 mapping to the RNTester screens, but for the tests: for each screen (or subscreen) there's a dedicated `*.test.js` file (such as `buttonComponentScreen.test.js`). Ideally, in this file the Jest tests are standard, leveraging the `*.screen.js` counterpart for the details of defining how Appium/WDIO can reach those elements on screen.
When adding a new test, please ensure that you follow this pattern and add the relevant test in the right screen file / screen test file. Use the files mentioned above as examples.
-1
View File
@@ -1 +0,0 @@
Put the *.app and *.apk files here.
-14
View File
@@ -1,14 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
module.exports = {
presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
plugins: ['@babel/plugin-transform-flow-strip-types'],
};
-61
View File
@@ -1,61 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
*/
const path = require('path');
type Capabilities = {
platformName: 'Android' | 'iOS',
'appium:platformVersion': string,
'appium:deviceName': string,
'appium:app': string,
'appium:automationName': 'UiAutomator2' | 'XCUITest',
'appium:newCommandTimeout'?: number,
};
let capabilities: Capabilities;
const android = {
platformName: 'Android',
'appium:platformVersion': '14.0',
'appium:deviceName': 'Android Emulator',
'appium:app': path.join(process.cwd(), '/apps/rn-tester.apk'),
'appium:automationName': 'UiAutomator2',
'appium:newCommandTimeout': 240,
};
const ios = {
platformName: 'iOS',
'appium:platformVersion': '16.4',
'appium:deviceName': 'iPhone 14',
'appium:automationName': 'XCUITest',
'appium:app': path.join(process.cwd(), '/apps/rn-tester.app'),
};
// check that E2E_DEVICE exists, is a string and its either "ios" or "android"
if (!process.env.E2E_DEVICE) {
throw new Error('E2E_DEVICE environment variable is not defined');
} else if (typeof process.env.E2E_DEVICE !== 'string') {
throw new Error('E2E_DEVICE environment variable is not a string');
} else if (
process.env.E2E_DEVICE !== 'ios' &&
process.env.E2E_DEVICE !== 'android'
) {
throw new Error('E2E_DEVICE environment variable is not "ios" or "android"');
}
if (process.env.E2E_DEVICE === 'android') {
capabilities = android;
}
if (process.env.E2E_DEVICE === 'ios') {
capabilities = ios;
}
export default capabilities;
-18
View File
@@ -1,18 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
module.exports = {
testTimeout: 120000,
bail: 0,
setupFilesAfterEnv: ['./jest.setup.js'],
testMatch: ['**/specs/**/*.js'],
maxWorkers: 1,
verbose: true,
};
-50
View File
@@ -1,50 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
*/
import capabilities from './e2e-config.js';
import {afterEach, beforeEach, jest} from '@jest/globals';
const wdio = require('webdriverio');
jest.retryTimes(3);
let driver: any;
const config = {
path: '/wd/hub',
host: 'localhost',
port: 4723,
waitforTimeout: 60000,
capabilities: {
...capabilities,
},
};
beforeEach(async () => {
// $FlowFixMe
let testName: any = expect.getState().currentTestName;
console.info(
'------------------------------------------------------------ Test is starting... ------------------------------------------------------------',
);
console.info(
'------------------------------ Test name: ' +
testName +
' ------------------------------',
);
driver = await wdio.remote(config);
});
afterEach(async () => {
await driver.deleteSession();
console.info(
'------------------------------------------------------------ Done with testing. ------------------------------------------------------------',
);
});
export {driver};
-25
View File
@@ -1,25 +0,0 @@
{
"name": "@react-native/tester-e2e",
"private": true,
"version": "0.75.0-main",
"license": "MIT",
"description": "React Native E2E tester app.",
"homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/rn-tester-e2e",
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/facebook/react-native.git",
"directory": "packages/rn-tester-e2e"
},
"scripts": {
"test-e2e": "node scripts/e2e/run-e2e-tests.js"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/plugin-transform-flow-strip-types": "^7.20.0",
"@babel/preset-env": "^7.20.0",
"@types/jest": "^29.5.3",
"eslint": "^8.19.0",
"jest": "^29.6.3",
"webdriverio": "^7.32.0"
}
}
@@ -1,16 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const SUPPORTED_PLATFORMS = ['ios', 'android'];
if (process.argv.length !== 3 || !SUPPORTED_PLATFORMS.includes(process.argv[2])) {
throw new Error(`Invalid platform. Supported platforms are: ${SUPPORTED_PLATFORMS.join(', ')}`);
}
const platform = process.argv[2];
const { execSync } = require('child_process');
execSync(`E2E_DEVICE=${platform} jest --runInBand`, { stdio: 'inherit' });
@@ -1,95 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
*/
import {driver} from '../../jest.setup';
type PlatformsReference = {
ios: string,
android: string,
};
class Utils {
async checkElementExistence(locator: string): Promise<boolean> {
await driver.$(locator).waitForDisplayed();
return driver.$(locator).isDisplayed();
}
async clickElement(locator: string): Promise<void> {
await driver.$(locator).waitForDisplayed();
await driver.$(locator).click();
}
async getElementText(locator: string): Promise<string> {
await driver.$(locator).waitForDisplayed();
return driver.$(locator).getText();
}
platformSelect(platforms: PlatformsReference): string {
// if something goes wrong, we fallback to ios. But it should never happent, the process will fail way earlier.
// $FlowFixMe[invalid-computed-prop]
return platforms[process?.env?.E2E_DEVICE || 'ios'];
}
async scrollToElement(locator: string): Promise<void> {
let {width, height} = await driver.getWindowSize();
let elementIsFound;
try {
elementIsFound = await driver.$(locator).isDisplayed();
while (!elementIsFound) {
driver.touchPerform([
{
action: 'press',
options: {
x: width / 2,
y: height / 2,
},
},
{
action: 'wait',
options: {
ms: 1000,
},
},
{
action: 'moveTo',
options: {
x: width / 2,
y: height / 10,
},
},
{
action: 'release',
},
]);
elementIsFound = await driver.$(locator).isDisplayed();
}
} catch (err) {
console.log('Element is not found');
}
}
}
export const iOSLabel = (label: string): string => {
return `[label="${label}"]`;
};
export const iOSName = (name: string): string => {
return `[name="${name}"]`;
};
export const androidWidget = (
type: string,
selector: string,
id: string,
): string => {
return `//android.widget.${type}[@${selector}="${id}"]`;
};
export const UtilsSingleton: Utils = new Utils();
@@ -1,15 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
// root level screen in RNTester: APIs
class ApisScreen {}
export const ApisScreenSingleton: ApisScreen = new ApisScreen();
@@ -1,15 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
// root level screen in RNTester: Bookmarks
class BookmarksScreen {}
export const BookmarksScreenSingleton: BookmarksScreen = new BookmarksScreen();
@@ -1,225 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {UtilsSingleton as Utils, iOSLabel} from '../helpers/utils';
// root level screen in RNTester: Components
const buttonComponentLabel = 'Button Simple React Native button component.';
const activityIndicatorComponentLabel =
'ActivityIndicator Animated loading indicators.';
const keyboardAvoidingViewComponentLabel =
'KeyboardAvoidingView Base component for views that automatically adjust their height or position to move out of the way of the keyboard.';
const flatListComponentLabel = 'FlatList Performant, scrollable list of data.';
const jsResponderHandlerComponentLabel =
'JSResponderHandler Simple example to test JSResponderHandler.';
const modalComponentLabel = 'Modal Component for presenting modal views.';
const newAppScreenComponentLabel =
'New App Screen Displays the content of the new app screen';
const pressableComponentLabel =
'Pressable Component for making views pressable.';
const refreshControlComponentLabel =
'RefreshControl Adds pull-to-refresh support to a scrollview.';
const scrollViewSimpleExampleComponentLabel =
'ScrollViewSimpleExample Component that enables scrolling through child components.';
type ComponentsScreenType = {
buttonComponentLabelElement: string,
activityIndicatorComponentLabelElement: string,
keyboardAvoidingViewComponentLabelElement: string,
flatListComponentLabelElement: string,
jsResponderHandlerComponentLabelElement: string,
modalComponentLabelElement: string,
newAppScreenComponentLabelElement: string,
pressableComponentLabelElement: string,
refreshControlComponentLabelElement: string,
scrollViewSimpleExampleComponentLabelElement: string,
checkButtonComponentIsDisplayed: () => Promise<boolean>,
checkActivityIndicatorComponentIsDisplayed: () => Promise<boolean>,
checkKeyboardAvoidingViewComponentIsDisplayed: () => Promise<boolean>,
checkFlatListComponentIsDisplayed: () => Promise<boolean>,
checkJSResponderHandlerComponentIsDisplayed: () => Promise<boolean>,
checkModalComponentIsDisplayed: () => Promise<boolean>,
checkNewAppScreenComponentIsDisplayed: () => Promise<boolean>,
checkPressableComponentIsDisplayed: () => Promise<boolean>,
checkRefreshControlComponentIsDisplayed: () => Promise<boolean>,
checkScrollViewSimpleExampleComponentIsDisplayed: () => Promise<boolean>,
clickButtonComponent: () => Promise<void>,
clickActivityIndicatorComponent: () => Promise<void>,
clickKeyboardAvoidingViewComponent: () => Promise<void>,
clickFlatListComponent: () => Promise<void>,
clickJSResponderHandlerComponent: () => Promise<void>,
clickModalComponent: () => Promise<void>,
clickNewAppScreenComponent: () => Promise<void>,
clickPressableComponent: () => Promise<void>,
clickRefreshControlComponent: () => Promise<void>,
clickScrollViewSimpleExampleComponent: () => Promise<void>,
};
export const ComponentsScreen: ComponentsScreenType = {
// Reference in the top level Component list
buttonComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(buttonComponentLabel),
android: `~${buttonComponentLabel}`,
}),
activityIndicatorComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(activityIndicatorComponentLabel),
android: `~${activityIndicatorComponentLabel}`,
}),
keyboardAvoidingViewComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(keyboardAvoidingViewComponentLabel),
android: `~${keyboardAvoidingViewComponentLabel}`,
}),
flatListComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(flatListComponentLabel),
android: `~${flatListComponentLabel}`,
}),
jsResponderHandlerComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(jsResponderHandlerComponentLabel),
android: `~${jsResponderHandlerComponentLabel}`,
}),
modalComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(modalComponentLabel),
android: `~${modalComponentLabel}`,
}),
newAppScreenComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(newAppScreenComponentLabel),
android: `~${newAppScreenComponentLabel}`,
}),
pressableComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(pressableComponentLabel),
android: `~${pressableComponentLabel}`,
}),
refreshControlComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(refreshControlComponentLabel),
android: `~${refreshControlComponentLabel}`,
}),
scrollViewSimpleExampleComponentLabelElement: Utils.platformSelect({
ios: iOSLabel(scrollViewSimpleExampleComponentLabel),
android: `~${scrollViewSimpleExampleComponentLabel}`,
}),
// Methods to interact with top level elements in the list
checkButtonComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.buttonComponentLabelElement);
},
checkActivityIndicatorComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.activityIndicatorComponentLabelElement,
);
},
checkKeyboardAvoidingViewComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.keyboardAvoidingViewComponentLabelElement,
);
},
checkFlatListComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.flatListComponentLabelElement,
);
},
checkJSResponderHandlerComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.jsResponderHandlerComponentLabelElement,
);
},
checkModalComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.modalComponentLabelElement);
},
checkNewAppScreenComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.newAppScreenComponentLabelElement,
);
},
checkPressableComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.pressableComponentLabelElement,
);
},
checkRefreshControlComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.refreshControlComponentLabelElement,
);
},
checkScrollViewSimpleExampleComponentIsDisplayed: async function (
this: ComponentsScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.scrollViewSimpleExampleComponentLabelElement,
);
},
clickButtonComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.buttonComponentLabelElement);
},
clickActivityIndicatorComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.activityIndicatorComponentLabelElement);
},
clickKeyboardAvoidingViewComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.keyboardAvoidingViewComponentLabelElement);
},
clickFlatListComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.flatListComponentLabelElement);
},
clickJSResponderHandlerComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.jsResponderHandlerComponentLabelElement);
},
clickModalComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.modalComponentLabelElement);
},
clickNewAppScreenComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.newAppScreenComponentLabelElement);
},
clickPressableComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.pressableComponentLabelElement);
},
clickRefreshControlComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.refreshControlComponentLabelElement);
},
clickScrollViewSimpleExampleComponent: async function (
this: ComponentsScreenType,
): Promise<void> {
await Utils.clickElement(this.scrollViewSimpleExampleComponentLabelElement);
},
};
@@ -1,50 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSLabel,
iOSName,
} from '../../helpers/utils';
type ActivityIndicatorComponentScreenType = {
activityIndicatorScreenElement: string,
defaultActivityIndicatorScreenElement: string,
checkDefaultActivityIndicatorIsDisplayed: () => Promise<boolean>,
};
const defaultActivityIndicatorTextDesc = 'Wait for content to load!';
export const ActivityIndicatorComponentScreen: ActivityIndicatorComponentScreenType =
{
// reference in the Components list
activityIndicatorScreenElement: Utils.platformSelect({
ios: iOSName('ActivityIndicator'),
android: androidWidget('TextView', 'text', 'ActivityIndicator'),
}),
// References to elements within the Activity Indicator Component screen
defaultActivityIndicatorScreenElement: Utils.platformSelect({
ios: iOSLabel(defaultActivityIndicatorTextDesc),
android: androidWidget(
'FrameLayout',
'content-desc',
defaultActivityIndicatorTextDesc,
),
}),
// Methods to interact with the elements
checkDefaultActivityIndicatorIsDisplayed: async function (
this: ActivityIndicatorComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.defaultActivityIndicatorScreenElement,
);
},
};
@@ -1,95 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSLabel,
} from '../../helpers/utils';
type ButtonComponentScreenType = {
buttonScreenElement: string,
btnSubmitElement: string,
inputSearchElement: string,
btnOKElement: string,
btnCancelElement: string,
submitAlertBoxElement: string,
cancelAlertBoxElement: string,
checkButtonsScreenIsDisplayed: () => Promise<string>,
clickSubmitApplication: () => Promise<void>,
clickCancelApplication: () => Promise<void>,
getCancelAlertText: () => Promise<string>,
getSubmitAlertText: () => Promise<string>,
clickOkButton: () => Promise<void>,
};
export const ButtonComponentScreen: ButtonComponentScreenType = {
// reference in the Components list
buttonScreenElement: Utils.platformSelect({
ios: iOSLabel('Button'),
android: androidWidget('ViewGroup', 'text', 'Button'),
}),
// References to elements within the Button Component screen
btnSubmitElement: Utils.platformSelect({
ios: iOSLabel('Press to submit your application!'),
android: androidWidget('Button', 'resource-id', 'button_default_styling'),
}),
inputSearchElement: Utils.platformSelect({
ios: iOSLabel('example_search'),
android: androidWidget('EditText', 'resource-id', 'example_search'),
}),
btnOKElement: Utils.platformSelect({
ios: iOSLabel('OK'),
android: androidWidget('Button', 'text', 'OK'),
}),
btnCancelElement: Utils.platformSelect({
ios: iOSLabel('Press to cancel your application!'),
android: androidWidget('Button', 'resource-id', 'cancel_button'),
}),
submitAlertBoxElement: Utils.platformSelect({
ios: iOSLabel('Your application has been submitted!'),
android: androidWidget('TextView', 'resource-id', 'android:id/alertTitle'),
}),
cancelAlertBoxElement: Utils.platformSelect({
ios: iOSLabel('Your application has been cancelled!'),
android: androidWidget('TextView', 'resource-id', 'android:id/alertTitle'),
}),
// Methods to interact with the elements
checkButtonsScreenIsDisplayed: async function (
this: ButtonComponentScreenType,
): Promise<string> {
return await Utils.getElementText(this.buttonScreenElement);
},
clickSubmitApplication: async function (
this: ButtonComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnSubmitElement);
},
clickCancelApplication: async function (
this: ButtonComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnCancelElement);
},
getCancelAlertText: async function (
this: ButtonComponentScreenType,
): Promise<string> {
return await Utils.getElementText(this.cancelAlertBoxElement);
},
getSubmitAlertText: async function (
this: ButtonComponentScreenType,
): Promise<string> {
return await Utils.getElementText(this.submitAlertBoxElement);
},
clickOkButton: async function (
this: ButtonComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnOKElement);
},
};
@@ -1,351 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSLabel,
iOSName,
} from '../../helpers/utils';
type FlatListComponentScreenType = {
flatListScreenElement: string,
basicScreenElement: string,
onStartReachedScreenElement: string,
onEndReachedScreenElement: string,
contentInsetScreenElement: string,
invertedScreenElement: string,
onViewableItemsChangedScreenElement: string,
flatListWithSeparatorsScreenElement: string,
multiColumnScreenElement: string,
stickyHeadersScreenElement: string,
nestedScreenElement: string,
basicSearchBarScreenElement: string,
btnCollapseElement: string,
btnToggleTrueElement: string,
btnToggleFalseElement: string,
onStartBtnTestElement: string,
stickyPizzaElement: string,
pizzaElement: string,
iceCreamElement: string,
contentInsetMenuElement: string,
separatorElement: string,
listHeaderTextElement: string,
nestedHeaderTextElement: string,
checkFlatListBasicScreenIsDisplayed: () => Promise<boolean>,
checkFlatListOnStartReachedScreenIsDisplayed: () => Promise<boolean>,
checkFlatListOnEndReachedScreenIsDisplayed: () => Promise<boolean>,
checkFlatListContentInsetScreenIsDisplayed: () => Promise<boolean>,
checkFlatListInvertedScreenIsDisplayed: () => Promise<boolean>,
checkFlatListOnViewableItemsChangedScreenIsDisplayed: () => Promise<boolean>,
checkFlatListWithSeparatorsScreenIsDisplayed: () => Promise<boolean>,
checkFlatListMultiColumnScreenIsDisplayed: () => Promise<boolean>,
checkFlatListStickyHeadersScreenIsDisplayed: () => Promise<boolean>,
checkFlatListNestedScreenIsDisplayed: () => Promise<boolean>,
checkSearchBarIsDisplayed: () => Promise<boolean>,
checkCollapseButtonIsDisplayed: () => Promise<boolean>,
checkPizzaIsDisplayed: () => Promise<boolean>,
checkIceCreamIsDisplayed: () => Promise<boolean>,
checkContentInsetMenuIsDisplayed: () => Promise<boolean>,
checkInvertedToggleFalseButtonIsDisplayed: () => Promise<boolean>,
checkSeparatorIsDisplayed: () => Promise<boolean>,
checkListHeaderIsDisplayed: () => Promise<boolean>,
checkStickyPizzaIsDisplayed: () => Promise<boolean>,
checkNestedHeaderIsDisplayed: () => Promise<boolean>,
scrollUntilOnViewableItemsChangedIsDisplayed: () => Promise<void>,
scrollUntilNestedIsDisplayed: () => Promise<void>,
clickFlatListBasicButton: () => Promise<void>,
clickFlatListOnStartButton: () => Promise<void>,
clickFlatListOnStartTestButton: () => Promise<void>,
clickFlatListOnEndButton: () => Promise<void>,
clickFlatListContentInsetButton: () => Promise<void>,
clickFlatListInvertedButton: () => Promise<void>,
clickFlatListOnViewableItemsChangedButton: () => Promise<void>,
clickFlatListWithSeparatorsButton: () => Promise<void>,
clickFlatListMultiColumnButton: () => Promise<void>,
clickFlatListStickyHeadersButton: () => Promise<void>,
clickFlatListNestedButton: () => Promise<void>,
clickToggleTrueButton: () => Promise<void>,
};
const flatListWithSeparatorsText = 'FlatList with Separators';
export const FlatListComponentScreen: FlatListComponentScreenType = {
// reference in the Components list
flatListScreenElement: Utils.platformSelect({
ios: iOSName('FlatList'),
android: androidWidget('TextView', 'text', 'FlatList'),
}),
// References to elements within the FlatList Component screen
basicScreenElement: Utils.platformSelect({
ios: iOSName('Basic'),
android: androidWidget('TextView', 'text', 'Basic'),
}),
onStartReachedScreenElement: Utils.platformSelect({
ios: iOSName('onStartReached'),
android: androidWidget('TextView', 'text', 'onStartReached'),
}),
onEndReachedScreenElement: Utils.platformSelect({
ios: iOSName('onEndReached'),
android: androidWidget('TextView', 'text', 'onEndReached'),
}),
contentInsetScreenElement: Utils.platformSelect({
ios: iOSName('Content Inset'),
android: androidWidget('TextView', 'text', 'Content Inset'),
}),
invertedScreenElement: Utils.platformSelect({
ios: iOSName('Inverted'),
android: androidWidget('TextView', 'text', 'Inverted'),
}),
onViewableItemsChangedScreenElement: Utils.platformSelect({
ios: iOSName('onViewableItemsChanged'),
android: androidWidget('TextView', 'text', 'onViewableItemsChanged'),
}),
flatListWithSeparatorsScreenElement: Utils.platformSelect({
ios: iOSName(flatListWithSeparatorsText),
android: androidWidget('TextView', 'text', flatListWithSeparatorsText),
}),
multiColumnScreenElement: Utils.platformSelect({
ios: iOSName('MultiColumn'),
android: androidWidget('TextView', 'text', 'MultiColumn'),
}),
stickyHeadersScreenElement: Utils.platformSelect({
ios: iOSName('Sticky Headers'),
android: androidWidget('TextView', 'text', 'Sticky Headers'),
}),
nestedScreenElement: Utils.platformSelect({
ios: iOSName('Nested'),
android: androidWidget('TextView', 'text', 'Nested'),
}),
btnCollapseElement: Utils.platformSelect({
ios: iOSLabel('Collapse'),
android: androidWidget('Button', 'content-desc', 'COLLAPSE'),
}),
btnToggleTrueElement: Utils.platformSelect({
ios: iOSLabel('Toggle true'),
android: androidWidget('Button', 'content-desc', 'TOGGLE TRUE'),
}),
btnToggleFalseElement: Utils.platformSelect({
ios: iOSLabel('Toggle false'),
android: androidWidget('Button', 'content-desc', 'TOGGLE FALSE'),
}),
basicSearchBarScreenElement: Utils.platformSelect({
ios: iOSName('search_bar_flat_list'),
android: androidWidget('EditText', 'resource-id', 'search_bar_flat_list'),
}),
onStartBtnTestElement: Utils.platformSelect({
ios: iOSName('start_test'),
android: androidWidget('Button', 'resource-id', 'start_test'),
}),
pizzaElement: Utils.platformSelect({
ios: iOSLabel('Pizza'),
android: androidWidget('TextView', 'text', 'Pizza'),
}),
iceCreamElement: Utils.platformSelect({
ios: iOSLabel('Ice Cream'),
android: androidWidget('TextView', 'text', 'Ice Cream'),
}),
contentInsetMenuElement: Utils.platformSelect({
ios: iOSLabel('Menu'),
android: androidWidget('TextView', 'text', 'Menu'),
}),
separatorElement: Utils.platformSelect({
ios: iOSName('flat_list_separator'),
android: androidWidget('TextView', 'resource-id', 'flat_list_separator'),
}),
listHeaderTextElement: Utils.platformSelect({
ios: iOSName('LIST HEADER'),
android: androidWidget('TextView', 'text', 'LIST HEADER'),
}),
stickyPizzaElement: Utils.platformSelect({
ios: iOSName('Sticky Pizza'),
android: androidWidget('TextView', 'text', 'Sticky Pizza'),
}),
nestedHeaderTextElement: Utils.platformSelect({
ios: iOSName('Header'),
android: androidWidget('TextView', 'text', 'Header'),
}),
// Methods to interact with the FlatList elements
checkSearchBarIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.basicSearchBarScreenElement);
},
checkCollapseButtonIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.btnCollapseElement);
},
checkFlatListBasicScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.basicScreenElement);
},
checkFlatListOnStartReachedScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.onStartReachedScreenElement);
},
checkFlatListOnEndReachedScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.onEndReachedScreenElement);
},
checkPizzaIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.pizzaElement);
},
checkIceCreamIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.iceCreamElement);
},
checkFlatListContentInsetScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.contentInsetScreenElement);
},
checkFlatListInvertedScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.invertedScreenElement);
},
checkFlatListOnViewableItemsChangedScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.onViewableItemsChangedScreenElement,
);
},
checkFlatListWithSeparatorsScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.flatListWithSeparatorsScreenElement,
);
},
checkFlatListMultiColumnScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.multiColumnScreenElement);
},
checkFlatListStickyHeadersScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.stickyHeadersScreenElement);
},
checkFlatListNestedScreenIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.nestedScreenElement);
},
checkListHeaderIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.listHeaderTextElement);
},
checkContentInsetMenuIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.contentInsetMenuElement);
},
checkInvertedToggleFalseButtonIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.btnToggleFalseElement);
},
checkSeparatorIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.separatorElement);
},
checkStickyPizzaIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.stickyPizzaElement);
},
checkNestedHeaderIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.nestedHeaderTextElement);
},
scrollUntilOnViewableItemsChangedIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(
this.onViewableItemsChangedScreenElement,
);
},
scrollUntilNestedIsDisplayed: async function (
this: FlatListComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(this.nestedScreenElement);
},
clickFlatListBasicButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.basicScreenElement);
},
clickFlatListOnStartButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.onStartReachedScreenElement);
},
clickFlatListOnStartTestButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.onStartBtnTestElement);
},
clickFlatListOnEndButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.onEndReachedScreenElement);
},
clickFlatListContentInsetButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.contentInsetScreenElement);
},
clickFlatListInvertedButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.invertedScreenElement);
},
clickFlatListOnViewableItemsChangedButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.onViewableItemsChangedScreenElement);
},
clickFlatListWithSeparatorsButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.flatListWithSeparatorsScreenElement);
},
clickFlatListMultiColumnButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.multiColumnScreenElement);
},
clickFlatListStickyHeadersButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.stickyHeadersScreenElement);
},
clickFlatListNestedButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.nestedScreenElement);
},
clickToggleTrueButton: async function (
this: FlatListComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnToggleTrueElement);
},
};
@@ -1,57 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSName,
} from '../../helpers/utils';
type JSResponderHandlerComponentScreenType = {
jsResponderHandlerScreenElement: string,
rowZeroScreenElement: string,
scrollUntilJSResponderHandlerComponentIsDisplayed: () => Promise<void>,
checkRowZeroLabelIsDisplayed: () => Promise<boolean>,
getRowZeroText: () => Promise<string>,
};
export const JSResponderHandlerComponentScreen: JSResponderHandlerComponentScreenType =
{
// reference in the Components list
jsResponderHandlerScreenElement: Utils.platformSelect({
ios: iOSName('JSResponderHandler'),
android: androidWidget('TextView', 'text', 'JSResponderHandler'),
}),
// References to elements within the js responder handler Component screen
rowZeroScreenElement: Utils.platformSelect({
ios: iOSName('row_js_responder_handler'),
android: androidWidget(
'TextView',
'resource-id',
'row_js_responder_handler',
),
}),
// Methods to interact with the elements
scrollUntilJSResponderHandlerComponentIsDisplayed: async function (
this: JSResponderHandlerComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(this.jsResponderHandlerScreenElement);
},
checkRowZeroLabelIsDisplayed: async function (
this: JSResponderHandlerComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.rowZeroScreenElement);
},
getRowZeroText: async function (
this: JSResponderHandlerComponentScreenType,
): Promise<string> {
return await Utils.getElementText(this.rowZeroScreenElement);
},
};
@@ -1,105 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSLabel,
iOSName,
} from '../../helpers/utils';
type KeyboardAvoidingViewComponentScreenType = {
keyboardAvoidingViewScreenElement: string,
btnDifferentBehaviorsOpenExampleElement: string,
btnRegisterElement: string,
registerAlertBoxElement: string,
btnOKElement: string,
scrollUntilKeyboardAvoidingViewComponentIsDisplayed: () => Promise<void>,
checkBtnDifferentBehaviorsOpenExampleIsDisplayed: () => Promise<boolean>,
checkBtnRegisterIsDisplayed: () => Promise<boolean>,
clickDifferentBehaviorsOpenExampleButton: () => Promise<void>,
clickRegisterButton: () => Promise<void>,
clickOkButton: () => Promise<void>,
getRegisterAlertText: () => Promise<string>,
};
export const KeyboardAvoidingViewComponentScreen: KeyboardAvoidingViewComponentScreenType =
{
// reference in the Components list
keyboardAvoidingViewScreenElement: Utils.platformSelect({
ios: iOSName('KeyboardAvoidingView'),
android: androidWidget('TextView', 'text', 'KeyboardAvoidingView'),
}),
// References to elements within the KeyboardAvoidingVIew Component screen
btnDifferentBehaviorsOpenExampleElement: Utils.platformSelect({
ios: iOSName('keyboard_avoiding_view_behaviors_open'),
android: androidWidget(
'TextView',
'resource-id',
'keyboard_avoiding_view_behaviors_open',
),
}),
btnRegisterElement: Utils.platformSelect({
ios: iOSName('register_button'),
android: androidWidget('Button', 'resource-id', 'register_button'),
}),
registerAlertBoxElement: Utils.platformSelect({
ios: iOSLabel('Successfully Registered!'),
android: androidWidget(
'TextView',
'resource-id',
'android:id/alertTitle',
),
}),
btnOKElement: Utils.platformSelect({
ios: iOSLabel('OK'),
android: androidWidget('Button', 'text', 'OK'),
}),
// Methods to interact with the elements
scrollUntilKeyboardAvoidingViewComponentIsDisplayed: async function (
this: KeyboardAvoidingViewComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(
this.keyboardAvoidingViewScreenElement,
);
},
checkBtnDifferentBehaviorsOpenExampleIsDisplayed: async function (
this: KeyboardAvoidingViewComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.btnDifferentBehaviorsOpenExampleElement,
);
},
checkBtnRegisterIsDisplayed: async function (
this: KeyboardAvoidingViewComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.btnRegisterElement);
},
clickDifferentBehaviorsOpenExampleButton: async function (
this: KeyboardAvoidingViewComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnDifferentBehaviorsOpenExampleElement);
},
clickRegisterButton: async function (
this: KeyboardAvoidingViewComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnRegisterElement);
},
clickOkButton: async function (
this: KeyboardAvoidingViewComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnOKElement);
},
getRegisterAlertText: async function (
this: KeyboardAvoidingViewComponentScreenType,
): Promise<string> {
return await Utils.getElementText(this.registerAlertBoxElement);
},
};
@@ -1,91 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSName,
} from '../../helpers/utils';
type ModalComponentScreenType = {
modalScreenElement: string,
btnShowModalElement: string,
modalAnimationTypeTextElement: string,
modalModeTextElement: string,
btnCloseElement: string,
checkShowModalIsDisplayed: () => Promise<boolean>,
checkModalAnimationTypeIsDisplayed: () => Promise<boolean>,
scrollUntilModalComponentIsDisplayed: () => Promise<void>,
clickShowModalButton: () => Promise<void>,
clickCloseButton: () => Promise<void>,
};
const showModalBtnText = 'Show Modal';
export const ModalComponentScreen: ModalComponentScreenType = {
// reference in the Components list
modalScreenElement: Utils.platformSelect({
ios: iOSName('Modal'),
android: androidWidget('TextView', 'text', 'Modal'),
}),
// References to elements within the Modal Component screen
btnShowModalElement: Utils.platformSelect({
ios: iOSName(showModalBtnText),
android: androidWidget('TextView', 'text', showModalBtnText),
}),
modalAnimationTypeTextElement: Utils.platformSelect({
ios: iOSName('modal_animationType_text'),
android: androidWidget(
'TextView',
'resource-id',
'modal_animationType_text',
),
}),
modalModeTextElement: Utils.platformSelect({
ios: iOSName('modal_animationType_text'),
android: androidWidget(
'TextView',
'resource-id',
'row_js_responder_handler',
),
}),
btnCloseElement: Utils.platformSelect({
ios: iOSName('Close'),
android: androidWidget('TextView', 'text', 'Close'),
}),
// Methods to interact with the elements
checkShowModalIsDisplayed: async function (
this: ModalComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.btnShowModalElement);
},
checkModalAnimationTypeIsDisplayed: async function (
this: ModalComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.modalAnimationTypeTextElement,
);
},
scrollUntilModalComponentIsDisplayed: async function (
this: ModalComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(this.modalScreenElement);
},
clickShowModalButton: async function (
this: ModalComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnShowModalElement);
},
clickCloseButton: async function (
this: ModalComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnCloseElement);
},
};
@@ -1,49 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSName,
} from '../../helpers/utils';
type NewAppComponentScreenType = {
newAppScreenElement: string,
newAppHeaderScreenElement: string,
scrollUntilNewAppHeaderComponentIsDisplayed: () => Promise<void>,
checkNewAppHeaderIsDisplayed: () => Promise<boolean>,
};
const newAppScreenText = 'New App Screen';
const newAppScreenHeaderText = 'New App Screen Header';
export const NewAppComponentScreen: NewAppComponentScreenType = {
// reference in the Components list
newAppScreenElement: Utils.platformSelect({
ios: iOSName(newAppScreenText),
android: androidWidget('TextView', 'text', newAppScreenText),
}),
// References to elements within the New App Component screenS
newAppHeaderScreenElement: Utils.platformSelect({
ios: iOSName(newAppScreenHeaderText),
android: androidWidget('TextView', 'text', newAppScreenHeaderText),
}),
// Methods to interact with the elements
scrollUntilNewAppHeaderComponentIsDisplayed: async function (
this: NewAppComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(this.newAppScreenElement);
},
checkNewAppHeaderIsDisplayed: async function (
this: NewAppComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.newAppHeaderScreenElement);
},
};
@@ -1,80 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSName,
} from '../../helpers/utils';
type PressableComponentScreenType = {
pressableScreenElement: string,
pressMeHeaderElement: string,
btnPressMeElement: string,
onPressText: string,
checkPressMeHeaderIsDisplayed: () => Promise<boolean>,
checkOnPressIsDisplayed: () => Promise<boolean>,
scrollUntilPressableComponentIsDisplayed: () => Promise<void>,
clickPressMeButton: () => Promise<void>,
getOnPressText: () => Promise<string>,
};
const pressMeHeaderText = 'Change content based on Press';
export const PressableComponentScreen: PressableComponentScreenType = {
// reference in the Components list
pressableScreenElement: Utils.platformSelect({
ios: iOSName('Pressable'),
android: androidWidget('TextView', 'text', 'Pressable'),
}),
// References to elements within the Pressable Component screen
pressMeHeaderElement: Utils.platformSelect({
ios: iOSName(pressMeHeaderText),
android: androidWidget('TextView', 'text', pressMeHeaderText),
}),
btnPressMeElement: Utils.platformSelect({
ios: iOSName('one_press_me_button'),
android: androidWidget('TextView', 'resource-id', 'one_press_me_button'),
}),
onPressText: Utils.platformSelect({
ios: iOSName('pressable_press_console'),
android: androidWidget(
'TextView',
'resource-id',
'pressable_press_console',
),
}),
// Methods to interact with the elements
checkPressMeHeaderIsDisplayed: async function (
this: PressableComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.pressMeHeaderElement);
},
checkOnPressIsDisplayed: async function (
this: PressableComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.onPressText);
},
scrollUntilPressableComponentIsDisplayed: async function (
this: PressableComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(this.pressableScreenElement);
},
clickPressMeButton: async function (
this: PressableComponentScreenType,
): Promise<void> {
await Utils.clickElement(this.btnPressMeElement);
},
getOnPressText: async function (
this: PressableComponentScreenType,
): Promise<string> {
return await Utils.getElementText(this.onPressText);
},
};
@@ -1,47 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSName,
} from '../../helpers/utils';
type RefreshControlComponentScreenType = {
refreshControlScreenElement: string,
initialRowScreenElement: string,
checkInitialRowIsDisplayed: () => Promise<boolean>,
scrollUntilRefreshControlComponentIsDisplayed: () => Promise<void>,
};
export const RefreshControlComponentScreen: RefreshControlComponentScreenType =
{
// reference in the Components list
refreshControlScreenElement: Utils.platformSelect({
ios: iOSName('RefreshControl'),
android: androidWidget('TextView', 'text', 'RefreshControl'),
}),
// References to elements within the RefreshControl Component screen
initialRowScreenElement: Utils.platformSelect({
ios: iOSName('refresh_control_row'),
android: androidWidget('TextView', 'resource-id', 'refresh_control_row'),
}),
// Methods to interact with the elements
checkInitialRowIsDisplayed: async function (
this: RefreshControlComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(this.initialRowScreenElement);
},
scrollUntilRefreshControlComponentIsDisplayed: async function (
this: RefreshControlComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(this.refreshControlScreenElement);
},
};
@@ -1,51 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
import {
UtilsSingleton as Utils,
androidWidget,
iOSName,
} from '../../helpers/utils';
type ScrollViewSimpleExampleComponentScreenType = {
scrollViewSimpleExampleScreenElement: string,
scrollViewItemScreenElement: string,
checkScrollViewItemsDisplayed: () => Promise<boolean>,
scrollUntilScrollViewSimpleExampleComponentIsDisplayed: () => Promise<void>,
};
export const ScrollViewSimpleExampleComponentScreen: ScrollViewSimpleExampleComponentScreenType =
{
// reference in the Components list
scrollViewSimpleExampleScreenElement: Utils.platformSelect({
ios: iOSName('ScrollViewSimpleExample'),
android: androidWidget('TextView', 'text', 'ScrollViewSimpleExample'),
}),
// References to elements within the ScrollViewSimpleExample Component screen
scrollViewItemScreenElement: Utils.platformSelect({
ios: iOSName('scroll_view_item'),
android: androidWidget('TextView', 'resource-id', 'scroll_view_item'),
}),
// Methods to interact with the elements
checkScrollViewItemsDisplayed: async function (
this: ScrollViewSimpleExampleComponentScreenType,
): Promise<boolean> {
return await Utils.checkElementExistence(
this.scrollViewItemScreenElement,
);
},
scrollUntilScrollViewSimpleExampleComponentIsDisplayed: async function (
this: ScrollViewSimpleExampleComponentScreenType,
): Promise<void> {
return await Utils.scrollToElement(
this.scrollViewSimpleExampleScreenElement,
);
},
};
@@ -1,26 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
ActivityIndicatorComponentScreen,
} = require('../../screens/components/activityIndicatorComponent.screen.js');
describe('Test is checking default activity indicator component', () => {
test('Should view properly default progress bar', async () => {
expect(
await ComponentsScreen.checkActivityIndicatorComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickActivityIndicatorComponent();
expect(
await ActivityIndicatorComponentScreen.checkDefaultActivityIndicatorIsDisplayed(),
).toBeTruthy();
});
});
@@ -1,46 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
ButtonComponentScreen,
} = require('../../screens/components/buttonComponent.screen.js');
// fixed variables
const submitText = 'Your application has been submitted!';
const cancelText = 'Your application has been cancelled!';
describe('Test is checking submit button', () => {
test('Should view properly submit alert text', async () => {
expect(
await ComponentsScreen.checkButtonComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickButtonComponent();
await ButtonComponentScreen.clickSubmitApplication();
expect(await ButtonComponentScreen.getSubmitAlertText()).toContain(
submitText,
);
await ButtonComponentScreen.clickOkButton();
});
});
describe('Test is checking cancel button', () => {
test('Should view properly submit cancel text', async () => {
expect(
await ComponentsScreen.checkButtonComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickButtonComponent();
await ButtonComponentScreen.clickCancelApplication();
expect(await ButtonComponentScreen.getCancelAlertText()).toContain(
cancelText,
);
await ButtonComponentScreen.clickOkButton();
});
});
@@ -1,187 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
FlatListComponentScreen,
} = require('../../screens/components/flatListComponent.screen.js');
describe('Test is checking basic flat list', () => {
test('Should view properly search bar of basic flat list', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
expect(
await FlatListComponentScreen.checkFlatListBasicScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListBasicButton();
expect(
await FlatListComponentScreen.checkSearchBarIsDisplayed(),
).toBeTruthy();
});
});
describe('Test is checking onStartReached flat list', () => {
test('Should view properly first element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
expect(
await FlatListComponentScreen.checkFlatListOnStartReachedScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListOnStartButton();
expect(
await FlatListComponentScreen.checkCollapseButtonIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListOnStartTestButton();
expect(await FlatListComponentScreen.checkPizzaIsDisplayed()).toBeTruthy();
});
});
describe('Test is checking onEndReached flat list', () => {
test('Should view properly the last element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
expect(
await FlatListComponentScreen.checkFlatListOnEndReachedScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListOnEndButton();
expect(
await FlatListComponentScreen.checkCollapseButtonIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListOnStartTestButton();
expect(
await FlatListComponentScreen.checkIceCreamIsDisplayed(),
).toBeTruthy();
});
});
describe('Test is checking content inset flat list', () => {
test('Should view properly the menu element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
expect(
await FlatListComponentScreen.checkFlatListContentInsetScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListContentInsetButton();
expect(
await FlatListComponentScreen.checkCollapseButtonIsDisplayed(),
).toBeTruthy();
expect(
await FlatListComponentScreen.checkContentInsetMenuIsDisplayed(),
).toBeTruthy();
});
});
describe('Test is checking inverted flat list', () => {
test('Should view properly the menu element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
await FlatListComponentScreen.scrollUntilOnViewableItemsChangedIsDisplayed();
expect(
await FlatListComponentScreen.checkFlatListInvertedScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListInvertedButton();
expect(await FlatListComponentScreen.checkPizzaIsDisplayed()).toBeTruthy();
await FlatListComponentScreen.clickToggleTrueButton();
expect(await FlatListComponentScreen.checkPizzaIsDisplayed()).toBeTruthy();
});
});
describe('Test is checking onViewableItemsChanges component', () => {
test('Should view properly the pizza element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
await FlatListComponentScreen.scrollUntilOnViewableItemsChangedIsDisplayed();
expect(
await FlatListComponentScreen.checkFlatListOnViewableItemsChangedScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListOnViewableItemsChangedButton();
expect(await FlatListComponentScreen.checkPizzaIsDisplayed()).toBeTruthy();
});
});
describe('Test is checking FlatList with Separators component', () => {
test('Should view properly the separator element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
await FlatListComponentScreen.scrollUntilNestedIsDisplayed();
expect(
await FlatListComponentScreen.checkFlatListWithSeparatorsScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListWithSeparatorsButton();
expect(
await FlatListComponentScreen.checkSeparatorIsDisplayed(),
).toBeTruthy();
});
});
describe('Test is checking multicolumn component', () => {
test('Should view properly the list header element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
await FlatListComponentScreen.scrollUntilNestedIsDisplayed();
expect(
await FlatListComponentScreen.checkFlatListMultiColumnScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListMultiColumnButton();
expect(
await FlatListComponentScreen.checkListHeaderIsDisplayed(),
).toBeTruthy();
});
});
describe('Test is checking sticky headers component', () => {
test('Should view properly the sticky pizza element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
await FlatListComponentScreen.scrollUntilNestedIsDisplayed();
expect(
await FlatListComponentScreen.checkFlatListStickyHeadersScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListStickyHeadersButton();
expect(
await FlatListComponentScreen.checkStickyPizzaIsDisplayed(),
).toBeTruthy();
});
});
describe('Test is checking nested component', () => {
test('Should view properly the nested header element', async () => {
expect(
await ComponentsScreen.checkFlatListComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickFlatListComponent();
await FlatListComponentScreen.scrollUntilNestedIsDisplayed();
expect(
await FlatListComponentScreen.checkFlatListNestedScreenIsDisplayed(),
).toBeTruthy();
await FlatListComponentScreen.clickFlatListNestedButton();
expect(
await FlatListComponentScreen.checkNestedHeaderIsDisplayed(),
).toBeTruthy();
});
});
@@ -1,33 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
JSResponderHandlerComponentScreen,
} = require('../../screens/components/jsResponderHandlerComponent.screen.js');
// fixed variables
const roweZeroText = 'I am row 0';
describe('Test is checking row zero JSResponderHandler component', () => {
test('Should view properly row zero element', async () => {
await JSResponderHandlerComponentScreen.scrollUntilJSResponderHandlerComponentIsDisplayed();
expect(
await ComponentsScreen.checkJSResponderHandlerComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickJSResponderHandlerComponent();
expect(
await JSResponderHandlerComponentScreen.checkRowZeroLabelIsDisplayed(),
).toBeTruthy();
expect(await JSResponderHandlerComponentScreen.getRowZeroText()).toContain(
roweZeroText,
);
});
});
@@ -1,39 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
KeyboardAvoidingViewComponentScreen,
} = require('../../screens/components/keyboardAvoidingViewComponent.screen.js');
// fixed variables
const registerText = 'Successfully Registered!';
describe('Test is checking keyboardAvoidingView component', () => {
test('Should view properly successfully registered text', async () => {
await KeyboardAvoidingViewComponentScreen.scrollUntilKeyboardAvoidingViewComponentIsDisplayed();
expect(
await ComponentsScreen.checkKeyboardAvoidingViewComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickKeyboardAvoidingViewComponent();
expect(
await KeyboardAvoidingViewComponentScreen.checkBtnDifferentBehaviorsOpenExampleIsDisplayed(),
).toBeTruthy();
await KeyboardAvoidingViewComponentScreen.clickDifferentBehaviorsOpenExampleButton();
expect(
await KeyboardAvoidingViewComponentScreen.checkBtnRegisterIsDisplayed(),
).toBeTruthy();
await KeyboardAvoidingViewComponentScreen.clickRegisterButton();
expect(
await KeyboardAvoidingViewComponentScreen.getRegisterAlertText(),
).toContain(registerText);
await KeyboardAvoidingViewComponentScreen.clickOkButton();
});
});
@@ -1,31 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
ModalComponentScreen,
} = require('../../screens/components/modalComponent.screen.js');
describe('Test is checking modal component', () => {
test('Should view show modal element', async () => {
await ModalComponentScreen.scrollUntilModalComponentIsDisplayed();
expect(
await ComponentsScreen.checkModalComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickModalComponent();
expect(await ModalComponentScreen.checkShowModalIsDisplayed()).toBeTruthy();
await ModalComponentScreen.clickShowModalButton();
expect(
await ModalComponentScreen.checkModalAnimationTypeIsDisplayed(),
).toBeTruthy();
await ModalComponentScreen.clickCloseButton();
expect(await ModalComponentScreen.checkShowModalIsDisplayed()).toBeTruthy();
});
});
@@ -1,27 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
NewAppComponentScreen,
} = require('../../screens/components/newAppComponent.screen.js');
describe('Test is checking new app screen component', () => {
test('Should view new app header element', async () => {
await NewAppComponentScreen.scrollUntilNewAppHeaderComponentIsDisplayed();
expect(
await ComponentsScreen.checkNewAppScreenComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickNewAppScreenComponent();
expect(
await NewAppComponentScreen.checkNewAppHeaderIsDisplayed(),
).toBeTruthy();
});
});
@@ -1,37 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
PressableComponentScreen,
} = require('../../screens/components/pressableComponent.screen.js');
// fixed variables
const onPressText = 'onPress';
describe('Test is checking pressable component', () => {
test('Should view onPress text', async () => {
await PressableComponentScreen.scrollUntilPressableComponentIsDisplayed();
expect(
await ComponentsScreen.checkPressableComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickPressableComponent();
expect(
await PressableComponentScreen.checkPressMeHeaderIsDisplayed(),
).toBeTruthy();
await PressableComponentScreen.clickPressMeButton();
expect(
await PressableComponentScreen.checkOnPressIsDisplayed(),
).toBeTruthy();
expect(await PressableComponentScreen.getOnPressText()).toContain(
onPressText,
);
});
});
@@ -1,27 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
RefreshControlComponentScreen,
} = require('../../screens/components/refreshControlComponent.screen.js');
describe('Test is checking RefreshControl component', () => {
test('Should view initial row element', async () => {
await RefreshControlComponentScreen.scrollUntilRefreshControlComponentIsDisplayed();
expect(
await ComponentsScreen.checkRefreshControlComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickRefreshControlComponent();
expect(
await RefreshControlComponentScreen.checkInitialRowIsDisplayed(),
).toBeTruthy();
});
});
@@ -1,27 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
const {ComponentsScreen} = require('../../screens/components.screen.js');
const {
ScrollViewSimpleExampleComponentScreen,
} = require('../../screens/components/scrollViewSimpleExampleComponent.screen.js');
describe('Test is checking ScrollVIewSimpleExample component', () => {
test('Should view scroll view item element', async () => {
await ScrollViewSimpleExampleComponentScreen.scrollUntilScrollViewSimpleExampleComponentIsDisplayed();
expect(
await ComponentsScreen.checkScrollViewSimpleExampleComponentIsDisplayed(),
).toBeTruthy();
await ComponentsScreen.clickScrollViewSimpleExampleComponent();
expect(
await ScrollViewSimpleExampleComponentScreen.checkScrollViewItemsDisplayed(),
).toBeTruthy();
});
});
-155
View File
@@ -1,155 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
// Used in run-ci-e2e-test.js and executed in Circle CI.
//
// E2e test that verifies that init app can be installed, compiled, started and
// Hot Module reloading and Chrome debugging work.
//
// For other examples of appium refer to:
// https://github.com/appium/sample-code/tree/master/sample-code/examples/node and
// https://www.npmjs.com/package/wd-android
//
// To set up:
// - npm install --save-dev appium@1.11.1 mocha@2.4.5 wd@1.11.1 colors@1.0.3 pretty-data2@0.40.1
// - cp <this file> <to app installation path>
// - keytool -genkey -v -keystore android/app/debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=Android Debug,O=Android,C=US"
//
// To run this test:
// - npm start
// - node node_modules/.bin/appium
// - (cd android && ./gradlew :app:copyDownloadableDepsToLibs)
// - react-native run-android
// - node ../node_modules/.bin/_mocha ../android-e2e-test.js
/* eslint-env mocha */
'use strict';
const fs = require('fs');
const path = require('path');
const pd = require('pretty-data2').pd;
const wd = require('wd');
// value in ms to print out screen contents, set this value in CI to debug if tests are failing
const appiumDebugInterval = process.env.APPIUM_DEBUG_INTERVAL;
describe('Android Test App', function () {
this.timeout(600000);
let driver;
let debugIntervalId;
before(function () {
driver = wd.promiseChainRemote({
host: 'localhost',
port: 4723,
});
driver.on('status', function (info) {
console.log(info.cyan);
});
driver.on('command', function (method, command, data) {
if (command === 'source()' && data) {
console.log(
' > ' + method.yellow,
'Screen contents'.grey,
'\n',
pd.xml(data).yellow,
);
} else {
console.log(' > ' + method.yellow, command.grey, data || '');
}
});
driver.on('http', function (method, urlPath, data) {
console.log(' > ' + method.magenta, urlPath, (data || '').grey);
});
// every interval print what is on the screen
if (appiumDebugInterval) {
debugIntervalId = setInterval(() => {
// it driver.on('command') will log the screen contents
driver.source();
}, appiumDebugInterval);
}
const desired = {
platformName: 'Android',
deviceName: 'Android Emulator',
app: path.resolve('android/app/build/outputs/apk/debug/app-debug.apk'),
};
// React Native in dev mode often starts with Red Box "Can't fibd variable __fbBatchedBridge..."
// This is fixed by clicking Reload JS which will trigger a request to Metro
return driver
.init(desired)
.setImplicitWaitTimeout(5000)
.waitForElementByXPath('//android.widget.Button[@text="Reload JS"]')
.then(
elem => {
elem.click();
driver.sleep(2000);
},
// eslint-disable-next-line handle-callback-err
err => {
// ignoring if Reload JS button can't be located
},
);
});
after(function () {
if (debugIntervalId) {
clearInterval(debugIntervalId);
}
return driver.quit();
});
it('should display new content after a refresh', function () {
const androidAppCode = fs.readFileSync('App.js', 'utf-8');
let intervalToUpdate;
return (
driver
.waitForElementByXPath(
'//android.widget.TextView[starts-with(@text, "Welcome to React")]',
)
.then(() => {
fs.writeFileSync(
'App.js',
androidAppCode.replace('Step One', 'Step 1'),
'utf-8',
);
})
.sleep(1000)
// http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_MENU
.pressDeviceKey(46)
.pressDeviceKey(46)
.sleep(2000)
.waitForElementByXPath(
'//android.widget.TextView[starts-with(@text, "Step 1")]',
)
.finally(() => {
clearInterval(intervalToUpdate);
fs.writeFileSync('App.js', androidAppCode, 'utf-8');
driver.pressDeviceKey(46).pressDeviceKey(46).sleep(2000);
})
);
});
it('should have the menu available', function () {
return (
driver
.waitForElementByXPath(
'//android.widget.TextView[starts-with(@text, "Welcome to React")]',
)
// http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_MENU
.pressDeviceKey(82)
.waitForElementByXPath(
'//android.widget.TextView[starts-with(@text, "Toggle Inspector")]',
)
);
});
});
@@ -1,11 +0,0 @@
#!/bin/bash
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# This script checks if Appium server is running on default port (which is 4723).
if ! nc -z 127.0.0.1 4723; then
echo Could not find Appium server.
exit 1
fi
-328
View File
@@ -1,328 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
* @oncall react_native
*/
'use strict';
/**
* This script tests that React Native end to end installation/bootstrap works for different platforms
* Available arguments:
* --ios - 'react-native init' and check iOS app doesn't redbox
* --android - 'react-native init' and check Android app doesn't redbox
* --js - 'react-native init' and only check the packager returns a bundle
* --skip-cli-install - to skip react-native-cli global installation (for local debugging)
* --retries [num] - how many times to retry possible flaky commands: yarn add and running tests, default 1
*/
const {REACT_NATIVE_PACKAGE_DIR, REPO_ROOT, SCRIPTS_DIR} = require('../consts');
const {getPackages} = require('../utils/monorepo');
const tryExecNTimes = require('./utils/try-n-times');
const {setupVerdaccio} = require('./utils/verdaccio');
const {execFileSync, spawn} = require('child_process');
const fs = require('fs');
const path = require('path');
const {cd, cp, echo, exec, exit, mv} = require('shelljs');
const argv = require('yargs').argv;
const REACT_NATIVE_TEMP_DIR = exec(
'mktemp -d /tmp/react-native-XXXXXXXX',
).stdout.trim();
const REACT_NATIVE_APP_DIR = `${REACT_NATIVE_TEMP_DIR}/template`;
// $FlowFixMe[incompatible-type]
const numberOfRetries /*: number */ = argv.retries || 1;
let SERVER_PID;
let APPIUM_PID;
let VERDACCIO_PID;
let exitCode;
function describe(message /*: string */) {
echo(`\n\n>>>>> ${message}\n\n\n`);
}
async function main() {
try {
if (argv.android) {
describe('Compile Android binaries');
if (
exec(
'./gradlew publishAllToMavenTempLocal -Pjobs=1 -Dorg.gradle.jvmargs="-Xmx512m -XX:+HeapDumpOnOutOfMemoryError"',
).code
) {
throw new Error('Failed to compile Android binaries');
}
}
describe('Create react-native package');
if (
exec(
'node ./scripts/releases/set-rn-version.js --to-version 1000.0.0 --build-type dry-run',
).code
) {
throw new Error(
'Failed to set version and update package.json ready for release',
);
}
if (exec('npm pack', {cwd: REACT_NATIVE_PACKAGE_DIR}).code) {
throw new Error('Failed to pack react-native');
}
const REACT_NATIVE_PACKAGE = path.join(
REACT_NATIVE_PACKAGE_DIR,
'react-native-*.tgz',
);
describe('Set up Verdaccio');
VERDACCIO_PID = setupVerdaccio();
describe('Build and publish packages');
exec('node ./scripts/build/build.js', {cwd: REPO_ROOT});
const packages = await getPackages({
includeReactNative: false,
includePrivate: false,
});
for (const {path: packageAbsolutePath} of Object.values(packages)) {
exec(
'npm publish --registry http://localhost:4873 --yes --access public',
{cwd: packageAbsolutePath},
);
}
describe('Scaffold a basic React Native app from template');
execFileSync('rsync', [
'-a',
`${REPO_ROOT}/packages/react-native/template`,
REACT_NATIVE_TEMP_DIR,
]);
cd(REACT_NATIVE_APP_DIR);
mv('_bundle', '.bundle');
mv('_eslintrc.js', '.eslintrc.js');
mv('_prettierrc.js', '.prettierrc.js');
mv('_watchmanconfig', '.watchmanconfig');
fs.writeFileSync('.npmrc', 'registry=http://localhost:4873');
describe('Install React Native package');
exec(`npm install ${REACT_NATIVE_PACKAGE}`);
describe('Install node_modules');
if (
tryExecNTimes(
() => {
return exec('npm install').code;
},
numberOfRetries,
() => exec('sleep 10s'),
)
) {
throw new Error(
'Failed to execute npm install. Most common reason is npm registry connectivity, try again',
);
}
exec('rm -rf ./node_modules/react-native/template');
if (argv.android) {
describe('Install end-to-end framework');
if (
tryExecNTimes(
() =>
exec(
'yarn add --dev appium@1.11.1 mocha@2.4.5 wd@1.11.1 colors@1.0.3 pretty-data2@0.40.1',
{silent: true},
).code,
numberOfRetries,
)
) {
throw new Error(
'Failed to install appium. Most common reason is npm registry connectivity, try again.',
);
}
cp(`${SCRIPTS_DIR}/android-e2e-test.js`, 'android-e2e-test.js');
cd('android');
describe('Download Maven deps');
exec('./gradlew :app:copyDownloadableDepsToLibs');
cd('..');
describe('Generate key');
exec('rm android/app/debug.keystore');
if (
exec(
'keytool -genkey -v -keystore android/app/debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname "CN=Android Debug,O=Android,C=US"',
).code
) {
throw new Error('Key could not be generated');
}
// $FlowFixMe[incompatible-type]
describe(`Start appium server, ${APPIUM_PID}`);
const appiumProcess = spawn('node', ['./node_modules/.bin/appium']);
APPIUM_PID = appiumProcess.pid;
describe('Build the app');
if (exec('react-native run-android').code) {
throw new Error('Could not execute react-native run-android');
}
// $FlowFixMe[incompatible-type]
describe(`Start Metro, ${SERVER_PID}`);
// shelljs exec('', {async: true}) does not emit stdout events, so we rely on good old spawn
const packagerProcess = spawn('yarn', ['start', '--max-workers 1']);
SERVER_PID = packagerProcess.pid;
// wait a bit to allow packager to startup
exec('sleep 15s');
describe('Test: Android end-to-end test');
if (
tryExecNTimes(
() => {
return exec('node node_modules/.bin/_mocha android-e2e-test.js')
.code;
},
numberOfRetries,
() => exec('sleep 10s'),
)
) {
throw new Error(
'Failed to run Android end-to-end tests. Most likely the code is broken.',
);
}
}
if (argv.ios) {
cd('ios');
// shelljs exec('', {async: true}) does not emit stdout events, so we rely on good old spawn
const packagerEnv = Object.create(process.env);
// $FlowFixMe[prop-missing]
packagerEnv.REACT_NATIVE_MAX_WORKERS = 1;
describe('Start Metro');
const packagerProcess = spawn('yarn', ['start'], {
stdio: 'inherit',
env: packagerEnv,
});
SERVER_PID = packagerProcess.pid;
exec('sleep 15s');
// prepare cache to reduce chances of possible red screen "Can't find variable __fbBatchedBridge..."
exec(
'response=$(curl --write-out %{http_code} --silent --output /dev/null localhost:8081/index.bundle?platform=ios&dev=true)',
);
echo(`Metro is running, ${SERVER_PID}`);
describe('Install CocoaPod dependencies');
exec('bundle exec pod install');
describe('Test: iOS end-to-end test');
if (
// TODO: Get target OS and simulator from .tests.env
tryExecNTimes(
() => {
return exec(
[
'xcodebuild',
'-workspace',
'"HelloWorld.xcworkspace"',
'-destination',
'"platform=iOS Simulator,name=iPhone 8,OS=13.3"',
'-scheme',
'"HelloWorld"',
'-sdk',
'iphonesimulator',
'-UseModernBuildSystem=NO',
'test',
].join(' ') +
' | ' +
[
'xcbeautify',
'--report',
'junit',
'--reportPath',
'"~/react-native/reports/junit/iOS-e2e/results.xml"',
].join(' ') +
' && exit ${PIPESTATUS[0]}',
).code;
},
numberOfRetries,
() => exec('sleep 10s'),
)
) {
throw new Error(
'Failed to run iOS end-to-end tests. Most likely the code is broken.',
);
}
cd('..');
}
if (argv.js) {
// Check the packager produces a bundle (doesn't throw an error)
describe('Test: Verify packager can generate an Android bundle');
if (
exec(
'yarn react-native bundle --verbose --entry-file index.js --platform android --dev true --bundle-output android-bundle.js --max-workers 1',
).code
) {
throw new Error('Could not build Android bundle');
}
describe('Test: Verify packager can generate an iOS bundle');
if (
exec(
'yarn react-native bundle --entry-file index.js --platform ios --dev true --bundle-output ios-bundle.js --max-workers 1',
).code
) {
throw new Error('Could not build iOS bundle');
}
describe('Test: TypeScript typechecking');
if (exec('yarn tsc').code) {
throw new Error('Typechecking errors were found');
}
describe('Test: Jest tests');
if (exec('yarn test').code) {
throw new Error('Jest tests failed');
}
// TODO: ESLint infinitely hangs when running in the environment created by
// this script, but not projects generated by `react-native init`.
/*
describe('Test: ESLint/Prettier linting and formatting');
if (exec('yarn lint').code) {
echo('linting errors were found');
exitCode = 1;
throw Error(exitCode);
}*/
}
exitCode = 0;
} finally {
describe('Clean up');
if (SERVER_PID) {
echo(`Killing packager ${SERVER_PID}`);
exec(`kill -9 ${SERVER_PID}`);
// this is quite drastic but packager starts a daemon that we can't kill by killing the parent process
// it will be fixed in April (quote David Aurelio), so until then we will kill the zombie by the port number
exec("lsof -i tcp:8081 | awk 'NR!=1 {print $2}' | xargs kill");
}
if (APPIUM_PID) {
echo(`Killing appium ${APPIUM_PID}`);
exec(`kill -9 ${APPIUM_PID}`);
}
if (VERDACCIO_PID) {
echo(`Killing verdaccio ${VERDACCIO_PID}`);
exec(`kill -9 ${VERDACCIO_PID}`);
}
}
exit(exitCode);
}
if (require.main === module) {
// eslint-disable-next-line no-void
void main();
}
+22 -565
View File
@@ -2874,11 +2874,6 @@
resolved "https://registry.yarnpkg.com/@tsconfig/node18/-/node18-1.0.1.tgz#ea5b375a9ead6b09ccbd70c3894ea069829ea1bb"
integrity sha512-sNFeK6X2ATlhlvzyH4kKYQlfHXE2f2/wxtB9ClvYXevWpmwkUT7VaSrjIN9E76Qebz8qP5JOJJ9jD3QoD/Z9TA==
"@types/aria-query@^5.0.0":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc"
integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==
"@types/babel__core@^7.1.14":
version "7.1.19"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460"
@@ -2940,14 +2935,6 @@
"@types/jsonfile" "*"
"@types/node" "*"
"@types/glob@^8.1.0":
version "8.1.0"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc"
integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==
dependencies:
"@types/minimatch" "^5.1.2"
"@types/node" "*"
"@types/graceful-fs@^4.1.3":
version "4.1.5"
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
@@ -3024,11 +3011,6 @@
resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a"
integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==
"@types/minimatch@^5.1.2":
version "5.1.2"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
"@types/node-forge@^1.3.0":
version "1.3.8"
resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.8.tgz#044ad98354ff309a031a55a40ad122f3be1ac2bb"
@@ -3036,7 +3018,7 @@
dependencies:
"@types/node" "*"
"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^18.0.0":
"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0":
version "18.16.14"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.14.tgz#ab67bb907f1146afc6fedb9ce60ae8a99c989631"
integrity sha512-+ImzUB3mw2c5ISJUq0punjDilUQ5GnUim0ZRvchHIWJmOC0G+p0kzhXBqj6cDjK0QdPFwzrHWgrJp3RPvCG5qg==
@@ -3092,16 +3074,6 @@
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
"@types/ua-parser-js@^0.7.33":
version "0.7.36"
resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz#9bd0b47f26b5a3151be21ba4ce9f5fa457c5f190"
integrity sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==
"@types/which@^1.3.2":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf"
integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==
"@types/yargs-parser@*":
version "15.0.0"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
@@ -3128,13 +3100,6 @@
dependencies:
"@types/yargs-parser" "*"
"@types/yauzl@^2.9.1":
version "2.10.0"
resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599"
integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@^5.30.0":
version "5.59.5"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz#f156827610a3f8cefc56baeaa93cd4a5f32966b4"
@@ -3356,57 +3321,6 @@
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
"@wdio/config@7.31.1":
version "7.31.1"
resolved "https://registry.yarnpkg.com/@wdio/config/-/config-7.31.1.tgz#53550a164c970403628525ecdc5e0c3f96a0ff30"
integrity sha512-WAfswbCatwiaDVqy6kfF/5T8/WS/US/SRhBGUFrfBuGMIe+RRoHgy7jURFWSvUIE7CNHj8yvs46fLUcxhXjzcQ==
dependencies:
"@types/glob" "^8.1.0"
"@wdio/logger" "7.26.0"
"@wdio/types" "7.30.2"
"@wdio/utils" "7.30.2"
deepmerge "^4.0.0"
glob "^8.0.3"
"@wdio/logger@7.26.0":
version "7.26.0"
resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-7.26.0.tgz#2c105a00f63a81d52de969fef5a54a9035146b2d"
integrity sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==
dependencies:
chalk "^4.0.0"
loglevel "^1.6.0"
loglevel-plugin-prefix "^0.8.4"
strip-ansi "^6.0.0"
"@wdio/protocols@7.27.0":
version "7.27.0"
resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-7.27.0.tgz#8e2663ec877dce7a5f76b021209c18dd0132e853"
integrity sha512-hT/U22R5i3HhwPjkaKAG0yd59eaOaZB0eibRj2+esCImkb5Y6rg8FirrlYRxIGFVBl0+xZV0jKHzR5+o097nvg==
"@wdio/repl@7.30.2":
version "7.30.2"
resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-7.30.2.tgz#a92592078cb892d5bd14c2b300ef01ae6c8baf90"
integrity sha512-aW4nuMI+gbRmxmL4jMarBjuiQ+cFscr/8jHDt5hGx/gc/f7ifrZa4t6M5H8vFIKsvjUwl9lZRiVO4NVvvp6+cg==
dependencies:
"@wdio/utils" "7.30.2"
"@wdio/types@7.30.2":
version "7.30.2"
resolved "https://registry.yarnpkg.com/@wdio/types/-/types-7.30.2.tgz#0baa4b8249aa1d98a545144e6fb494f1b186b24f"
integrity sha512-uZ8o7FX8RyBsaXiOWa59UKTCHTtADNvOArYTcHNEIzt+rh4JdB/uwqfc8y4TCNA2kYm7PWaQpUFwpStLeg0H1Q==
dependencies:
"@types/node" "^18.0.0"
got "^11.8.1"
"@wdio/utils@7.30.2":
version "7.30.2"
resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-7.30.2.tgz#d4642c3b8333f3f2ae9d46229098c0a77c3f887b"
integrity sha512-np7I+smszFUennbQKdzbMN/zUL3s3EZq9pCCUcTRjjs9TE4tnn0wfmGdoz2o7REYu6kn9NfFFJyVIM2VtBbKEA==
dependencies:
"@wdio/logger" "7.26.0"
"@wdio/types" "7.30.2"
p-iteration "^1.1.8"
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
@@ -3556,35 +3470,6 @@ aproba@^1.0.3:
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
archiver-utils@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2"
integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
dependencies:
glob "^7.1.4"
graceful-fs "^4.2.0"
lazystream "^1.0.0"
lodash.defaults "^4.2.0"
lodash.difference "^4.5.0"
lodash.flatten "^4.4.0"
lodash.isplainobject "^4.0.6"
lodash.union "^4.6.0"
normalize-path "^3.0.0"
readable-stream "^2.0.0"
archiver@^5.0.0:
version "5.3.1"
resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6"
integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==
dependencies:
archiver-utils "^2.1.0"
async "^3.2.3"
buffer-crc32 "^0.2.1"
readable-stream "^3.6.0"
readdir-glob "^1.0.0"
tar-stream "^2.2.0"
zip-stream "^4.1.0"
are-we-there-yet@~1.1.2:
version "1.1.7"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
@@ -3613,13 +3498,6 @@ aria-query@^4.2.2:
"@babel/runtime" "^7.10.2"
"@babel/runtime-corejs3" "^7.10.2"
aria-query@^5.2.1:
version "5.3.0"
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
dependencies:
dequal "^2.0.3"
array-includes@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb"
@@ -3995,11 +3873,6 @@ bser@^2.0.0:
dependencies:
node-int64 "^0.4.0"
buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
@@ -4010,7 +3883,7 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
buffer@^5.2.1, buffer@^5.5.0:
buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -4168,17 +4041,12 @@ chokidar@^3.4.0:
optionalDependencies:
fsevents "~2.3.2"
chownr@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
chrome-launcher@^0.15.0, chrome-launcher@^0.15.2:
chrome-launcher@^0.15.2:
version "0.15.2"
resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.2.tgz#4e6404e32200095fdce7f6a1e1004f9bd36fa5da"
integrity sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==
@@ -4395,16 +4263,6 @@ commondir@^1.0.1:
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
compress-commons@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d"
integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==
dependencies:
buffer-crc32 "^0.2.13"
crc32-stream "^4.0.2"
normalize-path "^3.0.0"
readable-stream "^3.6.0"
compressible@~2.0.14:
version "2.0.15"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212"
@@ -4504,26 +4362,6 @@ cosmiconfig@^5.0.5, cosmiconfig@^5.1.0:
js-yaml "^3.13.0"
parse-json "^4.0.0"
crc-32@^1.2.0:
version "1.2.2"
resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
crc32-stream@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007"
integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==
dependencies:
crc-32 "^1.2.0"
readable-stream "^3.4.0"
cross-fetch@3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
dependencies:
node-fetch "2.6.7"
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -4533,16 +4371,6 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
css-shorthand-properties@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz#1c808e63553c283f289f2dd56fcee8f3337bd935"
integrity sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==
css-value@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/css-value/-/css-value-0.0.1.tgz#5efd6c2eea5ea1fd6b6ac57ec0427b18452424ea"
integrity sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==
csstype@^3.0.2:
version "3.1.1"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
@@ -4620,20 +4448,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.9:
dependencies:
ms "2.0.0"
debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
debug@4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
dependencies:
ms "2.1.2"
decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -4661,7 +4482,7 @@ deep-is@^0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
deepmerge@^4.0.0, deepmerge@^4.2.2, deepmerge@^4.3.0:
deepmerge@^4.2.2, deepmerge@^4.3.0:
version "4.3.1"
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
@@ -4711,11 +4532,6 @@ deprecation@^2.0.0, deprecation@^2.3.1:
resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
dequal@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
destroy@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
@@ -4731,40 +4547,6 @@ devtools-protocol@0.0.1107588:
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz#f8cac707840b97cc30b029359341bcbbb0ad8ffa"
integrity sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==
devtools-protocol@0.0.948846:
version "0.0.948846"
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.948846.tgz#bff47e2d1dba060130fa40ed2e5f78b916ba285f"
integrity sha512-5fGyt9xmMqUl2VI7+rnUkKCiAQIpLns8sfQtTENy5L70ktbNw0Z3TFJ1JoFNYdx/jffz4YXU45VF75wKZD7sZQ==
devtools-protocol@0.0.981744:
version "0.0.981744"
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.981744.tgz#9960da0370284577d46c28979a0b32651022bacf"
integrity sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==
devtools-protocol@^0.0.1161029:
version "0.0.1161029"
resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1161029.tgz#ec118810acf81100101f5fdabde042121c362940"
integrity sha512-kEUDtYEhgfepFC1T5a4F7XD6FzALn6bQa8Lkp7tM2vWXQG0LwXQ/MPS7BwmgW4bW3QGNci+G/mW4grFltFFtZA==
devtools@7.32.0:
version "7.32.0"
resolved "https://registry.yarnpkg.com/devtools/-/devtools-7.32.0.tgz#681ec21298eb6020e367bcaac0003a4294ec8c93"
integrity sha512-rf1OYJXCCSfhuQ+nosDb9o86/R4OJWBuBNd44PPGSBV0TCmLSrmf3PlqLEJ7/EbawkuOLWSQcX7EwIB/ABHFXg==
dependencies:
"@types/node" "^18.0.0"
"@types/ua-parser-js" "^0.7.33"
"@wdio/config" "7.31.1"
"@wdio/logger" "7.26.0"
"@wdio/protocols" "7.27.0"
"@wdio/types" "7.30.2"
"@wdio/utils" "7.30.2"
chrome-launcher "^0.15.0"
edge-paths "^2.1.0"
puppeteer-core "13.1.3"
query-selector-shadow-dom "^1.0.0"
ua-parser-js "^1.0.1"
uuid "^9.0.0"
diff-sequences@^29.4.3:
version "29.4.3"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2"
@@ -4816,14 +4598,6 @@ ecdsa-sig-formatter@1.0.11:
dependencies:
safe-buffer "^5.0.1"
edge-paths@^2.1.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/edge-paths/-/edge-paths-2.2.1.tgz#d2d91513225c06514aeac9843bfce546abbf4391"
integrity sha512-AI5fC7dfDmCdKo3m5y7PkYE8m6bMqR6pvVpgtrZkkhcJXFLelUgkjrhk3kXXx8Kbw2cRaTT4LkOR7hqf39KJdw==
dependencies:
"@types/which" "^1.3.2"
which "^2.0.2"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -5299,17 +5073,6 @@ external-editor@^3.0.3:
iconv-lite "^0.4.24"
tmp "^0.0.33"
extract-zip@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
dependencies:
debug "^4.1.1"
get-stream "^5.1.0"
yauzl "^2.10.0"
optionalDependencies:
"@types/yauzl" "^2.9.1"
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -5320,11 +5083,6 @@ extsprintf@^1.2.0:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
fast-deep-equal@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -5407,13 +5165,6 @@ fb-watchman@^2.0.0:
dependencies:
bser "^2.0.0"
fd-slicer@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
dependencies:
pend "~1.2.0"
figures@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
@@ -5598,15 +5349,6 @@ fs-exists-sync@^0.1.0:
resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
integrity sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==
fs-extra@^11.1.1:
version "11.1.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d"
integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
fs-extra@^11.2.0:
version "11.2.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
@@ -5796,17 +5538,6 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^8.0.3:
version "8.1.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^5.0.1"
once "^1.3.0"
globals@^11.1.0:
version "11.8.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d"
@@ -5831,7 +5562,7 @@ globby@^11.1.0:
merge2 "^1.4.1"
slash "^3.0.0"
got@^11.0.2, got@^11.1.4, got@^11.8.1:
got@^11.1.4:
version "11.8.6"
resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
@@ -5853,7 +5584,7 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6,
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
grapheme-splitter@^1.0.2, grapheme-splitter@^1.0.4:
grapheme-splitter@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
@@ -6063,15 +5794,7 @@ http2-wrapper@^1.0.0-beta.5.2:
quick-lru "^5.1.1"
resolve-alpn "^1.0.0"
https-proxy-agent@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
dependencies:
agent-base "6"
debug "4"
https-proxy-agent@5.0.1, https-proxy-agent@^5.0.1:
https-proxy-agent@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
@@ -7175,11 +6898,6 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
ky@0.30.0:
version "0.30.0"
resolved "https://registry.yarnpkg.com/ky/-/ky-0.30.0.tgz#a3d293e4f6c4604a9a4694eceb6ce30e73d27d64"
integrity sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==
language-subtag-registry@~0.3.2:
version "0.3.21"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a"
@@ -7192,13 +6910,6 @@ language-tags@^1.0.5:
dependencies:
language-subtag-registry "~0.3.2"
lazystream@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638"
integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==
dependencies:
readable-stream "^2.0.5"
leven@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
@@ -7276,36 +6987,16 @@ lodash.camelcase@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
lodash.clonedeep@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==
lodash.difference@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==
lodash.find@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1"
integrity sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==
lodash.flatten@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
lodash.includes@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
@@ -7316,11 +7007,6 @@ lodash.isobject@^3.0.2:
resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d"
integrity sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==
lodash.isplainobject@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
lodash.keys@^4.0.8:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205"
@@ -7336,7 +7022,7 @@ lodash.memoize@^4.1.2:
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
lodash.merge@^4.6.1, lodash.merge@^4.6.2:
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
@@ -7346,16 +7032,6 @@ lodash.throttle@^4.1.1:
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
lodash.union@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
lodash.zip@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020"
integrity sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==
lodash@^4.17.11, lodash@^4.17.19, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -7389,16 +7065,6 @@ logkitty@^0.7.1:
dayjs "^1.8.15"
yargs "^15.1.0"
loglevel-plugin-prefix@^0.8.4:
version "0.8.4"
resolved "https://registry.yarnpkg.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644"
integrity sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==
loglevel@^1.6.0:
version "1.8.1"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4"
integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==
long@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
@@ -7748,20 +7414,6 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatc
dependencies:
brace-expansion "^1.1.7"
minimatch@^5.0.1, minimatch@^5.1.0:
version "5.1.6"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
dependencies:
brace-expansion "^2.0.1"
minimatch@^6.0.4:
version "6.2.0"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42"
integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==
dependencies:
brace-expansion "^2.0.1"
minimist@^1.2.0, minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
@@ -7782,11 +7434,6 @@ minizlib@^2.1.1:
minipass "^3.0.0"
yallist "^4.0.0"
mkdirp-classic@^0.5.2:
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
"mkdirp@>=0.5 0", mkdirp@^0.5.1:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
@@ -8109,11 +7756,6 @@ p-cancelable@^2.0.0:
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
p-iteration@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/p-iteration/-/p-iteration-1.1.8.tgz#14df726d55af368beba81bcc92a26bb1b48e714a"
integrity sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==
p-limit@^2.0.0, p-limit@^2.1.0, p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
@@ -8255,11 +7897,6 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -8290,13 +7927,6 @@ pirates@^4.0.1, pirates@^4.0.4, pirates@^4.0.5:
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
pkg-dir@4.2.0, pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
dependencies:
find-up "^4.0.0"
pkg-dir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
@@ -8304,6 +7934,13 @@ pkg-dir@^3.0.0:
dependencies:
find-up "^3.0.0"
pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
dependencies:
find-up "^4.0.0"
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -8381,11 +8018,6 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
progress@2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
promise@^8.3.0:
version "8.3.0"
resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a"
@@ -8447,11 +8079,6 @@ protobufjs@^7.0.0:
"@types/node" ">=13.7.0"
long "^5.0.0"
proxy-from-env@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@@ -8470,42 +8097,6 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
puppeteer-core@13.1.3:
version "13.1.3"
resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-13.1.3.tgz#cecb9e2ffff77410e4aa6428a1a2185ef4c6c01c"
integrity sha512-96pzvVBzq5lUGt3L/QrIH3mxn3NfZylHeusNhq06xBAHPI0Upc0SC/9u7tXjL0oRnmcExeVRJivr1lj7Ah/yDQ==
dependencies:
debug "4.3.2"
devtools-protocol "0.0.948846"
extract-zip "2.0.1"
https-proxy-agent "5.0.0"
node-fetch "2.6.7"
pkg-dir "4.2.0"
progress "2.0.3"
proxy-from-env "1.1.0"
rimraf "3.0.2"
tar-fs "2.1.1"
unbzip2-stream "1.4.3"
ws "8.2.3"
puppeteer-core@^13.1.3:
version "13.7.0"
resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-13.7.0.tgz#3344bee3994163f49120a55ddcd144a40575ba5b"
integrity sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==
dependencies:
cross-fetch "3.1.5"
debug "4.3.4"
devtools-protocol "0.0.981744"
extract-zip "2.0.1"
https-proxy-agent "5.0.1"
pkg-dir "4.2.0"
progress "2.0.3"
proxy-from-env "1.1.0"
rimraf "3.0.2"
tar-fs "2.1.1"
unbzip2-stream "1.4.3"
ws "8.5.0"
pure-rand@^6.0.0:
version "6.0.2"
resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306"
@@ -8516,11 +8107,6 @@ qs@~6.5.2:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
query-selector-shadow-dom@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz#1c7b0058eff4881ac44f45d8f84ede32e9a2f349"
integrity sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==
query-string@^6.12.1:
version "6.14.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a"
@@ -8589,7 +8175,7 @@ react@19.0.0-rc-fb9a90fa48-20240614:
resolved "https://registry.yarnpkg.com/react/-/react-19.0.0-rc-fb9a90fa48-20240614.tgz#90eb43a0b005e8cc3cbf0d801c14816d01df1b08"
integrity sha512-nvE3Gy+IOIfH/DXhkyxFVQSrITarFcQz4+shzC/McxQXEUSonpw2oDy/Wi9hdDtV3hlP12VYuDL95iiBREedNQ==
readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@~2.3.6:
readable-stream@^2.0.6, readable-stream@~2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
@@ -8602,7 +8188,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6, readable
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -8611,13 +8197,6 @@ readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readdir-glob@^1.0.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584"
integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==
dependencies:
minimatch "^5.1.0"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@@ -8811,13 +8390,6 @@ responselike@^2.0.0:
dependencies:
lowercase-keys "^2.0.0"
resq@^1.9.1:
version "1.11.0"
resolved "https://registry.yarnpkg.com/resq/-/resq-1.11.0.tgz#edec8c58be9af800fd628118c0ca8815283de196"
integrity sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==
dependencies:
fast-deep-equal "^2.0.1"
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
@@ -8849,11 +8421,6 @@ rfdc@^1.3.1:
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
rgb2hex@0.2.5:
version "0.2.5"
resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.2.5.tgz#f82230cd3ab1364fa73c99be3a691ed688f8dbdc"
integrity sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==
rimraf@2:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -8861,7 +8428,7 @@ rimraf@2:
dependencies:
glob "^7.1.3"
rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2:
rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -8998,13 +8565,6 @@ serialize-error@^2.1.0:
resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a"
integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=
serialize-error@^8.0.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67"
integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==
dependencies:
type-fest "^0.20.2"
serve-static@^1.13.1:
version "1.15.0"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
@@ -9435,17 +8995,7 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
tar-fs@2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"
pump "^3.0.0"
tar-stream "^2.1.4"
tar-stream@^2.1.4, tar-stream@^2.2.0:
tar-stream@^2.1.4:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
@@ -9512,7 +9062,7 @@ through2@^2.0.1:
readable-stream "~2.3.6"
xtend "~4.0.1"
through@^2.3.6, through@^2.3.8:
through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
@@ -9673,11 +9223,6 @@ typescript@5.3.2:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43"
integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==
ua-parser-js@^1.0.1:
version "1.0.35"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011"
integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==
unbox-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
@@ -9688,14 +9233,6 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
unbzip2-stream@1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
dependencies:
buffer "^5.2.1"
through "^2.3.8"
undici@^5.27.2:
version "5.27.2"
resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411"
@@ -9784,11 +9321,6 @@ uuid@^3.3.2, uuid@^3.3.3:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
uuid@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
v8-to-istanbul@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4"
@@ -9851,54 +9383,6 @@ wcwidth@^1.0.1:
dependencies:
defaults "^1.0.3"
webdriver@7.31.1:
version "7.31.1"
resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-7.31.1.tgz#2dafdef92b59dc6456023ac92a9707d7331ecdb6"
integrity sha512-nCdJLxRnYvOMFqTEX7sqQtF/hV/Jgov0Y6ICeOm1DMTlZSRRDaUsBMlEAPkEwif9uBJYdM0znv8qzfX358AGqQ==
dependencies:
"@types/node" "^18.0.0"
"@wdio/config" "7.31.1"
"@wdio/logger" "7.26.0"
"@wdio/protocols" "7.27.0"
"@wdio/types" "7.30.2"
"@wdio/utils" "7.30.2"
got "^11.0.2"
ky "0.30.0"
lodash.merge "^4.6.1"
webdriverio@^7.32.0:
version "7.32.0"
resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-7.32.0.tgz#e40e9c1596c36ad0d7e06e50c5d5a9efa7782798"
integrity sha512-bW0JLNx+WbZO/6K52AfJwE9vh+2JAfdgov9JIt2ySrXkRdvFb7TO7dvEE44GP8GP2ppVfzOcr4XzXAxlGyX6ig==
dependencies:
"@types/aria-query" "^5.0.0"
"@types/node" "^18.0.0"
"@wdio/config" "7.31.1"
"@wdio/logger" "7.26.0"
"@wdio/protocols" "7.27.0"
"@wdio/repl" "7.30.2"
"@wdio/types" "7.30.2"
"@wdio/utils" "7.30.2"
archiver "^5.0.0"
aria-query "^5.2.1"
css-shorthand-properties "^1.1.1"
css-value "^0.0.1"
devtools "7.32.0"
devtools-protocol "^0.0.1161029"
fs-extra "^11.1.1"
grapheme-splitter "^1.0.2"
lodash.clonedeep "^4.5.0"
lodash.isobject "^3.0.2"
lodash.isplainobject "^4.0.6"
lodash.zip "^4.2.0"
minimatch "^6.0.4"
puppeteer-core "^13.1.3"
query-selector-shadow-dom "^1.0.0"
resq "^1.9.1"
rgb2hex "0.2.5"
serialize-error "^8.0.0"
webdriver "7.31.1"
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
@@ -9947,7 +9431,7 @@ which-module@^2.0.0:
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
which@^2.0.1, which@^2.0.2:
which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
@@ -10010,16 +9494,6 @@ write-file-atomic@^4.0.2:
imurmurhash "^0.1.4"
signal-exit "^3.0.7"
ws@8.2.3:
version "8.2.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
ws@8.5.0:
version "8.5.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
ws@>=7.4.6:
version "8.13.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
@@ -10143,24 +9617,7 @@ yargs@^17.3.1, yargs@^17.6.2:
y18n "^5.0.5"
yargs-parser "^21.1.1"
yauzl@^2.10.0:
version "2.10.0"
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
dependencies:
buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0"
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
zip-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79"
integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==
dependencies:
archiver-utils "^2.1.0"
compress-commons "^4.1.0"
readable-stream "^3.6.0"