mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
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:
committed by
Facebook GitHub Bot
parent
cdab5370af
commit
a272e8ee66
@@ -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.
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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/)'],
|
||||
|
||||
@@ -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 +0,0 @@
|
||||
Put the *.app and *.apk files here.
|
||||
@@ -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'],
|
||||
};
|
||||
@@ -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;
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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};
|
||||
@@ -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);
|
||||
},
|
||||
};
|
||||
-105
@@ -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);
|
||||
},
|
||||
};
|
||||
-51
@@ -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,
|
||||
);
|
||||
},
|
||||
};
|
||||
-26
@@ -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();
|
||||
});
|
||||
});
|
||||
-33
@@ -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,
|
||||
);
|
||||
});
|
||||
});
|
||||
-39
@@ -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();
|
||||
});
|
||||
});
|
||||
-27
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user