From fc7fc9af08f44f9c1c5b55ccea0337051d520162 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Mon, 1 Jan 2024 10:00:03 +0100 Subject: [PATCH 01/18] chore: update docs --- README.md | 51 ++++++++---- docs/ANDROID_IOS_SETUP.md | 59 ------------- docs/APPIUM.md | 96 ---------------------- docs/assets/select-avd.jpg | Bin 177191 -> 0 bytes docs/assets/simualtor-app.jpg | Bin 4286 -> 0 bytes docs/assets/start-android-avd-manager.jpg | Bin 84982 -> 0 bytes docs/assets/start-simulator.jpg | Bin 44297 -> 0 bytes docs/assets/xcode-components.jpg | Bin 44209 -> 0 bytes docs/assets/xcode-preferences-popup.jpg | Bin 29737 -> 0 bytes docs/assets/xcode-preferences.jpg | Bin 11382 -> 0 bytes 10 files changed, 34 insertions(+), 172 deletions(-) delete mode 100644 docs/ANDROID_IOS_SETUP.md delete mode 100644 docs/APPIUM.md delete mode 100644 docs/assets/select-avd.jpg delete mode 100644 docs/assets/simualtor-app.jpg delete mode 100644 docs/assets/start-android-avd-manager.jpg delete mode 100644 docs/assets/start-simulator.jpg delete mode 100644 docs/assets/xcode-components.jpg delete mode 100644 docs/assets/xcode-preferences-popup.jpg delete mode 100644 docs/assets/xcode-preferences.jpg diff --git a/README.md b/README.md index 64c6ed77..67e3c8cc 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,10 @@ Boilerplate project to run Appium tests together with WebdriverIO for: - iOS/Android Hybrid Apps - Android Chrome and iOS Safari browser ([check here](./README.md#automating-chrome-or-safari)) +> [!IMPORTANT] > This boilerplate uses the WebdriverIO native demo app which can be found [here](https://github.com/webdriverio/native-demo-app). -> **Note:** + +> [!NOTE] > This boilerplate only handles local execution on 1 em/simulator at a time, not parallel execution. For more info about that Google on setting up a grid with Appium. ## Based on @@ -24,19 +26,38 @@ This boilerplate is currently based on: ## Installation -1. Running `git clone https://github.com/webdriverio/appium-boilerplate.git` -1. Running `npm install` -1. Installing Appium on a local machine [here](./docs/APPIUM.md) -1. Setting up Android and iOS on a local machine [here](./docs/ANDROID_IOS_SETUP.md) -1. Making demo app available. Create a `./apps` directory. Download the app files (.app / .apk) with version >= `0.4.0` [here](https://github.com/webdriverio/native-demo-app/releases). Move the files into the directory `apps`. -1. Running tests `npm run android.app` or `npm run android.browser` +1. Clone this project by running + +```sh +git clone https://github.com/webdriverio/appium-boilerplate.git +``` + +2. Install all dependencies + +```sh +npm install +``` + +> [!TIP] +> Use the [appium-installer](https://github.com/AppiumTestDistribution/appium-installer) package to setup Appium on your local machine. This will also help you configure Android Emulators/ iOS Simulators. + +> [!NOTE] +> When running test in a cloud + +3. Create a `./apps` directory at the root of this project. Download the app files (`.zip` / `.apk`) with version >= `1.0.0`, which can be found [here](https://github.com/webdriverio/native-demo-app/releases), into the `./apps` folder. + +4. Running tests locally + - **Android App:** `npm run android.app` + - **Android Browser:** `npm run android.browser` + - **iOS App:** `npm run ios.app` + - **iOS Browser:** `npm run ios.browser` ## How to implement in your project Choose one of the following options: 1. Clone the git repo — `git clone https://github.com/webdriverio/appium-boilerplate.git` -1. Then copy the files to your project directory (all files in `/tests` and the `wdio.conf` files in the `config` folder) +1. Copy the files to your project directory (all files in `/tests` and the `wdio.conf` files in the `config` folder) 1. Merge project dev dependencies with your project dev dependencies in your `package.json` 1. Merge the scripts to your `package.json` scripts 1. Run the tests, see [Native App Tests](#native-app-tests) or [Automating Chrome of Safari](#automating-chrome-or-safari). @@ -72,10 +93,8 @@ const SELECTORS = { }; ``` -> **NOTE:** If you look into the screen/page-objects you might see that a lot of selectors are made private, meaning you can use the -> elements in the spec-file itself. This has been done on purpose because one of the *best practices* is to remove all interactions from -> your spec files and implement the interactions in the page objects. This will make it easier to maintain for the future and easier to -> refactor if new interaction methods will be added or names will be adjusted. +> [!NOTE] +> If you look into the screen/page-objects you might see that a lot of selectors are made private, meaning you can use the elements in the spec-file itself. This has been done on purpose because one of the *best practices* is to remove all interactions from your spec files and implement the interactions in the page objects. This will make it easier to maintain for the future and easier to refactor if new interaction methods will be added or names will be adjusted. ## Native App Tests @@ -164,12 +183,10 @@ There are 2 types of navigation tests explained in this boilerplate. The most interesting test here will be the [Deep Links](./tests/specs/app.deep.link.navigation.spec.ts) because this might speed up your tests if your app supports Deep Links. Check the code and the `openDeepLinkUrl()` method in the [`Utils.ts`](./tests/helpers/Utils.ts)-file to see how this works. -> **PRO TIP:** If you are automating iOS apps and you can use Deep Links, then you might want to try adding the capability -> `autoAcceptAlerts:true` when you start the iOS device. This capability will automatically accept all alerts, also the alert that will -> appear when you want to open your deep link in Safari. +> [!TIP]] +> If you are automating iOS apps and you can use Deep Links, then you might want to try adding the capability `autoAcceptAlerts:true` when you start the iOS device. This capability will automatically accept all alerts, also the alert that will appear when you want to open your deep link in Safari. > -> If you ware going to use this capability, then don't forget to remove the last few lines in the -> [`openDeepLinkUrl()`](./tests/helpers/Utils.ts)-method, see the comments in the method +> If you ware going to use this capability, then don't forget to remove the last few lines in the [`openDeepLinkUrl()`](./tests/helpers/Utils.ts)-method, see the comments in the method You can run the single test with the following commands diff --git a/docs/ANDROID_IOS_SETUP.md b/docs/ANDROID_IOS_SETUP.md deleted file mode 100644 index accce2ab..00000000 --- a/docs/ANDROID_IOS_SETUP.md +++ /dev/null @@ -1,59 +0,0 @@ -# Setting up Android and iOS on a local machine - -## Android -To use this boilerplate on a local machine for Android, emulator(s) need to be available. To setup your local machine you should download Android Studio, see for instructions [here](https://developer.android.com/studio/). - -Follow the instructions to download and setup Android studio and configure a your emulators with [this](https://developer.android.com/studio/run/managing-avds) tutorial. - -Please use Google to find the correct instructions to setup your environment (Windows / Mac / Linux). - -### Start the emulator -If you were able to create emulators you can use the following options to start the emulators - -- From Android Studio itself through: - - Open `Tools > AVD Manager` - - ![Start Android AVD Manager](./assets/start-android-avd-manager.jpg) - - - Select your emulator and click on the `play`-button - - ![Select emulator](./assets/select-avd.jpg) - -- From the command line with the default Android commands, see [this](https://developer.android.com/studio/run/emulator-commandline) link -- Use a module called `start-android-emulator` which can be found [here](https://github.com/wswebcreation/start-android-emulator) - -> It is advised to keep an emulator open and start tests against an already opened emulator to speed up tests. Starting an emulator manually/by Appium is time consuming and will slow down the test execution. - -## iOS -Make sure you have a Mac, if you don't have a Mac then buy/get one, otherwise it will not work (no legal way to use iOS on Windows/Linux). - -To be able to configure iOS simulators you need to download Xcode on your machine, check [this](https://developer.apple.com/xcode/) on how to install it. - -### iOS versions -After installation you'll get the latest supported iOS version already installed. At the moment of writing this was `iOS 12.0`. If you want an older version of iOS please download them manually by doing the following: - -1. Open Xcode (you don't need to start a project, having the project selector open is sufficient) -1. Go to Xcode preferences like below - - ![Xcode preferences](./assets/xcode-preferences.jpg) - -1. A pop-up will appear like below - - ![Xcode preferences pop-up](./assets/xcode-preferences-popup.jpg) - -1. Go to `Components` and download the needed versions like below - - ![Xcode components](./assets/xcode-components.jpg) - -### Start a simulator -You can use the following options to manually start a simulator: - -- Through the Simulator app, find it on Mac and add it to your dock like below - - ![Simulator App](./assets/simualtor-app.jpg) - - ![Simulator start](./assets/start-simulator.jpg) - -- Use a module called `start-ios-simulator` which can be found [here](https://github.com/wswebcreation/start-ios-simulator). With this module you can easily use your terminal to select your simulator - -> It is advised to keep a simulator open and start tests against an already opened simulator to speed up tests. Starting a simulator manually/by Appium is time consuming and will slow down the test execution. diff --git a/docs/APPIUM.md b/docs/APPIUM.md deleted file mode 100644 index 12039229..00000000 --- a/docs/APPIUM.md +++ /dev/null @@ -1,96 +0,0 @@ -# Installing Appium on a local machine - -> There are several documents and instructions on the internet to install Appium on your local machine. This is just one of the many ;-) - -To setup the local test environment the following needs to be installed: - -- [appium-doctor](https://github.com/appium/appium-doctor) with `npm install appium-doctor -g` -- [Appium](https://github.com/appium/appium) with `npm install appium -g` -- [appium-desktop](https://github.com/appium/appium-desktop). This one needs to be downloaded from [here](https://github.com/appium/appium-desktop/releases) and pick the latest stable releases -- [appium-inspector](https://github.com/appium/appium-inspector). Used to be part of appium-desktop, now needs to be installed separately. Can be downloaded from [here](https://github.com/appium/appium-inspector/releases) and pick the latest stable release - -## Setup a local machine - -### Appium Doctor -appium-doctor is used to diagnose and fix common Node, iOS and Android configuration issues before starting Appium. You only run it once to check your local machine. See an example output below. - -```bash -appium-doctor - -info AppiumDoctor Appium Doctor v.1.4.3 -info AppiumDoctor ### Diagnostic starting ### -info AppiumDoctor ✔ The Node.js binary was found at: /Users/wswebcreation/.nvm/versions/node/v8.9.1/bin/node -info AppiumDoctor ✔ Node version is 8.9.1 -info AppiumDoctor ✔ Xcode is installed at: /Applications/Xcode.app/Contents/Developer -info AppiumDoctor ✔ Xcode Command Line Tools are installed. -info AppiumDoctor ✔ DevToolsSecurity is enabled. -info AppiumDoctor ✔ The Authorization DB is set up properly. -info AppiumDoctor ✔ Carthage was found at: /usr/local/bin/carthage -info AppiumDoctor ✔ HOME is set to: /Users/wswebcreation -info AppiumDoctor ✔ ANDROID_HOME is set to: /Users/wswebcreation/Library/Android/sdk -info AppiumDoctor ✔ JAVA_HOME is set to: /Library/Java/JavaVirtualMachines/jdk1.8.0_152.jdk/Contents/Home -info AppiumDoctor ✔ adb exists at: /Users/wswebcreation/Library/Android/sdk/platform-tools/adb -info AppiumDoctor ✔ android exists at: /Users/wswebcreation/Library/Android/sdk/tools/android -info AppiumDoctor ✔ emulator exists at: /Users/wswebcreation/Library/Android/sdk/tools/emulator -info AppiumDoctor ✔ Bin directory of $JAVA_HOME is set -info AppiumDoctor ### Diagnostic completed, no fix needed. ### -info AppiumDoctor -info AppiumDoctor Everything looks good, bye! -info AppiumDoctor -``` - -When appium-doctor can, it will fix the problems for you, otherwise fix them manually. If you have some ENV issues make sure you have set them like this - -```bash -export ANDROID_HOME=/Users/wswebcreation/Library/Android/sdk -export JAVA_HOME=$(/usr/libexec/java_home) -export PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools/adb:$ANDROID_HOME/build-tools:$JAVA_HOME/bin -# This one is used for the `start.android.emulator` script -export emulator=/Users/wswebcreation/Library/Android/sdk/emulator -``` - -### Appium -If the npm install was successful you should be able to run this command `appium -v` and see a version like below. - -```bash -➜ appium -v -1.9.0 -➜ -``` - -> Always make sure to check the Appium site if there is a new version. New Appium version are released mostly when Android/iOS release new versions. Bugfixes can also be released. Just check the [changelog](https://github.com/appium/appium/blob/master/CHANGELOG.md) for a clear overview - -## Appium desktop -Appium Desktop is an open source app which gives us the ability of the Appium automation server in a UI. It is a combination of a few Appium-related tools: - -- A graphical interface for the Appium Server. You can set options, start/stop the server, see logs, etc... -- An Inspector (installed separately) that you can use to look at your app's elements, get basic information about them, and perform basic interactions with them. This is useful as a way to learn about Appium or as a way to learn about your app so you can write tests for it. - -This tool is mainly used to view the UI-hierarchy and locate elements to be sure that all elements can be found. - -See the [readme](https://github.com/appium/appium-desktop) about how to use the Appium Desktop. - -When Appium Destkop is started make sure the _Automatic Server_-tab is enabled. Use the following settings for Android (also check [here](../config/wdio.android.app.conf.ts)) - -```js -{ - "app": "/Users/wswebcreation/git/appium-boilerplate/apps/Android-NativeDemoApp-0.2.0.apk", - "platformName": "Android", - "deviceName": "Pixel XL", - "platformVersion": "7.1.1", - "noReset": true, - "automationName": "UiAutomator2" -} -``` - -And the following settings for iOS (also check [here](../config/wdio.ios.app.conf.ts)) - -```js -{ - "platformName": "iOS", - "appium:app": "/Users/wswebcreation/git/appium-boilerplate/apps/iOS-NativeDemoApp-0.2.0.zip", - "appium:deviceName": "iPhone 6", - "appium:platformVersion": "11.1", - "appium:noReset": true -} -``` diff --git a/docs/assets/select-avd.jpg b/docs/assets/select-avd.jpg deleted file mode 100644 index a1d928ccabe5d55995233b90f7d0556b3c0ed410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177191 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 S2;d0d2;d0(e*_43+x`Gq1M@Th diff --git a/docs/assets/simualtor-app.jpg b/docs/assets/simualtor-app.jpg deleted file mode 100644 index 137bc8f1bf5aba8364ec7c956b8b16e3c664d28e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 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 iEnG4Bc;C|+5;ceb diff --git a/docs/assets/start-android-avd-manager.jpg b/docs/assets/start-android-avd-manager.jpg deleted file mode 100644 index c535937722ca394aa8d2f459a55c209b40945949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84982 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 O0>|Y|CxXDw%>M)Yvpr=1 diff --git a/docs/assets/start-simulator.jpg b/docs/assets/start-simulator.jpg deleted file mode 100644 index 9afd0ff6cb70b40830805f669e8fcc66ad034642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44297 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 z 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 a@*gQ&K4&5MuTwmKcFO4gb3CPA?*9WV<`0Sh diff --git a/docs/assets/xcode-components.jpg b/docs/assets/xcode-components.jpg deleted file mode 100644 index fbe8d4bdf2c9063b9e9804c554e3d8c56887790d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44209 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 diff --git a/docs/assets/xcode-preferences.jpg b/docs/assets/xcode-preferences.jpg deleted file mode 100644 index 5f46c8cc0e8514d15fde476085bebec3dc47e042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11382 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 Date: Mon, 1 Jan 2024 20:31:06 +0100 Subject: [PATCH 02/18] feat: update deps --- package-lock.json | 2822 ++++++++++----------------------------------- package.json | 26 +- 2 files changed, 614 insertions(+), 2234 deletions(-) diff --git a/package-lock.json b/package-lock.json index 733b9bc4..dd7567b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,19 +9,19 @@ "version": "5.3.1", "license": "MIT", "devDependencies": { - "@typescript-eslint/eslint-plugin": "^6.14.0", - "@typescript-eslint/parser": "^6.14.0", - "@wdio/appium-service": "^8.26.1", - "@wdio/browserstack-service": "^8.26.1", - "@wdio/cli": "^8.26.1", - "@wdio/globals": "^8.26.1", - "@wdio/local-runner": "^8.26.1", - "@wdio/mocha-framework": "^8.24.12", - "@wdio/sauce-service": "^8.26.1", - "@wdio/spec-reporter": "^8.24.12", - "@wdio/testingbot-service": "^8.26.1", - "appium": "^2.2.3", - "appium-uiautomator2-driver": "^2.34.2", + "@typescript-eslint/eslint-plugin": "^6.16.0", + "@typescript-eslint/parser": "^6.16.0", + "@wdio/appium-service": "^8.27.0", + "@wdio/browserstack-service": "^8.27.1", + "@wdio/cli": "^8.27.1", + "@wdio/globals": "^8.27.0", + "@wdio/local-runner": "^8.27.0", + "@wdio/mocha-framework": "^8.27.0", + "@wdio/sauce-service": "^8.27.0", + "@wdio/spec-reporter": "^8.27.0", + "@wdio/testingbot-service": "^8.27.0", + "appium": "^2.3.0", + "appium-uiautomator2-driver": "^2.37.0", "appium-xcuitest-driver": "^5.12.2", "eslint-plugin-wdio": "^8.24.12", "ts-node": "^10.9.2", @@ -42,13 +42,13 @@ } }, "node_modules/@appium/base-driver": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.4.3.tgz", - "integrity": "sha512-+aDcXzo23Nfm0WdBwD9hGMmo3PSVwPuTEXIMHeoFk2RjHCqy0cSTJ+WIzQV5NOQG7gYEWQlz9p5y8gCo8QkqSw==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.4.4.tgz", + "integrity": "sha512-oxtXbFWMQVg8Y+lpdv0oL/G4C5TO3Ns7MDL/di2O//GcOMINCq+LJHvpvO2EX3HpLUX35yOu+3TUKQigPWwbQw==", "dev": true, "dependencies": { - "@appium/support": "^4.1.10", - "@appium/types": "^0.14.3", + "@appium/support": "^4.1.11", + "@appium/types": "^0.15.0", "@colors/colors": "1.6.0", "@types/async-lock": "1.4.2", "@types/bluebird": "3.5.42", @@ -65,13 +65,13 @@ "express": "4.18.2", "http-status-codes": "2.3.0", "lodash": "4.17.21", - "lru-cache": "10.0.1", + "lru-cache": "10.1.0", "method-override": "3.0.0", "morgan": "1.10.0", "path-to-regexp": "6.2.1", "serve-favicon": "2.5.0", "source-map-support": "0.5.21", - "type-fest": "3.13.1", + "type-fest": "4.8.3", "validate.js": "0.13.1" }, "engines": { @@ -88,35 +88,26 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/@appium/base-driver/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/@appium/base-driver/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@appium/base-plugin": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.24.tgz", - "integrity": "sha512-vBixpJAPP2MAsd9UVdGZgcyCi4j3xODEW68Ftcti99oq0Fi8HU4ysqr1YjFv1jOxwGVUxO76/Xjq0dqf1YSyjw==", + "version": "2.2.25", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.25.tgz", + "integrity": "sha512-bi2pM76ChfZ8fOG9OUOFovmPmMbUpUAETZar9/NHCOEHtUKV/5K1am/1hCrRmvkeB62UZah9jWSKv1kk61bLpA==", "dev": true, "dependencies": { - "@appium/base-driver": "^9.4.3", - "@appium/support": "^4.1.10" + "@appium/base-driver": "^9.4.4", + "@appium/support": "^4.1.11" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", @@ -124,21 +115,19 @@ } }, "node_modules/@appium/docutils": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-0.4.13.tgz", - "integrity": "sha512-tqguM5iuUzxob4ykBZBJgMycovga3ZZ9RQzqGrrrvtc5aiR83So9Fj7sz8qZhlyg4sWukl/j8t9UUM17yYrdgg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.1.tgz", + "integrity": "sha512-6G0WlosgQ3+S3WLc66GRVGkxeKpMmdmKIcBZTkPt73yNSV5Klu7FLUhEQAKP/hmVorEYs7GqtD6HH6KP7xkSAw==", "dev": true, "dependencies": { - "@appium/support": "^4.1.10", + "@appium/support": "^4.1.11", "@appium/tsconfig": "^0.x", - "@appium/typedoc-plugin-appium": "^0.x", "@sliphua/lilconfig-ts-loader": "3.2.2", - "@types/which": "3.0.1", + "@types/which": "3.0.3", "chalk": "4.1.2", "consola": "2.15.3", "diff": "5.1.0", "figures": "3.2.0", - "find-up": "5.0.0", "json5": "2.2.3", "lilconfig": "2.1.0", "lodash": "4.17.21", @@ -147,12 +136,9 @@ "read-pkg": "5.2.0", "semver": "7.5.4", "source-map-support": "0.5.21", - "teen_process": "2.0.101", - "type-fest": "3.13.1", - "typedoc": "0.23.28", - "typedoc-plugin-markdown": "3.14.0", - "typedoc-plugin-resolve-crossmodule-references": "0.3.3", - "typescript": "5.0.4", + "teen_process": "2.1.1", + "type-fest": "4.8.3", + "typescript": "5.2.2", "yaml": "2.3.4", "yargs": "17.7.2", "yargs-parser": "21.1.1" @@ -165,33 +151,10 @@ "npm": ">=8" } }, - "node_modules/@appium/docutils/node_modules/@appium/typedoc-plugin-appium": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@appium/typedoc-plugin-appium/-/typedoc-plugin-appium-0.6.6.tgz", - "integrity": "sha512-sZwhveCtUti2QPAhHWysE8IJVyT9KLUwLxXUBnvDjamEm8cuJmqQDDW9nPgv6iiw1bz9ankv/VLYI8egIpTl6g==", - "dev": true, - "dependencies": { - "handlebars": "4.7.8", - "lodash": "4.17.21", - "pluralize": "8.0.0", - "type-fest": "3.13.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - }, - "peerDependencies": { - "appium": "^2.0.0-beta.48", - "typedoc": "~0.23.14", - "typedoc-plugin-markdown": "3.14.0", - "typedoc-plugin-resolve-crossmodule-references": "~0.3.3", - "typescript": "^4.7.0 || ^5.0.0" - } - }, "node_modules/@appium/docutils/node_modules/@types/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.1.tgz", - "integrity": "sha512-OJWjr4k8gS1HXuOnCmQbBrQez+xqt/zqfp5PhgbKtsmEFEuojAg23arr+TiTZZ1TORdUF9RKXb/WKEpT1dwgSg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.3.tgz", + "integrity": "sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==", "dev": true }, "node_modules/@appium/docutils/node_modules/ansi-styles": { @@ -209,15 +172,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@appium/docutils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/@appium/docutils/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -294,21 +248,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/@appium/docutils/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@appium/docutils/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -385,74 +324,28 @@ } }, "node_modules/@appium/docutils/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@appium/docutils/node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/@appium/docutils/node_modules/typedoc-plugin-markdown": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.14.0.tgz", - "integrity": "sha512-UyQLkLRkfTFhLdhSf3RRpA3nNInGn+k6sll2vRXjflaMNwQAAiB61SYbisNZTg16t4K1dt1bPQMMGLrxS0GZ0Q==", - "dev": true, - "dependencies": { - "handlebars": "^4.7.7" - }, - "peerDependencies": { - "typedoc": ">=0.23.0" - } - }, - "node_modules/@appium/docutils/node_modules/typedoc-plugin-resolve-crossmodule-references": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/typedoc-plugin-resolve-crossmodule-references/-/typedoc-plugin-resolve-crossmodule-references-0.3.3.tgz", - "integrity": "sha512-ZWWBy2WR8z9a6iXYGlyB3KrpV+JDdZv1mndYU6Eh6mInrfMCrQJi3Y5K9ihMBfuaBGB//le1nEmQLgzU3IO+dw==", - "deprecated": "Upgrade to typedoc >= 0.24 and remove typedoc-plugin-resolve-crossmodule-references from your dependencies", - "dev": true, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "typedoc": ">=0.22 <=0.23" - } - }, "node_modules/@appium/docutils/node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/@appium/docutils/node_modules/yargs-parser": { @@ -465,9 +358,9 @@ } }, "node_modules/@appium/schema": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.4.2.tgz", - "integrity": "sha512-b2tC2sKAS8wnw8V7W7Rm6pXFt8QY4NTWvibprVYi1g8rZLnlmlIwUW0Gl6FhrWTUyK+u4rbF8vVIIBIU8C+i/g==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.5.0.tgz", + "integrity": "sha512-HFed9HtFU6+kLdVyp/xpS/Wfcge8PuMS37LJVShviT6OuzHOYvNFx1/y8+KMa/l0Npvll5eafdfHmUsWlRnUAA==", "dev": true, "dependencies": { "@types/json-schema": "7.0.15", @@ -480,13 +373,13 @@ } }, "node_modules/@appium/support": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.1.10.tgz", - "integrity": "sha512-zM2Rfw/Moqe3OeC4XiZIDi1kb93iE0nZc5NGybTkP+oWcxv/5UnpZ6MoYl5GH54gblEQHMi9My0dXzA8wYvtMA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.1.11.tgz", + "integrity": "sha512-d6Ujgn5IDlzmepI2i41Z3FexuhipZ2DE2omadNCJRMBlf0dd5cXW54WQjsS/5GI1S9c++/9Mk0aEHl/6RQcOpw==", "dev": true, "dependencies": { "@appium/tsconfig": "^0.x", - "@appium/types": "^0.14.3", + "@appium/types": "^0.15.0", "@colors/colors": "1.6.0", "@types/archiver": "6.0.2", "@types/base64-stream": "1.0.5", @@ -496,14 +389,14 @@ "@types/lockfile": "1.0.4", "@types/mv": "2.1.4", "@types/ncp": "2.0.8", - "@types/npmlog": "4.1.6", + "@types/npmlog": "7.0.0", "@types/pluralize": "0.0.33", "@types/semver": "7.5.6", "@types/shell-quote": "1.7.5", "@types/supports-color": "8.1.3", "@types/teen_process": "2.0.4", "@types/uuid": "9.0.7", - "@types/which": "3.0.1", + "@types/which": "3.0.3", "archiver": "6.0.1", "axios": "1.6.2", "base64-stream": "1.0.0", @@ -533,8 +426,8 @@ "shell-quote": "1.8.1", "source-map-support": "0.5.21", "supports-color": "8.1.1", - "teen_process": "2.0.101", - "type-fest": "3.13.1", + "teen_process": "2.1.1", + "type-fest": "4.8.3", "uuid": "9.0.1", "which": "4.0.0", "yauzl": "2.10.0" @@ -548,9 +441,9 @@ } }, "node_modules/@appium/support/node_modules/@types/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.1.tgz", - "integrity": "sha512-OJWjr4k8gS1HXuOnCmQbBrQez+xqt/zqfp5PhgbKtsmEFEuojAg23arr+TiTZZ1TORdUF9RKXb/WKEpT1dwgSg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.3.tgz", + "integrity": "sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==", "dev": true }, "node_modules/@appium/support/node_modules/bluebird": { @@ -662,12 +555,12 @@ } }, "node_modules/@appium/support/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -693,17 +586,17 @@ "dev": true }, "node_modules/@appium/types": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.14.3.tgz", - "integrity": "sha512-zW/fjn6HqvXLQVvWBX0qjYiWpfWKweXQQxUBO6egtiq77PRbDMkpeVAJIF8fvnng7XdaOo4OTdvADaZxpcgKCw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.15.0.tgz", + "integrity": "sha512-7Ht9ZdvcgBHc0ecttIlfFSMbVmKNL5YRX05BVCBakArWghN97xGRJ5VoUwgEeR8VE+iK0m+3R1p0/7HIxyqRJg==", "dev": true, "dependencies": { - "@appium/schema": "^0.4.2", + "@appium/schema": "^0.5.0", "@appium/tsconfig": "^0.x", "@types/express": "4.17.21", - "@types/npmlog": "4.1.6", + "@types/npmlog": "7.0.0", "@types/ws": "8.5.10", - "type-fest": "3.13.1" + "type-fest": "4.8.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", @@ -711,12 +604,12 @@ } }, "node_modules/@appium/types/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1281,16 +1174,16 @@ } }, "node_modules/@sidvind/better-ajv-errors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-2.1.0.tgz", - "integrity": "sha512-JuIb009FhHuL9priFBho2kv7QmZOydj0LgYvj+h1t0mMCmhM/YmQNRlJR5wVtBZya6wrVFK5Hi5TIbv5BKEx7w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-2.1.3.tgz", + "integrity": "sha512-lWuod/rh7Xz5uXiEGSfm2Sd5PG7K/6yJfoAZVqzsEswjPJhUz15R7Gn/o8RczA041QS15hBd/BCSeu9vwPArkA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.0", "chalk": "^4.1.0" }, "engines": { - "node": ">= 14.0.0" + "node": ">= 16.14" }, "peerDependencies": { "ajv": "4.11.8 - 8" @@ -1712,9 +1605,9 @@ "dev": true }, "node_modules/@types/npmlog": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.6.tgz", - "integrity": "sha512-0l3z16vnlJGl2Mi/rgJFrdwfLZ4jfNYgE6ZShEpjqhHuGTqdEzNles03NpYHwUMVYZa+Tj46UxKIEpE78lQ3DQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-7.0.0.tgz", + "integrity": "sha512-hJWbrKFvxKyWwSUXjZMYTINsSOY6IclhvGOZ97M8ac2tmR9hMwmTnYaMdpGhvju9ctWLTPhCS+eLfQNluiEjQQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -1727,9 +1620,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/@types/range-parser": { @@ -1878,16 +1771,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.14.0.tgz", - "integrity": "sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.16.0.tgz", + "integrity": "sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/type-utils": "6.14.0", - "@typescript-eslint/utils": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/type-utils": "6.16.0", + "@typescript-eslint/utils": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1913,15 +1806,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.14.0.tgz", - "integrity": "sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.16.0.tgz", + "integrity": "sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4" }, "engines": { @@ -1941,13 +1834,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.14.0.tgz", - "integrity": "sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz", + "integrity": "sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0" + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1958,13 +1851,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.14.0.tgz", - "integrity": "sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.16.0.tgz", + "integrity": "sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.14.0", - "@typescript-eslint/utils": "6.14.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/utils": "6.16.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1985,9 +1878,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.14.0.tgz", - "integrity": "sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.16.0.tgz", + "integrity": "sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1998,16 +1891,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.14.0.tgz", - "integrity": "sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz", + "integrity": "sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/visitor-keys": "6.14.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -2024,18 +1918,42 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.14.0.tgz", - "integrity": "sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.16.0.tgz", + "integrity": "sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.14.0", - "@typescript-eslint/types": "6.14.0", - "@typescript-eslint/typescript-estree": "6.14.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", "semver": "^7.5.4" }, "engines": { @@ -2050,12 +1968,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.14.0.tgz", - "integrity": "sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz", + "integrity": "sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.14.0", + "@typescript-eslint/types": "6.16.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2074,1403 +1992,280 @@ "peer": true }, "node_modules/@wdio/appium-service": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/appium-service/-/appium-service-8.26.2.tgz", - "integrity": "sha512-wbvnKJ2jOr7rQ2uRUwRn5g0TzkeH7N8kqhlE+3lWUbmGdwIhRC3QQW0akOscLIiZnq9525nI4s3yio8s6skOYA==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/appium-service/-/appium-service-8.27.0.tgz", + "integrity": "sha512-NEIp9sWV0GXUMjW9gDOlPGr9yy2j9KbcIiQRBQtNspmbnO3NLIsy9ag3D8m+0G8PrsIONGnuFaG/eN42bZk3Ig==", "dev": true, "dependencies": { - "@wdio/config": "8.26.2", + "@wdio/config": "8.27.0", "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", + "@wdio/types": "8.27.0", + "@wdio/utils": "8.27.0", "get-port": "^7.0.0", "import-meta-resolve": "^4.0.0", "param-case": "^3.0.4", - "webdriverio": "8.26.2" + "webdriverio": "8.27.0" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/appium-service/node_modules/@wdio/config": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.26.2.tgz", - "integrity": "sha512-E7QQ5t5LMLnfytls0SePJ61CGkYiBzN9D0dsNQuEOXjiWXt3Q+1VZnQgbfk85P6gRSxfyp7unB4VRxpsHDCwrw==", + "node_modules/@wdio/browserstack-service": { + "version": "8.27.1", + "resolved": "https://registry.npmjs.org/@wdio/browserstack-service/-/browserstack-service-8.27.1.tgz", + "integrity": "sha512-5+54/mfAmnV6InW49+943WJL1btp4g60HQqzmlOhszeG4MJ/ytWjrLeX4l4VQtoaa0H1e35IazXSnVVyzioL0Q==", "dev": true, "dependencies": { + "@types/gitconfiglocal": "^2.0.1", "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" + "@wdio/reporter": "8.27.0", + "@wdio/types": "8.27.0", + "browserstack-local": "^1.5.1", + "chalk": "^5.3.0", + "csv-writer": "^1.6.0", + "formdata-node": "5.0.1", + "git-repo-info": "^2.1.1", + "gitconfiglocal": "^2.1.0", + "got": "^12.6.1", + "uuid": "^9.0.0", + "webdriverio": "8.27.0", + "winston-transport": "^4.5.0" }, "engines": { "node": "^16.13 || >=18" + }, + "peerDependencies": { + "@wdio/cli": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@wdio/appium-service/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", + "node_modules/@wdio/cli": { + "version": "8.27.1", + "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.27.1.tgz", + "integrity": "sha512-RY9o4h0iN6UGpU31X5c9mu/TK2FlHtKtDaRJYunm5ycZvGahQcN+naYpea1ftDr4IpI2gGGlHxvEeHkJF7urDQ==", "dev": true, "dependencies": { - "@types/node": "^20.1.0" + "@types/node": "^20.1.1", + "@wdio/config": "8.27.0", + "@wdio/globals": "8.27.0", + "@wdio/logger": "8.24.12", + "@wdio/protocols": "8.24.12", + "@wdio/types": "8.27.0", + "@wdio/utils": "8.27.0", + "async-exit-hook": "^2.0.1", + "chalk": "^5.2.0", + "chokidar": "^3.5.3", + "cli-spinners": "^2.9.0", + "dotenv": "^16.3.1", + "ejs": "^3.1.9", + "execa": "^8.0.1", + "import-meta-resolve": "^4.0.0", + "inquirer": "9.2.12", + "lodash.flattendeep": "^4.4.0", + "lodash.pickby": "^4.6.0", + "lodash.union": "^4.6.0", + "read-pkg-up": "^10.0.0", + "recursive-readdir": "^2.2.3", + "webdriverio": "8.27.0", + "yargs": "^17.7.2" + }, + "bin": { + "wdio": "bin/wdio.js" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/appium-service/node_modules/@wdio/utils": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.26.2.tgz", - "integrity": "sha512-QohaDMxsNunn6sWFBBtw2vSsoSfpbbjLAszW+iBLccpNGfRfHnaJ8HZ5gfsphMYnLfQe5lZRliIX5+8sSnjU1Q==", + "node_modules/@wdio/config": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.27.0.tgz", + "integrity": "sha512-zYM5daeiBVVAbQj0ASymAt0RUsocLVIwKiUHNa8gg/1GsZnztGjetXExSp1gXlxtMVM5xWUSKjh6ceFK79gWDQ==", "dev": true, "dependencies": { - "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", + "@wdio/types": "8.27.0", + "@wdio/utils": "8.27.0", "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/appium-service/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/appium-service/node_modules/devtools-protocol": { - "version": "0.0.1235375", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1235375.tgz", - "integrity": "sha512-MOMnfplVXEhcP7+W98NK8ZJtgoo2/A+s+FkIu9+TbSgWSZREVK5Ozh2qCQgRN4EPYMxiSJX09OoVJT+hGj4aTw==", - "dev": true - }, - "node_modules/@wdio/appium-service/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@wdio/globals": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.27.0.tgz", + "integrity": "sha512-HUPOIsrmxfF0LhU68lVsNGQGZkW/bWOvcCd8WxeaggTAH9JyxasxxfwzeCceAuhAvwtlwoMXITOpjAXO2mj38Q==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^16.13 || >=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "optionalDependencies": { + "expect-webdriverio": "^4.6.1", + "webdriverio": "8.27.0" } }, - "node_modules/@wdio/appium-service/node_modules/webdriver": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.26.2.tgz", - "integrity": "sha512-3i+icym2m0EYRyJP9zbjoy2Npw3nNAK8iVC5VVo35lb9bFmyHoLsihxxsHnALgVRyBLahZV0Smh2dnVsePHOvw==", + "node_modules/@wdio/local-runner": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.27.0.tgz", + "integrity": "sha512-nxS17mhoLkXP20eoPMkz7tbMFMOQejSw0hZfkEvuDCNhJokr8ugp6IjYXL9f7yV9IB9UDGHox8WGY4ArSrOeBA==", "dev": true, "dependencies": { "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.26.2", "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/appium-service/node_modules/webdriverio": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.26.2.tgz", - "integrity": "sha512-kjSl3g6K0ieVt2np6dDJxsIb80kVKlKX6NNcBzQdAVrLcydRt4ibPa5oYalap9X2PgxA9I5Kae+ZTeM+d4f71w==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1235375", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.26.2" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/browserstack-service": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/browserstack-service/-/browserstack-service-8.26.2.tgz", - "integrity": "sha512-U4K4reoJWR1gI1QtZRBtF+gapPW7v2xDI1biTbQDzIKavo27V0NGQmhytf3TM6Jmd2CIUG4JR0LAITdZJ0O4Yg==", - "dev": true, - "dependencies": { - "@types/gitconfiglocal": "^2.0.1", - "@wdio/logger": "8.24.12", - "@wdio/reporter": "8.26.2", - "@wdio/types": "8.26.2", - "browserstack-local": "^1.5.1", - "chalk": "^5.3.0", - "csv-writer": "^1.6.0", - "formdata-node": "5.0.1", - "git-repo-info": "^2.1.1", - "gitconfiglocal": "^2.1.0", - "got": "^12.6.1", - "uuid": "^9.0.0", - "webdriverio": "8.26.2", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "@wdio/cli": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@wdio/browserstack-service/node_modules/@wdio/config": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.26.2.tgz", - "integrity": "sha512-E7QQ5t5LMLnfytls0SePJ61CGkYiBzN9D0dsNQuEOXjiWXt3Q+1VZnQgbfk85P6gRSxfyp7unB4VRxpsHDCwrw==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/browserstack-service/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/browserstack-service/node_modules/@wdio/utils": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.26.2.tgz", - "integrity": "sha512-QohaDMxsNunn6sWFBBtw2vSsoSfpbbjLAszW+iBLccpNGfRfHnaJ8HZ5gfsphMYnLfQe5lZRliIX5+8sSnjU1Q==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/browserstack-service/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/browserstack-service/node_modules/devtools-protocol": { - "version": "0.0.1235375", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1235375.tgz", - "integrity": "sha512-MOMnfplVXEhcP7+W98NK8ZJtgoo2/A+s+FkIu9+TbSgWSZREVK5Ozh2qCQgRN4EPYMxiSJX09OoVJT+hGj4aTw==", - "dev": true - }, - "node_modules/@wdio/browserstack-service/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/browserstack-service/node_modules/webdriver": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.26.2.tgz", - "integrity": "sha512-3i+icym2m0EYRyJP9zbjoy2Npw3nNAK8iVC5VVo35lb9bFmyHoLsihxxsHnALgVRyBLahZV0Smh2dnVsePHOvw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/browserstack-service/node_modules/webdriverio": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.26.2.tgz", - "integrity": "sha512-kjSl3g6K0ieVt2np6dDJxsIb80kVKlKX6NNcBzQdAVrLcydRt4ibPa5oYalap9X2PgxA9I5Kae+ZTeM+d4f71w==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1235375", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.26.2" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/cli": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.26.2.tgz", - "integrity": "sha512-Gu9JZHFe1Kd69ip8FsXb8rQpt/dYqOBYj47kF8c/lTObhwf/WYXLwlS5XpNTc81vLK+iiM7p92QLgfG8oOHyIg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.1", - "@wdio/config": "8.26.2", - "@wdio/globals": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "async-exit-hook": "^2.0.1", - "chalk": "^5.2.0", - "chokidar": "^3.5.3", - "cli-spinners": "^2.9.0", - "dotenv": "^16.3.1", - "ejs": "^3.1.9", - "execa": "^8.0.1", - "import-meta-resolve": "^4.0.0", - "inquirer": "9.2.12", - "lodash.flattendeep": "^4.4.0", - "lodash.pickby": "^4.6.0", - "lodash.union": "^4.6.0", - "read-pkg-up": "^10.0.0", - "recursive-readdir": "^2.2.3", - "webdriverio": "8.26.2", - "yargs": "^17.7.2" - }, - "bin": { - "wdio": "bin/wdio.js" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/@wdio/config": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.26.2.tgz", - "integrity": "sha512-E7QQ5t5LMLnfytls0SePJ61CGkYiBzN9D0dsNQuEOXjiWXt3Q+1VZnQgbfk85P6gRSxfyp7unB4VRxpsHDCwrw==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/@wdio/utils": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.26.2.tgz", - "integrity": "sha512-QohaDMxsNunn6sWFBBtw2vSsoSfpbbjLAszW+iBLccpNGfRfHnaJ8HZ5gfsphMYnLfQe5lZRliIX5+8sSnjU1Q==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/devtools-protocol": { - "version": "0.0.1235375", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1235375.tgz", - "integrity": "sha512-MOMnfplVXEhcP7+W98NK8ZJtgoo2/A+s+FkIu9+TbSgWSZREVK5Ozh2qCQgRN4EPYMxiSJX09OoVJT+hGj4aTw==", - "dev": true - }, - "node_modules/@wdio/cli/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/cli/node_modules/webdriver": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.26.2.tgz", - "integrity": "sha512-3i+icym2m0EYRyJP9zbjoy2Npw3nNAK8iVC5VVo35lb9bFmyHoLsihxxsHnALgVRyBLahZV0Smh2dnVsePHOvw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cli/node_modules/webdriverio": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.26.2.tgz", - "integrity": "sha512-kjSl3g6K0ieVt2np6dDJxsIb80kVKlKX6NNcBzQdAVrLcydRt4ibPa5oYalap9X2PgxA9I5Kae+ZTeM+d4f71w==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1235375", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.26.2" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/config": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.24.12.tgz", - "integrity": "sha512-3HW7qG1rIHzOIybV6oHR1CqLghsN0G3Xzs90ZciGL8dYhtcLtYCHwuWmBw4mkaB5xViU4AmZDuj7ChiG8Cr6Qw==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.24.12", - "@wdio/types": "8.24.12", - "@wdio/utils": "8.24.12", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.26.2.tgz", - "integrity": "sha512-ie96SYwvnZTfcTQPYjshxoaNob9yndlG6z29l5bugY6xkpW2YVKOJ7bf8X4S+1M9ATIJiBYh1fpliuxyib2JXQ==", - "dev": true, - "engines": { - "node": "^16.13 || >=18" - }, - "optionalDependencies": { - "expect-webdriverio": "^4.6.1", - "webdriverio": "8.26.2" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/config": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.26.2.tgz", - "integrity": "sha512-E7QQ5t5LMLnfytls0SePJ61CGkYiBzN9D0dsNQuEOXjiWXt3Q+1VZnQgbfk85P6gRSxfyp7unB4VRxpsHDCwrw==", - "dev": true, - "optional": true, - "dependencies": { - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/utils": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.26.2.tgz", - "integrity": "sha512-QohaDMxsNunn6sWFBBtw2vSsoSfpbbjLAszW+iBLccpNGfRfHnaJ8HZ5gfsphMYnLfQe5lZRliIX5+8sSnjU1Q==", - "dev": true, - "optional": true, - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/devtools-protocol": { - "version": "0.0.1235375", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1235375.tgz", - "integrity": "sha512-MOMnfplVXEhcP7+W98NK8ZJtgoo2/A+s+FkIu9+TbSgWSZREVK5Ozh2qCQgRN4EPYMxiSJX09OoVJT+hGj4aTw==", - "dev": true, - "optional": true - }, - "node_modules/@wdio/globals/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "optional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/globals/node_modules/webdriver": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.26.2.tgz", - "integrity": "sha512-3i+icym2m0EYRyJP9zbjoy2Npw3nNAK8iVC5VVo35lb9bFmyHoLsihxxsHnALgVRyBLahZV0Smh2dnVsePHOvw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/webdriverio": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.26.2.tgz", - "integrity": "sha512-kjSl3g6K0ieVt2np6dDJxsIb80kVKlKX6NNcBzQdAVrLcydRt4ibPa5oYalap9X2PgxA9I5Kae+ZTeM+d4f71w==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1235375", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.26.2" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/local-runner": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.26.2.tgz", - "integrity": "sha512-sAgWT2/l1zuCvk7MkNyrSCOj2cF6G//XYlqXiUGyG5O8R2B6GWB/bOrh4GsuOQ8rQ8vnUPnJVUeravHWhVePNA==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/logger": "8.24.12", - "@wdio/repl": "8.24.12", - "@wdio/runner": "8.26.2", - "@wdio/types": "8.26.2", - "async-exit-hook": "^2.0.1", - "split2": "^4.1.0", - "stream-buffers": "^3.0.2" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/local-runner/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/logger": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.24.12.tgz", - "integrity": "sha512-QisOiVIWKTUCf1H7S+DOtC+gruhlpimQrUXfWMTeeh672PvAJYnTpOJDWA+BtXfsikkUYFAzAaq8SeMJk8rqKg==", - "dev": true, - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/mocha-framework": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.26.2.tgz", - "integrity": "sha512-VEbkj/R9dOs9WWeO/xCSiGLZSCYEQ6We6MFiedSiTUFyPFbbBqtDE6ENJzstJhyoywwHsr9XuTxIGqakaDmfBw==", - "dev": true, - "dependencies": { - "@types/mocha": "^10.0.0", - "@types/node": "^20.1.0", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "mocha": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/mocha-framework/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/mocha-framework/node_modules/@wdio/utils": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.26.2.tgz", - "integrity": "sha512-QohaDMxsNunn6sWFBBtw2vSsoSfpbbjLAszW+iBLccpNGfRfHnaJ8HZ5gfsphMYnLfQe5lZRliIX5+8sSnjU1Q==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/protocols": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.24.12.tgz", - "integrity": "sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==", - "dev": true - }, - "node_modules/@wdio/repl": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz", - "integrity": "sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/reporter": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.26.2.tgz", - "integrity": "sha512-Fzn8AmYCmeqWyZBgkIgWuHEHb5HQgZXHxYvT1LeG+3B/w1F6OAU3lZSuY/ACoDI0vAYgRTHVDHFwuuhdUjtDew==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "diff": "^5.0.0", - "object-inspect": "^1.12.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/reporter/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.26.2.tgz", - "integrity": "sha512-0eKmAJ1/KqFsEIhfKVCipPL2i3vMjRld6PDQxgZWLaxOsyVXQ38njJ+HHogskWtdGQqWNisosYGUv29QNTJYsw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.26.2", - "@wdio/globals": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "deepmerge-ts": "^5.0.0", - "expect-webdriverio": "^4.6.1", - "gaze": "^1.1.2", - "webdriver": "8.26.2", - "webdriverio": "8.26.2" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/config": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.26.2.tgz", - "integrity": "sha512-E7QQ5t5LMLnfytls0SePJ61CGkYiBzN9D0dsNQuEOXjiWXt3Q+1VZnQgbfk85P6gRSxfyp7unB4VRxpsHDCwrw==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/utils": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.26.2.tgz", - "integrity": "sha512-QohaDMxsNunn6sWFBBtw2vSsoSfpbbjLAszW+iBLccpNGfRfHnaJ8HZ5gfsphMYnLfQe5lZRliIX5+8sSnjU1Q==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/devtools-protocol": { - "version": "0.0.1235375", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1235375.tgz", - "integrity": "sha512-MOMnfplVXEhcP7+W98NK8ZJtgoo2/A+s+FkIu9+TbSgWSZREVK5Ozh2qCQgRN4EPYMxiSJX09OoVJT+hGj4aTw==", - "dev": true - }, - "node_modules/@wdio/runner/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/runner/node_modules/webdriver": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.26.2.tgz", - "integrity": "sha512-3i+icym2m0EYRyJP9zbjoy2Npw3nNAK8iVC5VVo35lb9bFmyHoLsihxxsHnALgVRyBLahZV0Smh2dnVsePHOvw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/webdriverio": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.26.2.tgz", - "integrity": "sha512-kjSl3g6K0ieVt2np6dDJxsIb80kVKlKX6NNcBzQdAVrLcydRt4ibPa5oYalap9X2PgxA9I5Kae+ZTeM+d4f71w==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1235375", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.26.2" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/sauce-service": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/sauce-service/-/sauce-service-8.26.2.tgz", - "integrity": "sha512-A4XOdjAZG/nvTO/QRjLzgayy9ycQS4e0spIUT7HcYUV9iBMjPTURW2t8j/EoEAIV9VrcG+rJ/YNOcT7Hp0cWdg==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "ip": "^1.1.8", - "saucelabs": "7.4.0", - "webdriverio": "8.26.2" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/sauce-service/node_modules/@wdio/config": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.26.2.tgz", - "integrity": "sha512-E7QQ5t5LMLnfytls0SePJ61CGkYiBzN9D0dsNQuEOXjiWXt3Q+1VZnQgbfk85P6gRSxfyp7unB4VRxpsHDCwrw==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" + "@wdio/repl": "8.24.12", + "@wdio/runner": "8.27.0", + "@wdio/types": "8.27.0", + "async-exit-hook": "^2.0.1", + "split2": "^4.1.0", + "stream-buffers": "^3.0.2" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/sauce-service/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", + "node_modules/@wdio/logger": { + "version": "8.24.12", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.24.12.tgz", + "integrity": "sha512-QisOiVIWKTUCf1H7S+DOtC+gruhlpimQrUXfWMTeeh672PvAJYnTpOJDWA+BtXfsikkUYFAzAaq8SeMJk8rqKg==", "dev": true, "dependencies": { - "@types/node": "^20.1.0" + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/sauce-service/node_modules/@wdio/utils": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.26.2.tgz", - "integrity": "sha512-QohaDMxsNunn6sWFBBtw2vSsoSfpbbjLAszW+iBLccpNGfRfHnaJ8HZ5gfsphMYnLfQe5lZRliIX5+8sSnjU1Q==", + "node_modules/@wdio/mocha-framework": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.27.0.tgz", + "integrity": "sha512-NaFUPv90ks1XlZy0qdUaJ5/ilBtiCCgTIxaPexshJiaVDT5cV+Igjag/O80HIcvqknOZpdKAR0I1ArQzhJrmcA==", "dev": true, "dependencies": { - "@puppeteer/browsers": "^1.6.0", + "@types/mocha": "^10.0.0", + "@types/node": "^20.1.0", "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" + "@wdio/types": "8.27.0", + "@wdio/utils": "8.27.0", + "mocha": "^10.0.0" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/sauce-service/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/sauce-service/node_modules/devtools-protocol": { - "version": "0.0.1235375", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1235375.tgz", - "integrity": "sha512-MOMnfplVXEhcP7+W98NK8ZJtgoo2/A+s+FkIu9+TbSgWSZREVK5Ozh2qCQgRN4EPYMxiSJX09OoVJT+hGj4aTw==", + "node_modules/@wdio/protocols": { + "version": "8.24.12", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.24.12.tgz", + "integrity": "sha512-QnVj3FkapmVD3h2zoZk+ZQ8gevSj9D9MiIQIy8eOnY4FAneYZ9R9GvoW+mgNcCZO8S8++S/jZHetR8n+8Q808g==", "dev": true }, - "node_modules/@wdio/sauce-service/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@wdio/repl": { + "version": "8.24.12", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz", + "integrity": "sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "@types/node": "^20.1.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^16.13 || >=18" } }, - "node_modules/@wdio/sauce-service/node_modules/webdriver": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.26.2.tgz", - "integrity": "sha512-3i+icym2m0EYRyJP9zbjoy2Npw3nNAK8iVC5VVo35lb9bFmyHoLsihxxsHnALgVRyBLahZV0Smh2dnVsePHOvw==", + "node_modules/@wdio/reporter": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.27.0.tgz", + "integrity": "sha512-kBwsrHbsblmXfHSWlaOKXjPRPeT29WSKTUoCmzuTcCkhvbjY4TrEB0p04cpaM7uNqdIZTxHng54gZVaG/nZPiw==", "dev": true, "dependencies": { "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.26.2", "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" + "@wdio/types": "8.27.0", + "diff": "^5.0.0", + "object-inspect": "^1.12.0" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/sauce-service/node_modules/webdriverio": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.26.2.tgz", - "integrity": "sha512-kjSl3g6K0ieVt2np6dDJxsIb80kVKlKX6NNcBzQdAVrLcydRt4ibPa5oYalap9X2PgxA9I5Kae+ZTeM+d4f71w==", + "node_modules/@wdio/runner": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.27.0.tgz", + "integrity": "sha512-da332r2d1QXdRhMhsDxMObcqLZS0l/u14pHICNTvEHp+72gOttbjUDvdMHPQY6Ae5ul7AVVQ05qpmz9CX7TzOg==", "dev": true, "dependencies": { "@types/node": "^20.1.0", - "@wdio/config": "8.26.2", + "@wdio/config": "8.27.0", + "@wdio/globals": "8.27.0", "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1235375", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.26.2" + "@wdio/types": "8.27.0", + "@wdio/utils": "8.27.0", + "deepmerge-ts": "^5.0.0", + "expect-webdriverio": "^4.6.1", + "gaze": "^1.1.2", + "webdriver": "8.27.0", + "webdriverio": "8.27.0" }, "engines": { "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } } }, - "node_modules/@wdio/spec-reporter": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.26.2.tgz", - "integrity": "sha512-GysWLoBukPNgxuXyobt7xPI776kW2NBsdvNYn8ECpYXWh7Of+ANSOGgGNWrN70Chct1NbGA5W4WwuDWcMeDDwg==", + "node_modules/@wdio/sauce-service": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/sauce-service/-/sauce-service-8.27.0.tgz", + "integrity": "sha512-DhDhzMZWgQoIG4tQZ3SWppGCFXxjcTusrwA7b1D+jEcy9nRYeLx7xnqdcFUdpddMlVV6pT2MlskoF4YI7lhDGg==", "dev": true, "dependencies": { - "@wdio/reporter": "8.26.2", - "@wdio/types": "8.26.2", - "chalk": "^5.1.2", - "easy-table": "^1.2.0", - "pretty-ms": "^7.0.0" + "@wdio/logger": "8.24.12", + "@wdio/types": "8.27.0", + "@wdio/utils": "8.27.0", + "ip": "^1.1.8", + "saucelabs": "7.4.0", + "webdriverio": "8.27.0" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/spec-reporter/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", + "node_modules/@wdio/spec-reporter": { + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.27.0.tgz", + "integrity": "sha512-EOXLBIr4oLzSDp/BQ86IqCulSF0jwEAj2EiMeY6dh9WXzBBtoR8WnoX/27xFoZ8GU2zetWC3EVnLJ0Ex8Up1mA==", "dev": true, "dependencies": { - "@types/node": "^20.1.0" + "@wdio/reporter": "8.27.0", + "@wdio/types": "8.27.0", + "chalk": "^5.1.2", + "easy-table": "^1.2.0", + "pretty-ms": "^7.0.0" }, "engines": { "node": "^16.13 || >=18" } }, "node_modules/@wdio/testingbot-service": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/testingbot-service/-/testingbot-service-8.26.2.tgz", - "integrity": "sha512-3jV3JCBzftXJGcEd7wm6ji82bQt5duNs21/GKYvJ2IxH/yVHsYb0snBsIKW8mcjymk4uhg3hhMNLqsTlrqhBOg==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/testingbot-service/-/testingbot-service-8.27.0.tgz", + "integrity": "sha512-qv/gwra5+MAfDYosj1sKfdp8/4C/Feu/v1edUVWc8Yzf3Fg+YAeyTnjWA4a6J2TQ2jSPSNoxsiHOp8XPWG3iRA==", "dev": true, "dependencies": { "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", + "@wdio/types": "8.27.0", "got": "^12.6.1", "testingbot-tunnel-launcher": "^1.1.7", - "webdriverio": "8.26.2" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/testingbot-service/node_modules/@wdio/config": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.26.2.tgz", - "integrity": "sha512-E7QQ5t5LMLnfytls0SePJ61CGkYiBzN9D0dsNQuEOXjiWXt3Q+1VZnQgbfk85P6gRSxfyp7unB4VRxpsHDCwrw==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/testingbot-service/node_modules/@wdio/types": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.26.2.tgz", - "integrity": "sha512-LBaoTr4jrPu9knQBN1/7BD3SLkaGoQPcbE3GKIxeaOu0fRMOtEr22HxoONahOlQDvyPoOBmSoZw8wUvIfwhrRw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/testingbot-service/node_modules/@wdio/utils": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.26.2.tgz", - "integrity": "sha512-QohaDMxsNunn6sWFBBtw2vSsoSfpbbjLAszW+iBLccpNGfRfHnaJ8HZ5gfsphMYnLfQe5lZRliIX5+8sSnjU1Q==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.24.12", - "@wdio/types": "8.26.2", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/testingbot-service/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/testingbot-service/node_modules/devtools-protocol": { - "version": "0.0.1235375", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1235375.tgz", - "integrity": "sha512-MOMnfplVXEhcP7+W98NK8ZJtgoo2/A+s+FkIu9+TbSgWSZREVK5Ozh2qCQgRN4EPYMxiSJX09OoVJT+hGj4aTw==", - "dev": true - }, - "node_modules/@wdio/testingbot-service/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/testingbot-service/node_modules/webdriver": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.26.2.tgz", - "integrity": "sha512-3i+icym2m0EYRyJP9zbjoy2Npw3nNAK8iVC5VVo35lb9bFmyHoLsihxxsHnALgVRyBLahZV0Smh2dnVsePHOvw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/testingbot-service/node_modules/webdriverio": { - "version": "8.26.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.26.2.tgz", - "integrity": "sha512-kjSl3g6K0ieVt2np6dDJxsIb80kVKlKX6NNcBzQdAVrLcydRt4ibPa5oYalap9X2PgxA9I5Kae+ZTeM+d4f71w==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.26.2", - "@wdio/logger": "8.24.12", - "@wdio/protocols": "8.24.12", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.26.2", - "@wdio/utils": "8.26.2", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1235375", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^4.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.26.2" + "webdriverio": "8.27.0" }, "engines": { "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } } }, "node_modules/@wdio/types": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.24.12.tgz", - "integrity": "sha512-SaD3OacDiW06DvSgAQ7sDBbpiI9qZRg7eoVYeBg3uSGVtUq84vTETRhhV7D6xTC00IqZu+mmN2TY5/q+7Gqy7w==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.27.0.tgz", + "integrity": "sha512-LbP9FKh8r0uW9/dKhTIUCC1Su8PsP9TmzGKXkWt6/IMacgJiB/zW3u1CgyaLw9lG0UiQORHGoeJX9zB2HZAh4w==", "dev": true, "dependencies": { "@types/node": "^20.1.0" @@ -3480,14 +2275,14 @@ } }, "node_modules/@wdio/utils": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.24.12.tgz", - "integrity": "sha512-uzwZyBVgqz0Wz1KL3aOUaQsxT8TNkzxti4NNTSMrU256qAPqc/n75rB7V73QASapCMpy70mZZTsuPgQYYj4ytQ==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.27.0.tgz", + "integrity": "sha512-4BY+JBQssVn003P5lA289uDMie3LtGinHze5btkcW9timB6VaU+EeZS4eKTPC0pziizLhteVvXYxv3YTpeeRfA==", "dev": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.24.12", - "@wdio/types": "8.24.12", + "@wdio/types": "8.27.0", "decamelize": "^6.0.0", "deepmerge-ts": "^5.1.0", "edgedriver": "^5.3.5", @@ -3681,12 +2476,6 @@ "node": ">=8" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true - }, "node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -3713,19 +2502,19 @@ } }, "node_modules/appium": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/appium/-/appium-2.2.3.tgz", - "integrity": "sha512-sm6fTdCh2z3XKEJMqlV7/snyHYQCWonmvAYVP1DaAD4YWRrI0gnn1Ezeo2BVzUBnPqx67V8mDtHpnqoRhb1v6A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/appium/-/appium-2.3.0.tgz", + "integrity": "sha512-uhLh+Glfr31vt3R6lnE6+LcBdxDArGKV1FRf072K6DZlEhz94aniRpMwKuMaQ76jfoF3BqWFmEJRIQL+2eRUKQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "@appium/base-driver": "^9.4.3", - "@appium/base-plugin": "^2.2.24", - "@appium/docutils": "^0.4.13", - "@appium/schema": "^0.4.2", - "@appium/support": "^4.1.10", - "@appium/types": "^0.14.3", - "@sidvind/better-ajv-errors": "2.1.0", + "@appium/base-driver": "^9.4.4", + "@appium/base-plugin": "^2.2.25", + "@appium/docutils": "^1.0.1", + "@appium/schema": "^0.5.0", + "@appium/support": "^4.1.11", + "@appium/types": "^0.15.0", + "@sidvind/better-ajv-errors": "2.1.3", "@types/argparse": "2.0.14", "@types/bluebird": "3.5.42", "@types/fancy-log": "2.0.2", @@ -3749,8 +2538,8 @@ "resolve-from": "5.0.0", "semver": "7.5.4", "source-map-support": "0.5.21", - "teen_process": "2.0.101", - "type-fest": "3.13.1", + "teen_process": "2.1.1", + "type-fest": "4.8.3", "winston": "3.11.0", "wrap-ansi": "7.0.0", "yaml": "2.3.4" @@ -3764,16 +2553,16 @@ } }, "node_modules/appium-uiautomator2-driver": { - "version": "2.34.2", - "resolved": "https://registry.npmjs.org/appium-uiautomator2-driver/-/appium-uiautomator2-driver-2.34.2.tgz", - "integrity": "sha512-4nCNXLN/uIXCn7t9DUMyJy1pR8aLpibyevZTAWP6ZoyyMRPnHJSNO9O7xzTEu1DIHGrrM0Fovz8Na4EPsDuReA==", + "version": "2.37.0", + "resolved": "https://registry.npmjs.org/appium-uiautomator2-driver/-/appium-uiautomator2-driver-2.37.0.tgz", + "integrity": "sha512-nQXgs1XCh3wcBWCKLxX3zEI1FBioryrz8mftfmQqSe2kLQqCITGUgmVk4h3wuGSr6HeSAc7MILuuuZdKJ5UUIQ==", "dev": true, "hasShrinkwrap": true, "dependencies": { "appium-adb": "^11.0.1", - "appium-android-driver": "^7.3.0", + "appium-android-driver": "^7.4.0", "appium-chromedriver": "^5.6.5", - "appium-uiautomator2-server": "^5.12.2", + "appium-uiautomator2-server": "^5.15.0", "asyncbox": "^3.0.0", "axios": "^1.x", "bluebird": "^3.5.1", @@ -3793,36 +2582,36 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-driver": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.4.2.tgz", - "integrity": "sha512-J/OEa2PZFqqE8TKnLFHoj7+qToADT02+dIgb5tLBCQqQVtaUnDXicD9n6lrcL2ogmz/W5EgL7HpSK5XC7XDTFA==", + "version": "9.4.4", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.4.4.tgz", + "integrity": "sha512-oxtXbFWMQVg8Y+lpdv0oL/G4C5TO3Ns7MDL/di2O//GcOMINCq+LJHvpvO2EX3HpLUX35yOu+3TUKQigPWwbQw==", "dev": true, "dependencies": { - "@appium/support": "^4.1.9", - "@appium/types": "^0.14.2", + "@appium/support": "^4.1.11", + "@appium/types": "^0.15.0", "@colors/colors": "1.6.0", "@types/async-lock": "1.4.2", "@types/bluebird": "3.5.42", "@types/express": "4.17.21", - "@types/lodash": "4.14.201", + "@types/lodash": "4.14.202", "@types/method-override": "0.0.35", "@types/serve-favicon": "2.5.7", "async-lock": "1.4.0", "asyncbox": "3.0.0", - "axios": "1.6.1", + "axios": "1.6.2", "bluebird": "3.7.2", "body-parser": "1.20.2", "es6-error": "4.1.1", "express": "4.18.2", "http-status-codes": "2.3.0", "lodash": "4.17.21", - "lru-cache": "10.0.1", + "lru-cache": "10.1.0", "method-override": "3.0.0", "morgan": "1.10.0", "path-to-regexp": "6.2.1", "serve-favicon": "2.5.0", "source-map-support": "0.5.21", - "type-fest": "3.13.1", + "type-fest": "4.8.3", "validate.js": "0.13.1" }, "engines": { @@ -3833,16 +2622,10 @@ "spdy": "4.0.2" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-driver/node_modules/@types/lodash": { - "version": "4.14.201", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", - "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", - "dev": true - }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-driver/node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -3851,26 +2634,26 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-driver/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-plugin": { - "version": "2.2.23", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.23.tgz", - "integrity": "sha512-/34eBHZ8LHvgZv3t2NcvA9Im1d0JX76g1OlFCf9DY5FJvJ75VDkF1AIxzvUaVhIdRaYqAxd4GsCSQU0lIFREXA==", + "version": "2.2.25", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.25.tgz", + "integrity": "sha512-bi2pM76ChfZ8fOG9OUOFovmPmMbUpUAETZar9/NHCOEHtUKV/5K1am/1hCrRmvkeB62UZah9jWSKv1kk61bLpA==", "dev": true, "peer": true, "dependencies": { - "@appium/base-driver": "^9.4.2", - "@appium/support": "^4.1.9" + "@appium/base-driver": "^9.4.4", + "@appium/support": "^4.1.11" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", @@ -3878,22 +2661,20 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-0.4.12.tgz", - "integrity": "sha512-abXL5ecjlZxerp2iQYhZ8XZxeOcNwhA/cvhO/LWA9l97q13aNwDgHowpiE+9qFbVFEk0VZWK0OmimzoUj9E8vg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.1.tgz", + "integrity": "sha512-6G0WlosgQ3+S3WLc66GRVGkxeKpMmdmKIcBZTkPt73yNSV5Klu7FLUhEQAKP/hmVorEYs7GqtD6HH6KP7xkSAw==", "dev": true, "peer": true, "dependencies": { - "@appium/support": "^4.1.9", + "@appium/support": "^4.1.11", "@appium/tsconfig": "^0.x", - "@appium/typedoc-plugin-appium": "^0.x", "@sliphua/lilconfig-ts-loader": "3.2.2", - "@types/which": "3.0.1", + "@types/which": "3.0.3", "chalk": "4.1.2", "consola": "2.15.3", "diff": "5.1.0", "figures": "3.2.0", - "find-up": "5.0.0", "json5": "2.2.3", "lilconfig": "2.1.0", "lodash": "4.17.21", @@ -3902,12 +2683,9 @@ "read-pkg": "5.2.0", "semver": "7.5.4", "source-map-support": "0.5.21", - "teen_process": "2.0.84", - "type-fest": "3.13.1", - "typedoc": "0.23.28", - "typedoc-plugin-markdown": "3.14.0", - "typedoc-plugin-resolve-crossmodule-references": "0.3.3", - "typescript": "5.0.4", + "teen_process": "2.1.1", + "type-fest": "4.8.3", + "typescript": "5.2.2", "yaml": "2.3.4", "yargs": "17.7.2", "yargs-parser": "21.1.1" @@ -3920,166 +2698,23 @@ "npm": ">=8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/@appium/typedoc-plugin-appium": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@appium/typedoc-plugin-appium/-/typedoc-plugin-appium-0.6.6.tgz", - "integrity": "sha512-sZwhveCtUti2QPAhHWysE8IJVyT9KLUwLxXUBnvDjamEm8cuJmqQDDW9nPgv6iiw1bz9ankv/VLYI8egIpTl6g==", - "dev": true, - "peer": true, - "dependencies": { - "handlebars": "4.7.8", - "lodash": "4.17.21", - "pluralize": "8.0.0", - "type-fest": "3.13.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - }, - "peerDependencies": { - "appium": "^2.0.0-beta.48", - "typedoc": "~0.23.14", - "typedoc-plugin-markdown": "3.14.0", - "typedoc-plugin-resolve-crossmodule-references": "~0.3.3", - "typescript": "^4.7.0 || ^5.0.0" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/teen_process": { - "version": "2.0.84", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.0.84.tgz", - "integrity": "sha512-pedJy3y/Bp+dzq4CTNvaW4pOY74YLDiGaaiLfeCRgzLZwn2BR2x4WKfcUpS/oG6gYdrEbXxMDZhI1Xbt7OD33g==", - "dev": true, - "peer": true, - "dependencies": { - "bluebird": "3.7.2", - "lodash": "4.17.21", - "shell-quote": "1.8.1", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "peer": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "peer": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/typedoc-plugin-markdown": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.14.0.tgz", - "integrity": "sha512-UyQLkLRkfTFhLdhSf3RRpA3nNInGn+k6sll2vRXjflaMNwQAAiB61SYbisNZTg16t4K1dt1bPQMMGLrxS0GZ0Q==", - "dev": true, - "peer": true, - "dependencies": { - "handlebars": "^4.7.7" - }, - "peerDependencies": { - "typedoc": ">=0.23.0" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/typedoc-plugin-resolve-crossmodule-references": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/typedoc-plugin-resolve-crossmodule-references/-/typedoc-plugin-resolve-crossmodule-references-0.3.3.tgz", - "integrity": "sha512-ZWWBy2WR8z9a6iXYGlyB3KrpV+JDdZv1mndYU6Eh6mInrfMCrQJi3Y5K9ihMBfuaBGB//le1nEmQLgzU3IO+dw==", - "deprecated": "Upgrade to typedoc >= 0.24 and remove typedoc-plugin-resolve-crossmodule-references from your dependencies", - "dev": true, - "peer": true, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "typedoc": ">=0.22 <=0.23" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/schema": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.4.2.tgz", - "integrity": "sha512-b2tC2sKAS8wnw8V7W7Rm6pXFt8QY4NTWvibprVYi1g8rZLnlmlIwUW0Gl6FhrWTUyK+u4rbF8vVIIBIU8C+i/g==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.5.0.tgz", + "integrity": "sha512-HFed9HtFU6+kLdVyp/xpS/Wfcge8PuMS37LJVShviT6OuzHOYvNFx1/y8+KMa/l0Npvll5eafdfHmUsWlRnUAA==", "dev": true, "dependencies": { "@types/json-schema": "7.0.15", @@ -4092,15 +2727,15 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/support": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.1.9.tgz", - "integrity": "sha512-R2hNFeSWVmIWOKUintiEw+GEtwR4W4sbdUMdhIJ6ywnWzLAC0m7Nsn5WHGmCJQXVHheLTefRPMME9/C1UkXhzA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.1.11.tgz", + "integrity": "sha512-d6Ujgn5IDlzmepI2i41Z3FexuhipZ2DE2omadNCJRMBlf0dd5cXW54WQjsS/5GI1S9c++/9Mk0aEHl/6RQcOpw==", "dev": true, "dependencies": { "@appium/tsconfig": "^0.x", - "@appium/types": "^0.14.2", + "@appium/types": "^0.15.0", "@colors/colors": "1.6.0", - "@types/archiver": "6.0.1", + "@types/archiver": "6.0.2", "@types/base64-stream": "1.0.5", "@types/find-root": "1.1.4", "@types/jsftp": "2.1.5", @@ -4108,16 +2743,16 @@ "@types/lockfile": "1.0.4", "@types/mv": "2.1.4", "@types/ncp": "2.0.8", - "@types/npmlog": "4.1.6", + "@types/npmlog": "7.0.0", "@types/pluralize": "0.0.33", - "@types/semver": "7.5.5", - "@types/shell-quote": "1.7.4", + "@types/semver": "7.5.6", + "@types/shell-quote": "1.7.5", "@types/supports-color": "8.1.3", - "@types/teen_process": "2.0.3", + "@types/teen_process": "2.0.4", "@types/uuid": "9.0.7", - "@types/which": "3.0.1", + "@types/which": "3.0.3", "archiver": "6.0.1", - "axios": "1.6.1", + "axios": "1.6.2", "base64-stream": "1.0.0", "bluebird": "3.7.2", "bplist-creator": "0.1.1", @@ -4145,8 +2780,8 @@ "shell-quote": "1.8.1", "source-map-support": "0.5.21", "supports-color": "8.1.1", - "teen_process": "2.0.84", - "type-fest": "3.13.1", + "teen_process": "2.1.1", + "type-fest": "4.8.3", "uuid": "9.0.1", "which": "4.0.0", "yauzl": "2.10.0" @@ -4159,25 +2794,10 @@ "sharp": "0.32.6" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/support/node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", - "dev": true - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/support/node_modules/@types/teen_process": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/teen_process/-/teen_process-2.0.3.tgz", - "integrity": "sha512-JOBoIEwRLG0FPqLjFgPv4OiTWRIhxc+QInVjJfgw7IAMR2Dj1nzQB9GfWQMHjCwSH9piX7Do+RqHKISWeQ86Tg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/support/node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -4209,29 +2829,13 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/support/node_modules/teen_process": { - "version": "2.0.84", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.0.84.tgz", - "integrity": "sha512-pedJy3y/Bp+dzq4CTNvaW4pOY74YLDiGaaiLfeCRgzLZwn2BR2x4WKfcUpS/oG6gYdrEbXxMDZhI1Xbt7OD33g==", - "dev": true, - "dependencies": { - "bluebird": "3.7.2", - "lodash": "4.17.21", - "shell-quote": "1.8.1", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/support/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4251,39 +2855,30 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.14.2.tgz", - "integrity": "sha512-sjekfbaych5Zpd+Y+bV6RYB4HzAAbLfgIXLZSbVgTM8O11qCjeDORxkuAOfFGeXUMNLEXCKiKzZ9Nnbjqm36Ww==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.15.0.tgz", + "integrity": "sha512-7Ht9ZdvcgBHc0ecttIlfFSMbVmKNL5YRX05BVCBakArWghN97xGRJ5VoUwgEeR8VE+iK0m+3R1p0/7HIxyqRJg==", "dev": true, "dependencies": { - "@appium/schema": "^0.4.2", + "@appium/schema": "^0.5.0", "@appium/tsconfig": "^0.x", "@types/express": "4.17.21", - "@types/npmlog": "4.1.6", - "@types/ws": "8.5.9", - "type-fest": "3.13.1" + "@types/npmlog": "7.0.0", + "@types/ws": "8.5.10", + "type-fest": "4.8.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/types/node_modules/@types/ws": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", - "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/types/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4586,9 +3181,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@sidvind/better-ajv-errors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-2.1.0.tgz", - "integrity": "sha512-JuIb009FhHuL9priFBho2kv7QmZOydj0LgYvj+h1t0mMCmhM/YmQNRlJR5wVtBZya6wrVFK5Hi5TIbv5BKEx7w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-2.1.3.tgz", + "integrity": "sha512-lWuod/rh7Xz5uXiEGSfm2Sd5PG7K/6yJfoAZVqzsEswjPJhUz15R7Gn/o8RczA041QS15hBd/BCSeu9vwPArkA==", "dev": true, "peer": true, "dependencies": { @@ -4596,7 +3191,7 @@ "chalk": "^4.1.0" }, "engines": { - "node": ">= 14.0.0" + "node": ">= 16.14" }, "peerDependencies": { "ajv": "4.11.8 - 8" @@ -4665,18 +3260,18 @@ "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/@types/archiver": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.1.tgz", - "integrity": "sha512-F2+JkmDYvtQrtb2YldwL0apRB1/WB6ub+1zVF/bKp3TOygUMFqfOLuw5Fj62Q+DPwJUFz1eocMxJMu7yVpplZA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.2.tgz", + "integrity": "sha512-KmROQqbQzKGuaAbmK+ZcytkJ51+YqDa7NmbXjmtC5YBLSyQYo21YaUnQ3HbaPFKL1ooo6RQ6OPYPIDyxfpDDXw==", "dev": true, "dependencies": { "@types/readdir-glob": "*" } }, "node_modules/appium-uiautomator2-driver/node_modules/@types/argparse": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-2.0.13.tgz", - "integrity": "sha512-KuqfEvuee3AmqgWbiB/9ZeJsGxgZiYPnREtAOyiDOLgmHrpzX+TBaJTMDXOCi3r9hATPj9ANuxu5EtU9Lab3SQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-2.0.14.tgz", + "integrity": "sha512-jJ6NMs9rXQ0rsqNt3TL4Elcwhd6wygo3lJOVoiHzURD34vsCcAlw443uGu4PXTtEmMF7sYKoadTCLXNmuJuQGw==", "dev": true, "peer": true }, @@ -4793,6 +3388,12 @@ "integrity": "sha512-Q8oFIHJHr+htLrTXN2FuZfg+WXVHQRwU/hC2GpUu+Q8e3FUM9EDkS2pE3R2AO1ZGu56f479ybdMCNF1DAu8cAQ==", "dev": true }, + "node_modules/appium-uiautomator2-driver/node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, "node_modules/appium-uiautomator2-driver/node_modules/@types/method-override": { "version": "0.0.35", "resolved": "https://registry.npmjs.org/@types/method-override/-/method-override-0.0.35.tgz", @@ -4824,9 +3425,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@types/node": { - "version": "20.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.2.tgz", - "integrity": "sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==", + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -4839,9 +3440,9 @@ "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/@types/npmlog": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.6.tgz", - "integrity": "sha512-0l3z16vnlJGl2Mi/rgJFrdwfLZ4jfNYgE6ZShEpjqhHuGTqdEzNles03NpYHwUMVYZa+Tj46UxKIEpE78lQ3DQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-7.0.0.tgz", + "integrity": "sha512-hJWbrKFvxKyWwSUXjZMYTINsSOY6IclhvGOZ97M8ac2tmR9hMwmTnYaMdpGhvju9ctWLTPhCS+eLfQNluiEjQQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -4854,9 +3455,9 @@ "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/@types/range-parser": { @@ -4874,6 +3475,12 @@ "@types/node": "*" } }, + "node_modules/appium-uiautomator2-driver/node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, "node_modules/appium-uiautomator2-driver/node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -4905,9 +3512,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@types/shell-quote": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@types/shell-quote/-/shell-quote-1.7.4.tgz", - "integrity": "sha512-ifo7UZx1tZb4O/I7SjSOUJmPcXcXCMU7NQ/QkcYPGnDWZHX7ViGCPWyzZXk3ThD/WDxuJHr5Uieyb02Cyz7Yng==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@types/shell-quote/-/shell-quote-1.7.5.tgz", + "integrity": "sha512-+UE8GAGRPbJVQDdxi16dgadcBfQ+KG2vgZhV1+3A1XmHbmwcdwhCUwIdy+d3pAGrbvgRoVSjeI9vOWyq376Yzw==", "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/@types/supports-color": { @@ -4916,6 +3523,15 @@ "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==", "dev": true }, + "node_modules/appium-uiautomator2-driver/node_modules/@types/teen_process": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/teen_process/-/teen_process-2.0.4.tgz", + "integrity": "sha512-AJT0syZovEDa4j17szoRJX5BE2RxD3FVp6SownH43mF16TPnsV0zhtsvFGlgs5QkgsNpoooNnF+HjMow7Jd3jA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/appium-uiautomator2-driver/node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", @@ -4930,9 +3546,9 @@ "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/@types/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.1.tgz", - "integrity": "sha512-OJWjr4k8gS1HXuOnCmQbBrQez+xqt/zqfp5PhgbKtsmEFEuojAg23arr+TiTZZ1TORdUF9RKXb/WKEpT1dwgSg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.3.tgz", + "integrity": "sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==", "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/@types/wrap-ansi": { @@ -4942,6 +3558,15 @@ "dev": true, "peer": true }, + "node_modules/appium-uiautomator2-driver/node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/appium-uiautomator2-driver/node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -5020,13 +3645,6 @@ "node": ">=8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true, - "peer": true - }, "node_modules/appium-uiautomator2-driver/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5043,32 +3661,32 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/appium/-/appium-2.2.2.tgz", - "integrity": "sha512-IcxtfSmf/QM71S8bZjL7aIW+auSLnsR1itMKxRn0npt7rQ2HYMWdf4Dx3IIBs349hIt8bQWYDyqkhvbLNqNOaw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/appium/-/appium-2.3.0.tgz", + "integrity": "sha512-uhLh+Glfr31vt3R6lnE6+LcBdxDArGKV1FRf072K6DZlEhz94aniRpMwKuMaQ76jfoF3BqWFmEJRIQL+2eRUKQ==", "dev": true, "hasInstallScript": true, "peer": true, "dependencies": { - "@appium/base-driver": "^9.4.2", - "@appium/base-plugin": "^2.2.23", - "@appium/docutils": "^0.4.12", - "@appium/schema": "^0.4.2", - "@appium/support": "^4.1.9", - "@appium/types": "^0.14.2", - "@sidvind/better-ajv-errors": "2.1.0", - "@types/argparse": "2.0.13", + "@appium/base-driver": "^9.4.4", + "@appium/base-plugin": "^2.2.25", + "@appium/docutils": "^1.0.1", + "@appium/schema": "^0.5.0", + "@appium/support": "^4.1.11", + "@appium/types": "^0.15.0", + "@sidvind/better-ajv-errors": "2.1.3", + "@types/argparse": "2.0.14", "@types/bluebird": "3.5.42", "@types/fancy-log": "2.0.2", - "@types/semver": "7.5.5", - "@types/teen_process": "2.0.3", + "@types/semver": "7.5.6", + "@types/teen_process": "2.0.4", "@types/wrap-ansi": "3.0.0", "ajv": "8.12.0", "ajv-formats": "2.1.1", "argparse": "2.0.1", "async-lock": "1.4.0", "asyncbox": "3.0.0", - "axios": "1.6.1", + "axios": "1.6.2", "bluebird": "3.7.2", "cross-env": "7.0.3", "find-up": "5.0.0", @@ -5080,8 +3698,8 @@ "resolve-from": "5.0.0", "semver": "7.5.4", "source-map-support": "0.5.21", - "teen_process": "2.0.84", - "type-fest": "3.13.1", + "teen_process": "2.1.1", + "type-fest": "4.8.3", "winston": "3.11.0", "wrap-ansi": "7.0.0", "yaml": "2.3.4" @@ -5095,9 +3713,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium-adb": { - "version": "11.0.8", - "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-11.0.8.tgz", - "integrity": "sha512-5ccGs5bpkGG8eFKvpI1ZihGuPDjg+hYtBcxQ/kzsIuDHr4N/c5E9Rz521BeSs4PVs2lMezOZRQO9cYkr0857wQ==", + "version": "11.0.9", + "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-11.0.9.tgz", + "integrity": "sha512-cROLDCcYFNGMDjffRVSAjm/uomKk/B/t/bjXWEtLAEbyWq/B/JvXPvsXi40S7vZBYtMSlYIRJIF4JnPaeXZuSg==", "dev": true, "dependencies": { "@appium/support": "^4.0.0", @@ -5118,9 +3736,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-7.3.1.tgz", - "integrity": "sha512-0Rr4ZL6wZwgf6cXrAfT5/cIh1/fjVVBK0sPiEB4cegugPMWy10vA/xRQMuKFaPQ8uCvX8gSKpOf/ekXMBAsGvg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-7.4.1.tgz", + "integrity": "sha512-xTc0ymH8bcpdKRMWMkKbekBz4dH/MoBPLEqsPCn6XndSQF3FQLjYbAJ4Bd+GgcDaSGo0CZNeHH15nN7mKSMDhg==", "dev": true, "dependencies": { "appium-adb": "^11.0.1", @@ -5149,9 +3767,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium-chromedriver": { - "version": "5.6.24", - "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-5.6.24.tgz", - "integrity": "sha512-TMmfY+6Ey0s2Hve/+clSGAyuJtdRIisCcADD6//RLNGl47wGho5jRerCWV0j4D/XnUqSxYJe+XkYxo6iAaEYVw==", + "version": "5.6.27", + "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-5.6.27.tgz", + "integrity": "sha512-ODYJWrUbNGHvdZ1U1Jbz5KraDvF2sC2EReEsvD8MXGZFRxZZpldEMWYB/vA9oJ6d1hUyIEzUXbdbDGfxGQSgiw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -5176,69 +3794,35 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium-uiautomator2-server": { - "version": "5.12.16", - "resolved": "https://registry.npmjs.org/appium-uiautomator2-server/-/appium-uiautomator2-server-5.12.16.tgz", - "integrity": "sha512-gsDsS06M4l+jKh8lbmFFqlCUFiwjVSFMq1C+FrdG+LzssstwFd1th2K8rqeToHS3nvkrgfqgd39Ptc8RFgycng==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/appium-uiautomator2-server/-/appium-uiautomator2-server-5.15.0.tgz", + "integrity": "sha512-c3VAGootEOohgsSjiTi/ugqyXiUgbceaIBcGPTkQrbz61/PbpLhtefD7I0Nc0EFdRiY4V9Rvb0G/55944Ztzeg==", "dev": true, "engines": { "node": ">=14", "npm": ">=8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/appium/node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", - "dev": true, - "peer": true - }, - "node_modules/appium-uiautomator2-driver/node_modules/appium/node_modules/@types/teen_process": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/teen_process/-/teen_process-2.0.3.tgz", - "integrity": "sha512-JOBoIEwRLG0FPqLjFgPv4OiTWRIhxc+QInVjJfgw7IAMR2Dj1nzQB9GfWQMHjCwSH9piX7Do+RqHKISWeQ86Tg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/appium/node_modules/axios": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", - "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "peer": true, "dependencies": { "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/appium/node_modules/teen_process": { - "version": "2.0.84", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.0.84.tgz", - "integrity": "sha512-pedJy3y/Bp+dzq4CTNvaW4pOY74YLDiGaaiLfeCRgzLZwn2BR2x4WKfcUpS/oG6gYdrEbXxMDZhI1Xbt7OD33g==", - "dev": true, - "peer": true, - "dependencies": { - "bluebird": "3.7.2", - "lodash": "4.17.21", - "shell-quote": "1.8.1", - "source-map-support": "0.5.21" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/appium-uiautomator2-driver/node_modules/appium/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "peer": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5285,15 +3869,6 @@ "node": ">= 12.0.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/archiver-utils/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -5363,9 +3938,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { "abort-controller": "^3.0.0", @@ -5431,9 +4006,9 @@ "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -5584,13 +4159,12 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/appium-uiautomator2-driver/node_modules/buffer": { @@ -6031,9 +4605,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/css-selector-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.0.2.tgz", - "integrity": "sha512-eA5pvYwgtffuxQlDk0gJRApDUKgfwlsQBMAH6uawKuuilTLfxKIOtzyV63Y3IC0LWnDCeTJ/I1qYmlfYvvMzDg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.0.4.tgz", + "integrity": "sha512-pnmS1dbKsz6KA4EW4BznyPL2xxkNDRg62hcD0v8g6DEw2W7hxOln5M953jsp9hmw5Dg57S6o/A8GOn37mbAgcQ==", "dev": true, "funding": [ { @@ -6797,30 +5371,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-uiautomator2-driver/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -6846,28 +5396,6 @@ "dev": true, "optional": true }, - "node_modules/appium-uiautomator2-driver/node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7248,13 +5776,6 @@ "node": ">=6" } }, - "node_modules/appium-uiautomator2-driver/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "peer": true - }, "node_modules/appium-uiautomator2-driver/node_modules/klaw": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", @@ -7413,21 +5934,14 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, "engines": { "node": "14 || >=16.14" } }, - "node_modules/appium-uiautomator2-driver/node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true, - "peer": true - }, "node_modules/appium-uiautomator2-driver/node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -7528,15 +6042,18 @@ "optional": true }, "node_modules/appium-uiautomator2-driver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/appium-uiautomator2-driver/node_modules/minimist": { @@ -7586,9 +6103,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "version": "0.5.44", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", + "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", "dev": true, "dependencies": { "moment": "^2.29.4" @@ -7660,6 +6177,16 @@ "node": ">=0.8.0" } }, + "node_modules/appium-uiautomator2-driver/node_modules/mv/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/appium-uiautomator2-driver/node_modules/mv/node_modules/glob": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", @@ -7676,6 +6203,18 @@ "node": "*" } }, + "node_modules/appium-uiautomator2-driver/node_modules/mv/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/appium-uiautomator2-driver/node_modules/mv/node_modules/rimraf": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", @@ -7713,17 +6252,10 @@ "node": ">= 0.6" } }, - "node_modules/appium-uiautomator2-driver/node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, "node_modules/appium-uiautomator2-driver/node_modules/node-abi": { - "version": "3.51.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", - "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.52.0.tgz", + "integrity": "sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==", "dev": true, "optional": true, "dependencies": { @@ -8359,15 +6891,6 @@ "minimatch": "^5.1.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/readdir-glob/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -8662,19 +7185,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-uiautomator2-driver/node_modules/shiki": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", - "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -8879,9 +7389,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/streamx": { - "version": "2.15.5", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", - "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", + "version": "2.15.6", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz", + "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==", "dev": true, "dependencies": { "fast-fifo": "^1.1.0", @@ -9047,18 +7557,18 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/teen_process": { - "version": "2.0.102", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.0.102.tgz", - "integrity": "sha512-nUEoMZEsp4WzBDZq3AlmUfT+7qfy+3/+U2FXC+54qcwR0Mok8EyT35W4CMBLfgI0shEX9XqCrnAQEo8JhJOZEw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.1.1.tgz", + "integrity": "sha512-PIX+PyH6h52uJeGpXfjLdIBRim5pPkJTkO/PPeLCa5NlofqlasTjcvNUUYo6XurnxSTl0o17sBzIrVoXNuqwGg==", "dev": true, "dependencies": { - "bluebird": "3.7.2", - "lodash": "4.17.21", - "shell-quote": "1.8.1", - "source-map-support": "0.5.21" + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "node": "^16.13.0 || >=18.0.0", "npm": ">=8" } }, @@ -9124,9 +7634,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/type-fest": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.2.tgz", - "integrity": "sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -9162,20 +7672,6 @@ "node": ">=14.17" } }, - "node_modules/appium-uiautomator2-driver/node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -9269,20 +7765,6 @@ "node": ">= 0.8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true, - "peer": true - }, - "node_modules/appium-uiautomator2-driver/node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true, - "peer": true - }, "node_modules/appium-uiautomator2-driver/node_modules/wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", @@ -9394,13 +7876,6 @@ "node": ">= 12.0.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "peer": true - }, "node_modules/appium-uiautomator2-driver/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9505,9 +7980,9 @@ "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -9535,9 +8010,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/xpath": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.33.tgz", - "integrity": "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA==", + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", + "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", "dev": true, "engines": { "node": ">=0.6.0" @@ -14419,12 +12894,12 @@ } }, "node_modules/appium/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", + "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14577,9 +13052,9 @@ } }, "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "dependencies": { "abort-controller": "^3.0.0", @@ -15923,9 +14398,9 @@ "optional": true }, "node_modules/devtools-protocol": { - "version": "0.0.1233178", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1233178.tgz", - "integrity": "sha512-jmMfyaqlzddwmDaSR1AQ+5ek+f7rupZdxKuPdkRcoxrZoF70Idg/4dTgXA08TLPmwAwB54gh49Wm2l/gRM0eUg==", + "version": "0.0.1237913", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1237913.tgz", + "integrity": "sha512-Pxtmz2ZIqBkpU82HaIdsvCQBG94yTC4xajrEsWx9p38QKEfBCJktSazsHkrjf9j3dVVNPhg5LR21F6KWeXpjiQ==", "dev": true }, "node_modules/diff": { @@ -17039,9 +15514,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -17686,27 +16161,6 @@ "dev": true, "optional": true }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -18768,12 +17222,6 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -19162,12 +17610,6 @@ "node": "14 || >=16.14" } }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -19180,18 +17622,6 @@ "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", "dev": true }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -19748,12 +18178,6 @@ "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -21891,18 +20315,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shiki": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.6.tgz", - "integrity": "sha512-R4koBBlQP33cC8cpzX0hAoOURBHJILp4Aaduh2eYi+Vj8ZBqtK/5SWNEHBS3qwUMu8dqOtI/ftno3ESfNeVW9g==", - "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -22498,18 +20910,18 @@ } }, "node_modules/teen_process": { - "version": "2.0.101", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.0.101.tgz", - "integrity": "sha512-rRfOeOc2mv+LU6SjjmE3mjCwS2sQRX5KWexHXu0PXefjLrzFQyooylLOsufzIktIgztDfmCVxuyWFeQLmQXDyQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.1.1.tgz", + "integrity": "sha512-PIX+PyH6h52uJeGpXfjLdIBRim5pPkJTkO/PPeLCa5NlofqlasTjcvNUUYo6XurnxSTl0o17sBzIrVoXNuqwGg==", "dev": true, "dependencies": { - "bluebird": "3.7.2", - "lodash": "4.17.21", - "shell-quote": "1.8.1", - "source-map-support": "0.5.21" + "bluebird": "^3.7.2", + "lodash": "^4.17.21", + "shell-quote": "^1.8.1", + "source-map-support": "^0.x" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "node": "^16.13.0 || >=18.0.0", "npm": ">=8" } }, @@ -22776,7 +21188,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "peer": true, "engines": { "node": ">=10" }, @@ -22810,19 +21221,6 @@ "node": ">=14.17" } }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -23015,18 +21413,6 @@ "node": ">= 0.8" } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, "node_modules/wait-port": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", @@ -23134,18 +21520,18 @@ } }, "node_modules/webdriver": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.24.12.tgz", - "integrity": "sha512-03DQIClHoaAqTsmDkxGwo4HwHfkn9LzJ1wfNyUerzKg8DnyXeiT6ILqj6EXLfsvh5zddU2vhYGLFXSerPgkuOQ==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.27.0.tgz", + "integrity": "sha512-n1IA+rR3u84XxU9swiKUM06BkEC0GDimfZkBML57cny+utQOUbdM/mBpqCUnkWX/RBz/p2EfHdKNyOs3/REaog==", "dev": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "8.24.12", + "@wdio/config": "8.27.0", "@wdio/logger": "8.24.12", "@wdio/protocols": "8.24.12", - "@wdio/types": "8.24.12", - "@wdio/utils": "8.24.12", + "@wdio/types": "8.27.0", + "@wdio/utils": "8.27.0", "deepmerge-ts": "^5.1.0", "got": "^12.6.1", "ky": "^0.33.0", @@ -23156,23 +21542,23 @@ } }, "node_modules/webdriverio": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.26.1.tgz", - "integrity": "sha512-KnM92UPqk7FmPJpZf3krHrqn0ydjSdyAMn+i4uENxLBqm1OyQ12gSKtIatt8FOP9/C+UrFXATSOd+jRkU2xMkw==", + "version": "8.27.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.27.0.tgz", + "integrity": "sha512-Qh5VCiBjEmxnmXcL1QEFoDzFqTtaWKrXriuU5G0yHKCModGAt2G7IHTkAok3CpmkVJfZpEvY630aP1MvgDtFhw==", "dev": true, "dependencies": { "@types/node": "^20.1.0", - "@wdio/config": "8.24.12", + "@wdio/config": "8.27.0", "@wdio/logger": "8.24.12", "@wdio/protocols": "8.24.12", "@wdio/repl": "8.24.12", - "@wdio/types": "8.24.12", - "@wdio/utils": "8.24.12", + "@wdio/types": "8.27.0", + "@wdio/utils": "8.27.0", "archiver": "^6.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1233178", + "devtools-protocol": "^0.0.1237913", "grapheme-splitter": "^1.0.2", "import-meta-resolve": "^4.0.0", "is-plain-obj": "^4.1.0", @@ -23184,7 +21570,7 @@ "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^11.0.1", - "webdriver": "8.24.12" + "webdriver": "8.27.0" }, "engines": { "node": "^16.13 || >=18" @@ -23310,12 +21696,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -23451,9 +21831,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz", - "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 06a81f26..ca9dc3c5 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,19 @@ "lint": "eslint config tests" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^6.14.0", - "@typescript-eslint/parser": "^6.14.0", - "@wdio/appium-service": "^8.26.1", - "@wdio/browserstack-service": "^8.26.1", - "@wdio/cli": "^8.26.1", - "@wdio/globals": "^8.26.1", - "@wdio/local-runner": "^8.26.1", - "@wdio/mocha-framework": "^8.24.12", - "@wdio/sauce-service": "^8.26.1", - "@wdio/spec-reporter": "^8.24.12", - "@wdio/testingbot-service": "^8.26.1", - "appium": "^2.2.3", - "appium-uiautomator2-driver": "^2.34.2", + "@typescript-eslint/eslint-plugin": "^6.16.0", + "@typescript-eslint/parser": "^6.16.0", + "@wdio/appium-service": "^8.27.0", + "@wdio/browserstack-service": "^8.27.1", + "@wdio/cli": "^8.27.1", + "@wdio/globals": "^8.27.0", + "@wdio/local-runner": "^8.27.0", + "@wdio/mocha-framework": "^8.27.0", + "@wdio/sauce-service": "^8.27.0", + "@wdio/spec-reporter": "^8.27.0", + "@wdio/testingbot-service": "^8.27.0", + "appium": "^2.3.0", + "appium-uiautomator2-driver": "^2.37.0", "appium-xcuitest-driver": "^5.12.2", "eslint-plugin-wdio": "^8.24.12", "ts-node": "^10.9.2", From d19e68360c1bfafe3ac99d4d5a8fce072f8216f9 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Mon, 1 Jan 2024 20:31:20 +0100 Subject: [PATCH 03/18] chore: update configs --- config/wdio.android.app.conf.ts | 13 +++++++++---- config/wdio.ios.app.conf.ts | 11 ++++++----- config/wdio.shared.conf.ts | 4 +++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/config/wdio.android.app.conf.ts b/config/wdio.android.app.conf.ts index bb388882..99043716 100644 --- a/config/wdio.android.app.conf.ts +++ b/config/wdio.android.app.conf.ts @@ -1,4 +1,4 @@ -import path from 'node:path'; +import { join } from 'node:path'; import { config as baseConfig } from './wdio.shared.local.appium.conf.js'; export const config: WebdriverIO.Config = { @@ -24,12 +24,17 @@ export const config: WebdriverIO.Config = { // For W3C the appium capabilities need to have an extension prefix // http://appium.io/docs/en/writing-running-appium/caps/ // This is `appium:` for all Appium Capabilities which can be found here - 'appium:deviceName': 'Pixel_3_10.0', - 'appium:platformVersion': '10.0', + 'appium:deviceName': 'Pixel_7_Pro_Android_14_API_34', + 'appium:platformVersion': '14.0', 'appium:orientation': 'PORTRAIT', 'appium:automationName': 'UiAutomator2', // The path to the app - 'appium:app': path.join(process.cwd(), 'apps', 'Android-NativeDemoApp-0.4.0.apk'), + 'appium:app': join( + process.cwd(), + 'apps', + // Change this name according to the app version you downloaded + 'android.wdio.native.app.v1.0.8.apk', + ), 'appium:appWaitActivity': 'com.wdiodemoapp.MainActivity', 'appium:newCommandTimeout': 240, }, diff --git a/config/wdio.ios.app.conf.ts b/config/wdio.ios.app.conf.ts index 74986514..754cc412 100644 --- a/config/wdio.ios.app.conf.ts +++ b/config/wdio.ios.app.conf.ts @@ -1,4 +1,4 @@ -import path from 'node:path'; +import { join } from 'node:path'; import { config as baseConfig } from './wdio.shared.local.appium.conf.js'; export const config: WebdriverIO.Config = { @@ -22,15 +22,16 @@ export const config: WebdriverIO.Config = { // For W3C the appium capabilities need to have an extension prefix // This is `appium:` for all Appium Capabilities which can be found here // http://appium.io/docs/en/writing-running-appium/caps/ - 'appium:deviceName': 'iPhone 13', - 'appium:platformVersion': '15.4', + 'appium:deviceName': 'iPhone 15', + 'appium:platformVersion': '17.2', 'appium:orientation': 'PORTRAIT', 'appium:automationName': 'XCUITest', // The path to the app - 'appium:app': path.join( + 'appium:app': join( process.cwd(), 'apps', - 'iOS-Simulator-NativeDemoApp-0.4.0.app.zip' + // Change this name according to the app version you downloaded + 'ios.simulator.wdio.native.app.v1.0.8.zip' ), 'appium:newCommandTimeout': 240, } diff --git a/config/wdio.shared.conf.ts b/config/wdio.shared.conf.ts index 2c33a336..11b3d068 100644 --- a/config/wdio.shared.conf.ts +++ b/config/wdio.shared.conf.ts @@ -1,9 +1,11 @@ +import type { Options } from '@wdio/types'; + /** * All not needed configurations, for this boilerplate, are removed. * If you want to know which configuration options you have then you can * check https://webdriver.io/docs/configurationfile */ -export const config: WebdriverIO.Config = { +export const config: Options.Testrunner = { // // ==================== // Runner Configuration From 6ad96aa0b18aa40cdc7b2089b42ca439e69d6a3b Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Tue, 2 Jan 2024 08:10:17 +0100 Subject: [PATCH 04/18] fix: update switch value --- tests/screenobjects/FormsScreen.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/screenobjects/FormsScreen.ts b/tests/screenobjects/FormsScreen.ts index 8a3fbf3f..e96a5b63 100644 --- a/tests/screenobjects/FormsScreen.ts +++ b/tests/screenobjects/FormsScreen.ts @@ -35,12 +35,10 @@ class FormsScreen extends AppScreen { /** * Return if the switch is active or not active for iOS / Android - * For Android the switch is `ON|OFF`, for iOS '1|0' + * For Android the switch is `"true"|"false"`, for iOS '1|0' */ async isSwitchActive ():Promise { - const active = driver.isAndroid ? 'ON' : '1'; - - return (await this.switch.getText()).includes(active); + return driver.isAndroid ? (await this.switch.getAttribute('checked')) === 'true' : (await this.switch.getText()) === '1'; } /** From d2115955b8086e097c9f4f3318829d95128b05fb Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Thu, 4 Jan 2024 18:12:25 +0100 Subject: [PATCH 05/18] fix: fix and improve webview selection --- config/wdio.ios.app.conf.ts | 2 + tests/helpers/WebView.ts | 342 +++++++++++++++++++++++++++++--- tests/specs/app.webview.spec.ts | 39 ++-- 3 files changed, 339 insertions(+), 44 deletions(-) diff --git a/config/wdio.ios.app.conf.ts b/config/wdio.ios.app.conf.ts index 754cc412..7a7588e7 100644 --- a/config/wdio.ios.app.conf.ts +++ b/config/wdio.ios.app.conf.ts @@ -34,6 +34,8 @@ export const config: WebdriverIO.Config = { 'ios.simulator.wdio.native.app.v1.0.8.zip' ), 'appium:newCommandTimeout': 240, + // This is needed to wait for the webview context to become available + 'appium:webviewConnectTimeout': 5000, } ] }; diff --git a/tests/helpers/WebView.ts b/tests/helpers/WebView.ts index 6672d5a4..3c186907 100644 --- a/tests/helpers/WebView.ts +++ b/tests/helpers/WebView.ts @@ -1,36 +1,115 @@ -import type { Context } from '@wdio/protocols'; - export const CONTEXT_REF = { - NATIVE: 'native', - WEBVIEW: 'webview', -}; + NATIVE_APP: 'NATIVE_APP', + WEBVIEW: 'WEBVIEW', +} as const; const DOCUMENT_READY_STATE = { COMPLETE: 'complete', INTERACTIVE: 'interactive', LOADING: 'loading', }; +const IOS_BUNDLE_ID = 'org.reactjs.native.example.wdiodemoapp'; + +type ContextType = typeof CONTEXT_REF[keyof typeof CONTEXT_REF]; +type AndroidInternalContexts = Array<{ + proc: string; + webview: string; + info: { + 'Android-Package': string; + Browser: string; + 'Protocol-Version': string; + 'User-Agent': string; + 'V8-Version': string; + 'WebKit-Version': string; + webSocketDebuggerUrl: string; + }; + pages: [{ + description: string; + devtoolsFrontendUrl: string; + faviconUrl: string; + id: string; + title: string; + type: string; + url: string; + webSocketDebuggerUrl: string; + }]; + webviewName: string; +}>; +type ContextInterface = { + id: string; + title?: string; + url?: string; +} +type IosContext = { + bundleId?: string; +} +type IosContexts = (ContextInterface & IosContext)[]; +type AndroidContext = { + packageName?: string; + webviewName?: string; + androidWebviewData?: { + attached: boolean; + empty: boolean; + neverAttached: boolean; + visible: boolean; + } +} +type AndroidContexts = (ContextInterface & AndroidContext)[]; +type CrossPlatformContexts = IosContexts | AndroidContexts; +/** + * There is a huge difference between the Android and iOS implementation for WebViews. We'll start with explaining the iOS implementation. + * + * iOS: + * - an iOS app can have MULTIPLE WebViews for one app, but only one can be active at the same time + * - when you call the default `driver.getContexts()` method you will get back an array of strings with: + * - `NATIVE_APP` + * - 0-N Webviews with the name `WEBVIEW-{randomNumber}` + * - the order will be random, so you can't rely on the order of the array + * - the default method doesn't give you enough information to determine which webview you need to use, + * for example no title or url of the webview + * + * Android: + * - an Android App can only have ONE WebView per app, but it can have multiple pages inside the WebView (in theory you can see them as multiple webviews) + * - when you call the default `driver.getContexts()` method you will get back an array of strings with: + * - `NATIVE_APP` + * - `WEBVIEW-{packageName}`, if you have Chrome in the background you will also get back `WEBVIEW_com.android.chrome` + * - the order will be random, so you can't rely on the order of the array + * - the default method doesn't give you enough information to determine which webview you need to use, + * for example no title or url of the webview + * + * The below class will give you custom implementations for both Android and iOS to get the correct webview. + * Please read the comments in the code for more information. + */ class WebView { /** - * Wait for the webview context to be loaded + * Wait for the webview context to be added to the contexts + * + * NOTE: this will say nothing if the url in the webview is loaded, only that the expected webview is added to the contexts * - * By default you have `NATIVE_APP` as the current context. If a webview is loaded it will be - * added to the current contexts and will looks something like this for iOS - * `["NATIVE_APP","WEBVIEW_28158.2"]` - * The number behind `WEBVIEW` will be a random number in random order. + * The Webview is always connected to the app we are testing, this means we need to get the app identifier and see if the + * webview context is added. For Android this will be the `packageName` and for iOS this will be the `bundleId`. * - * For Android you can get something like - * ["NATIVE_APP","WEBVIEW_com.wdiodemoapp", "WEBVIEW_com.chrome"]`. - * The string behind `WEBVIEW` will the package name of the app that holds - * the webview + * By default you have `NATIVE_APP` as the current context. If a webview is added it will be added to the current contexts. + * We use a custom command to get the current contexts because the official `driver.getContexts()` + * doesn't return enough valuable information which we later on need to switch to the correct webview. + * + * NOTES: + * - Android: The string behind `WEBVIEW` will the package name of the app that holds the webview + * - iOS: The number behind `WEBVIEW` will be a random number in random order. */ - async waitForWebViewContextLoaded () { + async waitForWebViewContextAdded () { await driver.waitUntil( async () => { + // Check this method for detailed webview context information const currentContexts = await this.getCurrentContexts(); + // The name of the webview can be different on Android and iOS, so we need to check for both + // We can get the app identifier for Android with the `driver.getCurrentPackage()` command, but there is no equivalent for iOS + const appIdentifier = driver.isIOS ? IOS_BUNDLE_ID : await driver.getCurrentPackage(); return currentContexts.length > 1 && - currentContexts.find(context => typeof context === 'string' && context.toLowerCase().includes(CONTEXT_REF.WEBVIEW)) !== 'undefined'; + currentContexts.find(context => ( + (driver.isIOS ? (context as IosContext).bundleId : (context as AndroidContext).packageName) === appIdentifier + ) !== undefined); }, { // Wait a max of 45 seconds. Reason for this high amount is that loading // a webview for iOS might take longer @@ -42,24 +121,92 @@ class WebView { } /** - * Switch to native or webview context + * Custom implementation to switch to a webview for Android and iOS */ - async switchToContext (context:string) { - // The first context will always be the NATIVE_APP, - // the second one will always be the WebdriverIO web page - const currentContext = await this.getCurrentContexts(); - await driver.switchContext(currentContext[context === CONTEXT_REF.NATIVE ? 0 : 1] as string); + async switchToContext({ context, title, url }: { context: ContextType, title?: string, url?: string }) { + if (context === CONTEXT_REF.NATIVE_APP) { + return driver.switchContext(CONTEXT_REF.NATIVE_APP); + } + + // Title and url are optional, but if they are provided we can use them to find the correct webview. + // We can't only rely on the context name due to the fact that we can have multiple webviews which + // could have different titles/urls + if (!title && !url) { + console.warn('\nTo get the best result, provide a title and, or url which will be used to find the correct webview. The more information the bigger the chance it will find the correct webview.\n'); + } + + // Get the contexts with our custom method + const currentContexts = await this.getCurrentContexts(); + + let matchingContext; + let packageName; + + // This is where the magic happens, we are going to find the correct context(pae) to switch to for iOS or Android. + if (driver.isIOS) { + matchingContext = this.findMatchingContext({ contexts: currentContexts, identifier: IOS_BUNDLE_ID, title, url }); + } else { + packageName = await driver.getCurrentPackage(); + // 1. To find the correct webview page for Android we need to switch to the webview first + const webviewName = `WEBVIEW_${packageName}`; + await driver.switchContext(webviewName); + // 2. Now we need to find the correct page inside the webview + matchingContext = this.findMatchingContext({ contexts: currentContexts, identifier: packageName, title, url }); + } + + if (!matchingContext) { + throw new Error(this.generateNonMatchingErrorMessage({ + identifier: driver.isIOS ? IOS_BUNDLE_ID : + packageName as string, + title, + url, + })); + } + + // For iOS we can just use the `driver.switchContext` method to switch to the webview, + // but for Android we are already in the webview. We now need to switch to the correct page inside the webview + const switchFunction = driver.isIOS ? driver.switchContext.bind(driver) : driver.switchToWindow.bind(driver); + // Now switch to the correct context + return switchFunction(matchingContext.id); } /** - * Returns an object with the list of all available contexts + * Find a matching context. + * + * NOTE: This is an internal method and should not be called outside of this class */ - async getCurrentContexts ():Promise { - return driver.getContexts(); + private findMatchingContext({ contexts, identifier, title, url }:{contexts: CrossPlatformContexts; identifier: string; title?: string; url?: string; }) { + return contexts.find(context => { + const idMatch = driver.isIOS ? (context as IosContext).bundleId === identifier : (context as AndroidContext).packageName === identifier; + const titleMatches = title ? context.title?.includes(title) : true; + const urlMatches = url ? context.url?.includes(url) : true; + const additionalChecks = driver.isIOS ? true : (context as AndroidContext).androidWebviewData?.attached && (context as AndroidContext).androidWebviewData?.visible; + + return idMatch && titleMatches && urlMatches && additionalChecks; + }); } /** - * Wait for the document to be fully loaded + * Generate an error message for when the identifier matches, but the title or url do not match + * + * NOTE: This is an internal method and should not be called outside of this class + */ + private generateNonMatchingErrorMessage({ identifier, title, url }:{identifier: string, title?: string, url?: string}): string { + let errorMessage = `The ${identifier} matches, but the provided `; + if (title && url) { + errorMessage += `title (${title}) or URL (${url}) do not match any context.`; + } else if (title) { + errorMessage += `title (${title}) does not match any context.`; + } else if (url) { + errorMessage += `URL (${url}) does not match any context.`; + } else { + errorMessage = `The identifier (${identifier}) matches, but no matching context is found.`; + } + return errorMessage; + } + + /** + * Selenium or Appium normally automatically wait for a page to be loaded, but this doesn't work for webviews. + * This method can be called when you have switched to a webview and you want to be sure for the page to be fully loaded. */ async waitForDocumentFullyLoaded () { await driver.waitUntil( @@ -80,10 +227,147 @@ class WebView { * Wait for the website in the webview to be loaded */ async waitForWebsiteLoaded () { - await this.waitForWebViewContextLoaded(); - await this.switchToContext(CONTEXT_REF.WEBVIEW); + await this.waitForWebViewContextAdded(); + // we know we want to switch to the webview of WebdriverIO, so we can already provide the title and url that expect to find. + // This will make the search more accurate + await this.switchToContext({ context: CONTEXT_REF.WEBVIEW, title: 'WebdriverIO', url: 'webdriver.io' }); await this.waitForDocumentFullyLoaded(); - await this.switchToContext(CONTEXT_REF.NATIVE); + await this.switchToContext({ context: CONTEXT_REF.NATIVE_APP }); + } + + /** + * Get the current contexts. + * Instead of using the method `driver.getContexts` we are going to use our + * own implementation to get back more data + */ + async getCurrentContexts(): Promise { + // We will use the `driver.execute('mobile: getContexts')` method to get back the context data, + // this will make it easier to determine which webview/page inside a webview we need to use + // - Android: https://github.com/appium/appium-uiautomator2-driver#mobile-getcontexts + // - iOS: https://appium.github.io/appium-xcuitest-driver/5.12/reference/commands/appium-xcuitest-driver/#mobile-getcontexts + const contexts = await driver.execute('mobile: getContexts') as IosContexts | AndroidInternalContexts; + + return driver.isIOS ? contexts as IosContexts : await this.parsedAndroidContexts(contexts as AndroidInternalContexts); + } + + /** + * Parse the Android array and return the same object as iOS + * + * Android will return something like this + * [ + * { + * "proc": "@webview_devtools_remote_29051", + * "webview": "WEBVIEW_29051", + * "info": { + * "Android-Package": "com.wdiodemoapp", + * "Browser": "Chrome/113.0.5672.136", + * "Protocol-Version": "1.3", + * "User-Agent": "Mozilla/5.0 (Linux; Android 14; sdk_gphone64_arm64 Build/UE1A.230829.036; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.136 Mobile Safari/537.36", + * "V8-Version": "11.3.244.11", + * "WebKit-Version": "537.36 (@2d54072eb2f350d37f3f304c4ba0fafcddbd7e82)", + * "webSocketDebuggerUrl": "ws://127.0.0.1:10900/devtools/browser" + * }, + * "pages": [ + * { + * "description": "{\"attached\":true,\"empty\":false,\"height\":2682,\"never_attached\":false,\"screenX\":0,\"screenY\":144,\"visible\":true,\"width\":1440}", + * "devtoolsFrontendUrl": "https://chrome-devtools-frontend.appspot.com/serve_internal_file/@2d54072eb2f350d37f3f304c4ba0fafcddbd7e82/inspector.html?ws=127.0.0.1:10900/devtools/page/6751C1E052A63B0CA27F839216AEF4B8", + * "faviconUrl": "https://webdriver.io/img/favicon.png", + * "id": "6751C1E052A63B0CA27F839216AEF4B8", + * "title": "WebdriverIO · Next-gen browser and mobile automation test framework for Node.js | WebdriverIO", + * "type": "page", + * "url": "https://webdriver.io/", + * "webSocketDebuggerUrl": "ws://127.0.0.1:10900/devtools/page/6751C1E052A63B0CA27F839216AEF4B8" + * }, + * { + * "description": "", + * "devtoolsFrontendUrl": "https://chrome-devtools-frontend.appspot.com/serve_internal_file/@2d54072eb2f350d37f3f304c4ba0fafcddbd7e82/worker_app.html?ws=127.0.0.1:10900/devtools/page/BB0EE977F0C88F5DF6E50F902A855CDC", + * "id": "BB0EE977F0C88F5DF6E50F902A855CDC", + * "title": "Service Worker https://webdriver.io/sw.js?params=%7B%22offlineMode%22%3Afalse%2C%22debug%22%3Afalse%7D", + * "type": "service_worker", + * "url": "https://webdriver.io/sw.js?params=%7B%22offlineMode%22%3Afalse%2C%22debug%22%3Afalse%7D", + * "webSocketDebuggerUrl": "ws://127.0.0.1:10900/devtools/page/BB0EE977F0C88F5DF6E50F902A855CDC" + * } + * ], + * "webviewName": "WEBVIEW_com.wdiodemoapp" + * } + * ] + * + * This is what the description data means + * - `attached`: + * This indicates whether the web page is currently attached to a web view. A value of true means the page is + * attached and likely active, whereas false indicates it is not. + * - `empty`: + * This property shows whether the web page is empty or not. An empty page typically means that there is no + * significant content loaded in it. true indicates the page is empty, and false indicates it has content. + * - `never_attached`: + * This signifies whether the page has never been attached to a web view. If true, the page has never been + * attached, which could indicate a new or unused page. If false, the page has been attached at some point. + * - `screenX and screenY`: + * These properties give the X and Y coordinates of the web page on the screen, respectively. They indicate + * the position of the top-left corner of the web page relative to the screen. + * - `visible`: + * This denotes whether the web page is visible on the screen. true means the page is visible to the user, + * and false means it is not. + * - `width and height`: + * These properties specify the dimensions of the web page in pixels. width is the width of the page, and + * height is its height. + * - `faviconUrl` (if present): + * This is the URL of the favicon (the small icon associated with the page, often displayed in browser tabs). + */ + async parsedAndroidContexts(contexts: AndroidInternalContexts): Promise { + // Android can give back multiple apps that support WebViews, so an array of WebView apps. + // We want to get the webview of the current app, so we need to have the package name of the app, we can then + // search for it and filter all other apps out. + const currentPackageName = await driver.getCurrentPackage(); + const currentWebviewName = `WEBVIEW_${currentPackageName}`; + + const currentContext = contexts + .find((webview) => webview.webviewName === currentWebviewName); + + let result = [{ id: 'NATIVE_APP' }]; + + if (!currentContext || !currentContext.pages) { + return result; + } + + const activePages = currentContext.pages + .filter((page) => { + if (page.type === 'page' && page.description) { + let descriptionObj; + try { + descriptionObj = JSON.parse(page.description); + } catch (e) { + console.error('Failed to parse description:', page.description); + return false; + } + + return descriptionObj.attached === true && descriptionObj.visible === true; + } + return false; + }) + // Reconstruct the data so it will be "equal" to iOS WebView object. + .map((page) => { + const { attached, empty, never_attached: neverAttached, visible } = JSON.parse(page.description); + + return { + id: page.id, + title: page.title, + url: page.url, + packageName: currentPackageName, + webviewName: currentWebviewName, + androidWebviewData:{ + attached, + empty, + neverAttached, + visible, + } + }; + }); + + // Append any active pages to the result array. + result = result.concat(activePages); + + return result; } } diff --git a/tests/specs/app.webview.spec.ts b/tests/specs/app.webview.spec.ts index 9022b34b..4be952a3 100644 --- a/tests/specs/app.webview.spec.ts +++ b/tests/specs/app.webview.spec.ts @@ -2,7 +2,6 @@ import TabBar from '../screenobjects/components/TabBar.js'; import WebViewScreen from '../screenobjects/WebviewScreen.js'; import SwipeScreen from '../screenobjects/SwipeScreen.js'; import { CONTEXT_REF } from '../helpers/WebView.js'; -import Carousel from '../screenobjects/components/Carousel.js'; describe('WebdriverIO and Appium, when interacting with a WebView,', () => { beforeEach(async () => { @@ -19,9 +18,15 @@ describe('WebdriverIO and Appium, when interacting with a WebView,', () => { }); it('should be able search for the url method and open it', async () => { - // To be able to use the site in the webview webdriver.io we first need to + // To be able to use the site in the webview of the app we first need to // change the context from native to webview - await WebViewScreen.switchToContext(CONTEXT_REF.WEBVIEW); + // This is a custom method, check the source in `./helpers/WebView.js` + await WebViewScreen.switchToContext({ + context: CONTEXT_REF.WEBVIEW, + // This is extra data to make sure we have the correct webview + title: 'WebdriverIO', + url: 'webdriver.io', + }); // Now the site can be accessed like you would automate a normal website // keep in mind the responsiveness @@ -48,19 +53,26 @@ describe('WebdriverIO and Appium, when interacting with a WebView,', () => { * because you should never rely on the state of a different test, * but here it is excepted ;-) */ - await WebViewScreen.switchToContext(CONTEXT_REF.NATIVE); + await WebViewScreen.switchToContext({ context:CONTEXT_REF.NATIVE_APP }); }); - it.only('should be able to switch between webview, native and webview', async () => { - // To be able to use the site in the webview webdriver.io first needs + it('should be able to switch between webview, native and webview', async () => { + // To be able to use the site in the webview of the app we first need to // change the context from native to webview - await WebViewScreen.switchToContext(CONTEXT_REF.WEBVIEW); + // This is a custom method, check the source in `./helpers/WebView.js` + await WebViewScreen.switchToContext({ + context: CONTEXT_REF.WEBVIEW, + // This is extra data to make sure we have the correct webview + title: 'WebdriverIO', + url: 'webdriver.io', + }); // Open the search options await $('.DocSearch').click(); // Wait for the search box to be there // We don't put an expect here because the wait for will fail if the element is not there. // This means this is already an "indirect" expectation await $('.DocSearch-Input').waitForDisplayed(); + await driver.pause(5000); // Hide the keyboard if shown if (await driver.isKeyboardShown()) { /** @@ -76,21 +88,18 @@ describe('WebdriverIO and Appium, when interacting with a WebView,', () => { */ await $('.DocSearch-Footer').click(); } + // Now open the swipe screen and do some action there // This can only be done if webdriver.io is told to go to the native context - await WebViewScreen.switchToContext(CONTEXT_REF.NATIVE); + await WebViewScreen.switchToContext({ context: CONTEXT_REF.NATIVE_APP }); await TabBar.openSwipe(); await SwipeScreen.waitForIsShown(); - await expect(await Carousel.getNthCardText('first')).toContain('FULLY OPEN SOURCE'); - - await Carousel.swipeLeft(); - await expect(await Carousel.getNthCardText('active')).toContain('GREAT COMMUNITY'); // Now go back to the webview. It will automatically open in the previous state await TabBar.openWebView(); // To be able to use the site in the webview webdriver.io first needs // change the context from native to webview - await WebViewScreen.switchToContext(CONTEXT_REF.WEBVIEW); + await WebViewScreen.switchToContext({ context: CONTEXT_REF.WEBVIEW }); // Search for the OCR service await $('.DocSearch-Input').setValue('ocr service for appium native apps'); // There might be a history, so make sure the first result is in the `Services` category @@ -101,7 +110,7 @@ describe('WebdriverIO and Appium, when interacting with a WebView,', () => { await $('#docsearch-item-0 a').click(); // Now wait for the header to be displayed and verify that we are on the correct page - await $('h1').waitForDisplayed({ timeout: 3000 }); - await expect(await driver.getTitle()).toEqual('OCR service for Appium Native Apps Service | WebdriverIO'); + await $('header h1').waitForDisplayed({ timeout: 3000 }); + await expect(await $('header h1').getText()).toContain('OCR service for Appium Native Apps Service'); }); }); From 1e9f68b8e09d41c9531d954d989894c0f0f71499 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Fri, 5 Jan 2024 08:04:10 +0100 Subject: [PATCH 06/18] fix: fix and upgrade gestures --- tests/helpers/Gestures.ts | 248 +++++++++++---------- tests/screenobjects/SwipeScreen.ts | 5 +- tests/screenobjects/components/Carousel.ts | 88 +++----- tests/specs/app.swipe.spec.ts | 28 ++- 4 files changed, 180 insertions(+), 189 deletions(-) diff --git a/tests/helpers/Gestures.ts b/tests/helpers/Gestures.ts index ab3b74e2..75271ac4 100644 --- a/tests/helpers/Gestures.ts +++ b/tests/helpers/Gestures.ts @@ -1,123 +1,157 @@ -import { RectReturn } from '@wdio/protocols'; - -/** - * To make a Gesture methods more robust for multiple devices and also - * multiple screen sizes the advice is to work with percentages instead of - * actual coordinates. The percentages will calculate the position on the - * screen based on the SCREEN_SIZE which will be determined once if needed - * multiple times. - */ - -let SCREEN_SIZE:RectReturn; interface XY { x:number; y:number; } -/** - * The values in the below object are percentages of the screen - */ -const SWIPE_DIRECTION = { - down: { - start: { x: 50, y: 15 }, - end: { x: 50, y: 85 }, - }, - left: { - start: { x: 95, y: 50 }, - end: { x: 5, y: 50 }, - }, - right: { - start: { x: 5, y: 50 }, - end: { x: 95, y: 50 }, - }, - up: { - start: { x: 50, y: 85 }, - end: { x: 50, y: 15 }, - }, -}; +export const DIRECTIONS = { + // Starting Point: You place your finger towards the top of the screen. + // Movement: You slide your finger downwards towards the bottom of the screen. + // Action: This also varies by context: + // - On the home screen or in applications, it typically scrolls the content upwards. + // - From the top edge, it often opens the notifications panel or quick settings. + // - In browsers or reading apps, it can be used to scroll through content. + DOWN: 'down', + // Starting Point: You place your finger on the right side of the screen. + // Movement: You slide your finger horizontally to the left. + // Action: The response to this gesture depends on the application: + // - It can move to the next item in a carousel or a set of images. + // - In a navigation context, it might go back to the previous page or close the current view. + // - On the home screen, it usually switches to the next virtual desktop or screen. + LEFT: 'left', + // Starting Point: You place your finger on the left side of the screen. + // Movement: You slide your finger horizontally to the right. + // Action: Similar to swiping left, but in the opposite direction: + // - It often moves to the previous item in a carousel or gallery. + // - Can be used to open side menus or navigation drawers in apps. + // - On the home screen, it typically switches to the previous virtual desktop. + RIGHT: 'right', + // Starting Point: You place your finger towards the bottom of the screen. + // Movement: You slide your finger upwards towards the top of the screen. + // Action: Depending on the context, different actions can occur: + // - On the home screen or in a list, this usually scrolls the content downwards. + // - In a full-screen app, it might open additional options or the app drawer. + // - On certain interfaces, it could trigger a 'refresh' action or open a search bar. + UP: 'up', +} as const; +type SwipeDirectionType = typeof DIRECTIONS[keyof typeof DIRECTIONS]; class Gestures { /** * Check if an element is visible and if not wipe up a portion of the screen to * check if it visible after x amount of scrolls */ - static async checkIfDisplayedWithSwipeUp (element:WebdriverIO.Element, maxScrolls:number, amount = 0){ + static async checkIfDisplayedWithSwipe ( + { + scrollContainer, + searchableElement, + maxScrolls, + amount=0, + direction=DIRECTIONS.DOWN, + // Never scroll from the exact top or bottom of the screen, you might trigger the notification bar or other OS/App features + percentage=0.99, + }: + { + scrollContainer:WebdriverIO.Element, + searchableElement:WebdriverIO.Element, + maxScrolls:number, + amount?: number, + direction?: SwipeDirectionType, + percentage?: number, + } + ){ // If the element is not displayed and we haven't scrolled the max amount of scrolls // then scroll and execute the method again - if (!await element.isDisplayed() && amount <= maxScrolls) { - await this.swipeUp(0.85); - await this.checkIfDisplayedWithSwipeUp(element, maxScrolls, amount + 1); + if (!await searchableElement.isDisplayed() && amount <= maxScrolls) { + // 1. Determine the percentage of the scrollable container to be scrolled + // The scroll percentage is the percentage of the scrollable container that should be scrolled + let scrollPercentage; + if (isNaN(percentage)){ + console.log('\nThe percentage to scroll should be a number.\n'); + // Never scroll from the exact top or bottom of the screen, you might trigger the notification bar or other OS/App features + scrollPercentage = 0.99; + } else if (percentage > 1) { + console.log('\nThe percentage to scroll should be a number between 0 and 1.\n'); + // Never scroll from the exact top or bottom of the screen, you might trigger the notification bar or other OS/App features + scrollPercentage = 0.99; + } else { + scrollPercentage = 1-percentage; + } + + // 2. Determine the swipe coordinates + // When we get the element rect we get the position of the element on the screen based on the + // - x (position from the left of the screen) + // - y (position from the top of the screen) + // - width (width of the element) + // - height (height of the element) + // We can use this to calculate the position of the swipe by determining the + // - top + // - right + // - bottom + // - left + // of the element. These positions will contain the x and y coordinates on where to put the finger + const { x, y, width, height } = await driver.getElementRect(scrollContainer.elementId); + // It's always advisable to swipe from the center of the element. + const scrollRectangles = { + // The x is the center of the element, + // The y is the y of the element + the height of the element * the scroll percentage + top: { x: Math.round(x + width / 2), y: Math.round(y + height * scrollPercentage) }, + // The x is the x of the element + the width of the element, minus the width of the element * the scroll percentage + // The y is the center of the element, + right: { x: Math.round(x + width - width * scrollPercentage), y: Math.round(y + height / 2) }, + // The x is the center of the element, + // The y is the y of the element, plus the height, minus the height of the element * the scroll percentage + bottom: { x: Math.round(x + width / 2), y: Math.round(y + height - height * scrollPercentage) }, + // The x is the x of the element, plus the width of the element * the scroll percentage + // The y is the center of the element, + left: { x: Math.round(x + width * scrollPercentage), y: Math.round(y + height / 2) }, + }; + + // 3. Swipe in the given direction + if (direction === DIRECTIONS.DOWN) { + await this.swipe({ + from: scrollRectangles.top, + to: scrollRectangles.bottom, + }); + } else if (direction === DIRECTIONS.LEFT) { + await this.swipe({ + from: scrollRectangles.right, + to: scrollRectangles.left, + }); + } else if (direction === DIRECTIONS.RIGHT) { + await this.swipe({ + from: scrollRectangles.left, + to: scrollRectangles.right, + }); + } else if (direction === DIRECTIONS.UP) { + await this.swipe({ + from: scrollRectangles.bottom, + to: scrollRectangles.top, + }); + } else { + console.log('\nThe direction to scroll should be one of the following: down, left, right or up.\n'); + } + + // 4. Check if the element is visible or swipe again + await this.checkIfDisplayedWithSwipe({ + scrollContainer, + searchableElement, + maxScrolls, + amount:amount + 1, + direction, + percentage, + }); } else if (amount > maxScrolls) { // If the element is still not visible after the max amount of scroll let it fail - throw new Error(`The element '${element}' could not be found or is not visible.`); + throw new Error(`The element '${searchableElement}' could not be found or is not visible.`); } // The element was found, proceed with the next action } - /** - * Swipe down based on a percentage - */ - static async swipeDown (percentage = 1) { - await this.swipeOnPercentage( - this.calculateXY(SWIPE_DIRECTION.down.start, percentage), - this.calculateXY(SWIPE_DIRECTION.down.end, percentage), - ); - } - - /** - * Swipe Up based on a percentage - */ - static async swipeUp (percentage = 1) { - await this.swipeOnPercentage( - this.calculateXY(SWIPE_DIRECTION.up.start, percentage), - this.calculateXY(SWIPE_DIRECTION.up.end, percentage), - ); - } - - /** - * Swipe left based on a percentage - */ - static async swipeLeft (percentage = 1) { - await this.swipeOnPercentage( - this.calculateXY(SWIPE_DIRECTION.left.start, percentage), - this.calculateXY(SWIPE_DIRECTION.left.end, percentage), - ); - } - - /** - * Swipe right based on a percentage - */ - static async swipeRight (percentage = 1) { - await this.swipeOnPercentage( - this.calculateXY(SWIPE_DIRECTION.right.start, percentage), - this.calculateXY(SWIPE_DIRECTION.right.end, percentage), - ); - } - - /** - * Swipe from coordinates (from) to the new coordinates (to). The given coordinates are - * percentages of the screen. - */ - static async swipeOnPercentage (from: XY, to: XY) { - // Get the screen size and store it so it can be re-used. - // This will save a lot of webdriver calls if this methods is used multiple times. - SCREEN_SIZE = SCREEN_SIZE || await driver.getWindowRect(); - // Get the start position on the screen for the swipe - const pressOptions = this.getDeviceScreenCoordinates(SCREEN_SIZE, from); - // Get the move to position on the screen for the swipe - const moveToScreenCoordinates = this.getDeviceScreenCoordinates(SCREEN_SIZE, to); - - await this.swipe( - pressOptions, - moveToScreenCoordinates, - ); - } - /** * Swipe from coordinates (from) to the new coordinates (to). The given coordinates are in pixels. */ - static async swipe (from: XY, to: XY) { + static async swipe ({ from, to }:{from: XY, to: XY}) { await driver.performActions([ { // a. Create the event @@ -144,26 +178,6 @@ class Gestures { // Add a pause, just to make sure the swipe is done await driver.pause(1000); } - - /** - * Get the screen coordinates based on a device his screen size - */ - private static getDeviceScreenCoordinates (screenSize:RectReturn, coordinates: XY): XY { - return { - x: Math.round(screenSize.width * (coordinates.x / 100)), - y: Math.round(screenSize.height * (coordinates.y / 100)), - }; - } - - /** - * Calculate the x y coordinates based on a percentage - */ - private static calculateXY ({ x, y }:XY, percentage:number):XY { - return { - x: x * percentage, - y: y * percentage, - }; - } } export default Gestures; diff --git a/tests/screenobjects/SwipeScreen.ts b/tests/screenobjects/SwipeScreen.ts index 39cca6ea..eaec22e8 100644 --- a/tests/screenobjects/SwipeScreen.ts +++ b/tests/screenobjects/SwipeScreen.ts @@ -1,11 +1,14 @@ import AppScreen from './AppScreen.js'; +const SWIPE_SCREEN_SELECTOR = '~Swipe-screen'; class SwipeScreen extends AppScreen { constructor () { - super('~Swipe-screen'); + super(SWIPE_SCREEN_SELECTOR); } + get screen () {return $(SWIPE_SCREEN_SELECTOR);} get logo () {return $('~WebdriverIO logo');} + } export default new SwipeScreen(); diff --git a/tests/screenobjects/components/Carousel.ts b/tests/screenobjects/components/Carousel.ts index 44b0c65a..311d4eaa 100644 --- a/tests/screenobjects/components/Carousel.ts +++ b/tests/screenobjects/components/Carousel.ts @@ -1,15 +1,20 @@ import Gestures from '../../helpers/Gestures.js'; import type { RectReturn } from '@wdio/protocols'; -const SELECTORS = { - CAROUSEL: '~Carousel', - CARD: '~card', -}; - let CAROUSEL_RECTANGLES: RectReturn; class Carousel extends Gestures { - private get cards () {return $$(SELECTORS.CARD);} + get carousel () {return $('~Carousel');} + get openSourceCard () {return $(this.locatorStrategy('__CAROUSEL_ITEM_0_READY__'));} + get communityCard () {return $(this.locatorStrategy('__CAROUSEL_ITEM_1_READY__'));} + get jsFoundationCard () {return $(this.locatorStrategy('__CAROUSEL_ITEM_2_READY__'));} + get supportVideosCard () {return $(this.locatorStrategy('__CAROUSEL_ITEM_3_READY__'));} + get extendableCard () {return $(this.locatorStrategy('__CAROUSEL_ITEM_4_READY__'));} + get compatibleCard () {return $(this.locatorStrategy('__CAROUSEL_ITEM_5_READY__'));} + + private locatorStrategy (selector: string): string { + return driver.isIOS ? `~${selector}` : `//*[@resource-id="${selector}"]`; + } /** * Wait for the carousel to be (un)visible @@ -17,57 +22,20 @@ class Carousel extends Gestures { * @param {boolean} isShown */ async waitForIsDisplayed (isShown = true) { - await $(SELECTORS.CAROUSEL).waitForDisplayed({ + await this.carousel.waitForDisplayed({ reverse: !isShown, }); } /** - * Get the text of the active cart. - * - * Carousel only has a max of 3 elements when 3 or more cards are provided - * When the first or last card is active then 2 elements are present - * - * if first card is active - * the first of 2 elements is the active card - * else if last card is active - * the last of 2 elements is the active card - * else - * there are 3 elements and the active card is the middle one - * - * Use 'first' to indicate the first card, else use a different word to - * indicate the other card like for example 'active'. + * There are 6 cards in the carousel, but only 1 is fully, and 1 is partially visible. + * We can validate which card is active by checking if it is fully visible. + * This can be done by checking if the card has position x=0. */ - async getNthCardText (nthCard:string):Promise { - await this.waitForIsDisplayed(); - await driver.waitUntil( - async () => await this.cards.length > 0, - { - timeoutMsg: 'Expected to have more than 0 cards', - }, - ); + async isCardActive (card: WebdriverIO.Element) { + const cardRectangles = await driver.getElementRect(card.elementId); - const cardNumber = (nthCard === 'first' || await this.cards.length === 1) ? 0 : 1; - /** - * IMPORTANT: - * iOS gives back the text of all child elements when you call `element.getText()` on the parent element. - * Android DOES NOT have the text of the child elements on the parent, we need to get them ourselves. - */ - let cardText = ''; - - if (driver.isAndroid) { - const cards = await (await this.cards)[cardNumber].$$('*//android.widget.TextView'); - - for (const el of cards) { - cardText = `${cardText} ${await el.getText()}`; - } - } else { - cardText = (await(await this.cards)[cardNumber].getText()).trim(); - } - - return cardText - // Replace all possible breaks, tabs and so on with a single space - .replace(/(?:\r\n|\r|\n)/g, ' '); + return cardRectangles.x === 0; } /** @@ -81,14 +49,14 @@ class Carousel extends Gestures { const y = Math.round(carouselRectangles.y + (carouselRectangles.height / 2)); // Execute the gesture by providing a starting position and an end position - await Gestures.swipe( + await Gestures.swipe({ // Here we start on the right of the carousel. To make sure that we don't touch the outer most right // part of the screen we take 10% of the x-position. The y-position has already been determined. - { x: Math.round(carouselRectangles.width - (carouselRectangles.width * 0.10)), y }, + from: { x: Math.round(carouselRectangles.width - (carouselRectangles.width * 0.10)), y }, // Here we end on the left of the carousel. To make sure that we don't touch the outer most left // part of the screen we add 10% to the x-position. The y-position has already been determined. - { x: Math.round(carouselRectangles.x + (carouselRectangles.width * 0.10)), y }, - ); + to: { x: Math.round(carouselRectangles.x + (carouselRectangles.width * 0.10)), y }, + }); } /** @@ -102,14 +70,14 @@ class Carousel extends Gestures { const y = Math.round(carouselRectangles.y + (carouselRectangles.height / 2)); // Execute the gesture by providing a starting position and an end position - await Gestures.swipe( + await Gestures.swipe({ // Here we start on the left of the carousel. To make sure that we don't touch the outer most left // part of the screen we add 10% to the x-position. The y-position has already been determined. - { x: Math.round(carouselRectangles.x + (carouselRectangles.width * 0.10)), y }, + from: { x: Math.round(carouselRectangles.x + (carouselRectangles.width * 0.10)), y }, // Here we end on the right of the carousel. To make sure that we don't touch the outer most right // part of the screen we take 10% of the x-position. The y-position has already been determined. - { x: Math.round(carouselRectangles.width - (carouselRectangles.width * 0.10)), y }, - ); + to: { x: Math.round(carouselRectangles.width - (carouselRectangles.width * 0.10)), y }, + }); } /** @@ -117,9 +85,9 @@ class Carousel extends Gestures { */ async getCarouselRectangles (): Promise { // Get the rectangles of the carousel and store it in a global that will be used for a next call. - // We dont want ask for the rectangles of the carousel if we already know them. + // We don't want ask for the rectangles of the carousel if we already know them. // This will save unneeded webdriver calls. - CAROUSEL_RECTANGLES = CAROUSEL_RECTANGLES || await driver.getElementRect(await $(SELECTORS.CAROUSEL).elementId); + CAROUSEL_RECTANGLES = CAROUSEL_RECTANGLES || await driver.getElementRect((await this.carousel).elementId); return CAROUSEL_RECTANGLES; } diff --git a/tests/specs/app.swipe.spec.ts b/tests/specs/app.swipe.spec.ts index d6090a1e..c2a0d8f7 100644 --- a/tests/specs/app.swipe.spec.ts +++ b/tests/specs/app.swipe.spec.ts @@ -1,7 +1,7 @@ import TabBar from '../screenobjects/components/TabBar.js'; import SwipeScreen from '../screenobjects/SwipeScreen.js'; import Carousel from '../screenobjects/components/Carousel.js'; -import Gestures from '../helpers/Gestures.js'; +import Gestures, { DIRECTIONS } from '../helpers/Gestures.js'; describe('WebdriverIO and Appium, when using swiping', () => { beforeEach(async () => { @@ -12,42 +12,48 @@ describe('WebdriverIO and Appium, when using swiping', () => { it('should be able to swipe horizontal by swiping the carousel from left to right', async () => { /** - * To understand what happens in `getNthCardText()` please check the method + * To understand what happens in `isCardActive()` please check the method */ - await expect(await Carousel.getNthCardText('first')).toContain('FULLY OPEN SOURCE'); + await expect(await Carousel.isCardActive(await Carousel.openSourceCard)).toBeTruthy(); /** * To understand what happens in `swipeLeft()` please check the method */ await Carousel.swipeLeft(); - await expect(await Carousel.getNthCardText('active')).toContain('GREAT COMMUNITY'); + await expect(await Carousel.isCardActive(await Carousel.communityCard)).toBeTruthy(); await Carousel.swipeLeft(); - await expect(await Carousel.getNthCardText('active')).toContain( 'JS.FOUNDATION'); + await expect(await Carousel.isCardActive(await Carousel.jsFoundationCard)).toBeTruthy(); await Carousel.swipeLeft(); - await expect(await Carousel.getNthCardText('active')).toContain( 'SUPPORT VIDEOS'); + await expect(await Carousel.isCardActive(await Carousel.supportVideosCard)).toBeTruthy(); await Carousel.swipeLeft(); await Carousel.swipeLeft(); - await expect(await Carousel.getNthCardText('active')).toContain('COMPATIBLE'); + await expect(await Carousel.isCardActive(await Carousel.compatibleCard)).toBeTruthy(); /** * To understand what happens in `swipeRight()` please check the method */ await Carousel.swipeRight(); - await expect(await Carousel.getNthCardText('active')).toContain('EXTENDABLE'); + await expect(await Carousel.isCardActive(await Carousel.extendableCard)).toBeTruthy(); await Carousel.swipeRight(); await Carousel.swipeRight(); await Carousel.swipeRight(); await Carousel.swipeRight(); - await expect(await Carousel.getNthCardText('first')).toContain('FULLY OPEN SOURCE'); + await expect(await Carousel.isCardActive(await Carousel.openSourceCard)).toBeTruthy(); }); it('should be able to swipe vertical by finding the surprise', async ()=>{ - // Swipe horizontal and try to find the element. You can only swipe a max of 5 times - await Gestures.checkIfDisplayedWithSwipeUp(await SwipeScreen.logo, 5); + // Swipe vertical and try to find the element. You can only swipe a max of 5 times + await Gestures.checkIfDisplayedWithSwipe({ + scrollContainer: await SwipeScreen.screen, + searchableElement: await SwipeScreen.logo, + maxScrolls: 5, + direction: DIRECTIONS.UP, + percentage: 0.95, + }); await expect(SwipeScreen.logo).toBeDisplayed(); }); }); From 2f9fad3c202b682da998de9cbef801180f5f01c1 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sat, 6 Jan 2024 15:09:36 +0100 Subject: [PATCH 07/18] chore: added native commented swipe --- tests/screenobjects/components/Carousel.ts | 26 +++++++------- tests/specs/app.swipe.spec.ts | 41 ++++++++++++++++++++++ 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/tests/screenobjects/components/Carousel.ts b/tests/screenobjects/components/Carousel.ts index 311d4eaa..7b0156e4 100644 --- a/tests/screenobjects/components/Carousel.ts +++ b/tests/screenobjects/components/Carousel.ts @@ -38,6 +38,18 @@ class Carousel extends Gestures { return cardRectangles.x === 0; } + /** + * Get the carousel position and size + */ + async getCarouselRectangles (): Promise { + // Get the rectangles of the carousel and store it in a global that will be used for a next call. + // We don't want ask for the rectangles of the carousel if we already know them. + // This will save unneeded webdriver calls. + CAROUSEL_RECTANGLES = CAROUSEL_RECTANGLES || await driver.getElementRect((await this.carousel).elementId); + + return CAROUSEL_RECTANGLES; + } + /** * Swipe the carousel to the LEFT (from right to left) */ @@ -49,6 +61,7 @@ class Carousel extends Gestures { const y = Math.round(carouselRectangles.y + (carouselRectangles.height / 2)); // Execute the gesture by providing a starting position and an end position + // Check the Gestures class for more information about the swipe method await Gestures.swipe({ // Here we start on the right of the carousel. To make sure that we don't touch the outer most right // part of the screen we take 10% of the x-position. The y-position has already been determined. @@ -70,6 +83,7 @@ class Carousel extends Gestures { const y = Math.round(carouselRectangles.y + (carouselRectangles.height / 2)); // Execute the gesture by providing a starting position and an end position + // Check the Gestures class for more information about the swipe method await Gestures.swipe({ // Here we start on the left of the carousel. To make sure that we don't touch the outer most left // part of the screen we add 10% to the x-position. The y-position has already been determined. @@ -79,18 +93,6 @@ class Carousel extends Gestures { to: { x: Math.round(carouselRectangles.width - (carouselRectangles.width * 0.10)), y }, }); } - - /** - * Get the carousel position and size - */ - async getCarouselRectangles (): Promise { - // Get the rectangles of the carousel and store it in a global that will be used for a next call. - // We don't want ask for the rectangles of the carousel if we already know them. - // This will save unneeded webdriver calls. - CAROUSEL_RECTANGLES = CAROUSEL_RECTANGLES || await driver.getElementRect((await this.carousel).elementId); - - return CAROUSEL_RECTANGLES; - } } export default new Carousel(); diff --git a/tests/specs/app.swipe.spec.ts b/tests/specs/app.swipe.spec.ts index c2a0d8f7..61c43998 100644 --- a/tests/specs/app.swipe.spec.ts +++ b/tests/specs/app.swipe.spec.ts @@ -56,4 +56,45 @@ describe('WebdriverIO and Appium, when using swiping', () => { }); await expect(SwipeScreen.logo).toBeDisplayed(); }); + + // You will find native a native swipe example below, but it is commented out because even though it looks "simple", + // there are more details you need to know about: + // - the device/OS + // - what is the difference between the native swipe on iOS and Android + // Our advice is to use the methods as described above, but if you want to use the native swipe, please check the official driver docs + // + // it('should be able to swipe the native way', async () => { + // /** + // * To understand what happens in `isCardActive()` please check the method + // */ + // await expect(await Carousel.isCardActive(await Carousel.openSourceCard)).toBeTruthy(); + // if (driver.isAndroid){ + // // Src: https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/android-mobile-gestures.md#mobile-swipegesture + // await driver.execute('mobile: swipeGesture', { + // direction: DIRECTIONS.LEFT, + // // The elementId is not mandatory, you can also swipe based on top, right, bottom, left coordinates. + // // Using coordinates will make it a little bit more complex because you need to calculate the coordinates of the element + // // you want to use to swipe withing. + // // On the other hand, using the elementId will make it easier to swipe, but you need to make sure that the device + // // you are using does not have left or right actions on for example the edge of the screen which would trigger those actions. + // elementId: (await Carousel.carousel).elementId, + // percent: 0.5, + // // Speeds it optional, but if you want to use it, you need to multiply the speed with the displayDensity of the device. + // // speed: {number} * displayDensity + // }); + // } else { + // // Src: https://appium.github.io/appium-xcuitest-driver/5.12/execute-methods/#mobile-swipe + // await driver.execute('mobile: swipe', { + // direction: DIRECTIONS.LEFT, + // elementId: (await Carousel.carousel).elementId, + // // The velocity is not mandatory, it is measured in pixels per second and same values could behave differently + // // on different devices depending on their display density. + // velocity: 250, + // }); + // } + + // // For demo purposes + // await driver.pause(3000); + + // }); }); From 299814a63525aab5d8f20756d3dff76cafdff0bc Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sat, 6 Jan 2024 15:36:01 +0100 Subject: [PATCH 08/18] chore: update gesture with driver.actions --- tests/helpers/Gestures.ts | 85 ++++++++++++++-------- tests/screenobjects/components/Carousel.ts | 4 +- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/tests/helpers/Gestures.ts b/tests/helpers/Gestures.ts index 75271ac4..15937bf4 100644 --- a/tests/helpers/Gestures.ts +++ b/tests/helpers/Gestures.ts @@ -108,22 +108,22 @@ class Gestures { // 3. Swipe in the given direction if (direction === DIRECTIONS.DOWN) { - await this.swipe({ + await this.executeGesture({ from: scrollRectangles.top, to: scrollRectangles.bottom, }); } else if (direction === DIRECTIONS.LEFT) { - await this.swipe({ + await this.executeGesture({ from: scrollRectangles.right, to: scrollRectangles.left, }); } else if (direction === DIRECTIONS.RIGHT) { - await this.swipe({ + await this.executeGesture({ from: scrollRectangles.left, to: scrollRectangles.right, }); } else if (direction === DIRECTIONS.UP) { - await this.swipe({ + await this.executeGesture({ from: scrollRectangles.bottom, to: scrollRectangles.top, }); @@ -149,32 +149,59 @@ class Gestures { } /** - * Swipe from coordinates (from) to the new coordinates (to). The given coordinates are in pixels. + * Execute a gesture on the screen from coordinates (from) to the new coordinates (to). The given coordinates are in pixels. + * + * There are two ways to execute a gesture: + * 1. The "clean and easy" way + * 2. The "verbose" way + * + * The "clean and easy" way is the recommended way to execute a gesture. It is easier to read and understand. + * The "verbose" way is the way the Appium server expects the gesture to be send to the server and this is also how the "clean" way is translated to. */ - static async swipe ({ from, to }:{from: XY, to: XY}) { - await driver.performActions([ - { - // a. Create the event - type: 'pointer', - id: 'finger1', - parameters: { pointerType: 'touch' }, - actions: [ - // b. Move finger into start position - { type: 'pointerMove', duration: 0, x: from.x, y: from.y }, - // c. Finger comes down into contact with screen - { type: 'pointerDown', button: 0 }, - // d. Pause for a little bit - { type: 'pause', duration: 100 }, - // e. Finger moves to end position - // We move our finger from the center of the element to the - // starting position of the element. - // Play with the duration to make the swipe go slower / faster - { type: 'pointerMove', duration: 1000, x: to.x, y: to.y }, - // f. Finger gets up, off the screen - { type: 'pointerUp', button: 0 }, - ], - }, - ]); + static async executeGesture ({ from, to }:{from: XY, to: XY}) { + // The "clean" way + await driver + // a. Create the event + .action('pointer') + // b. Move finger into start position + .move(from.x, from.y) // This can also be written as .move({ x:from.x, y:from.y }) which allows you to add more options + // c. Finger comes down into contact with screen + .down() // This can also be written as .down({ button:0 }) which allows you to add more options + // d. Pause for a little bit + .pause(100) + // e. Finger moves to end position + .move(to.x, to.y) + // f. Finger gets up, off the screen + .up() // this can also be written as .up({ button:0 }) which allows you to add more options + // g. Perform the action + .perform(); + + // The "verbose" way. The advantage of this way is that you can add more options to control the action in comparison to the "clean and easy" way. + // More information about this can be found here: https://github.com/jlipps/simple-wd-spec?tab=readme-ov-file#perform-actions + // await driver.performActions([ + // { + // // a. Create the event + // type: 'pointer', + // id: 'finger1', + // parameters: { pointerType: 'touch' }, + // actions: [ + // // b. Move finger into start position + // { type: 'pointerMove', duration: 0, x: from.x, y: from.y }, + // // c. Finger comes down into contact with screen + // { type: 'pointerDown', button: 0 }, + // // d. Pause for a little bit + // { type: 'pause', duration: 100 }, + // // e. Finger moves to end position + // // We move our finger from the center of the element to the + // // starting position of the element. + // // Play with the duration to make the swipe go slower / faster + // { type: 'pointerMove', duration: 1000, x: to.x, y: to.y }, + // // f. Finger gets up, off the screen + // { type: 'pointerUp', button: 0 }, + // ], + // }, + // ]); + // Add a pause, just to make sure the swipe is done await driver.pause(1000); } diff --git a/tests/screenobjects/components/Carousel.ts b/tests/screenobjects/components/Carousel.ts index 7b0156e4..fe560703 100644 --- a/tests/screenobjects/components/Carousel.ts +++ b/tests/screenobjects/components/Carousel.ts @@ -62,7 +62,7 @@ class Carousel extends Gestures { // Execute the gesture by providing a starting position and an end position // Check the Gestures class for more information about the swipe method - await Gestures.swipe({ + await Gestures.executeGesture({ // Here we start on the right of the carousel. To make sure that we don't touch the outer most right // part of the screen we take 10% of the x-position. The y-position has already been determined. from: { x: Math.round(carouselRectangles.width - (carouselRectangles.width * 0.10)), y }, @@ -84,7 +84,7 @@ class Carousel extends Gestures { // Execute the gesture by providing a starting position and an end position // Check the Gestures class for more information about the swipe method - await Gestures.swipe({ + await Gestures.executeGesture({ // Here we start on the left of the carousel. To make sure that we don't touch the outer most left // part of the screen we add 10% to the x-position. The y-position has already been determined. from: { x: Math.round(carouselRectangles.x + (carouselRectangles.width * 0.10)), y }, From d981d74a00d643c1924c086374e0e67540aee943 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sat, 6 Jan 2024 17:36:06 +0100 Subject: [PATCH 09/18] chore: fix duration --- tests/helpers/Gestures.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/helpers/Gestures.ts b/tests/helpers/Gestures.ts index 15937bf4..b57e2fca 100644 --- a/tests/helpers/Gestures.ts +++ b/tests/helpers/Gestures.ts @@ -170,7 +170,12 @@ class Gestures { // d. Pause for a little bit .pause(100) // e. Finger moves to end position - .move(to.x, to.y) + // IMPORTANT. The default duration, if you don't provide it, is 100ms. This means that the movement will be so fast that it: + // - might not be registered + // - might not have the correct result on longer movements. + // Short durations will move elements on the screen over longer move coordinates very fast. + // Play with the duration to make the swipe go slower / faster + .move({ duration: 1000, x: to.x, y: to.y }) // f. Finger gets up, off the screen .up() // this can also be written as .up({ button:0 }) which allows you to add more options // g. Perform the action From 2dea0c4495d0e20d76b6f12041e82932df047919 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sat, 6 Jan 2024 17:42:54 +0100 Subject: [PATCH 10/18] fix: fix app.webview.xpath.spec.ts --- tests/specs/app.webview.xpath.spec.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/specs/app.webview.xpath.spec.ts b/tests/specs/app.webview.xpath.spec.ts index 268b302d..359ae843 100644 --- a/tests/specs/app.webview.xpath.spec.ts +++ b/tests/specs/app.webview.xpath.spec.ts @@ -6,8 +6,6 @@ describe('WebdriverIO and Appium, when interacting with a webview through XPATH' let start:number; beforeEach(async () => { - // @ts-expect-error command deprecated - await browser.reset(); await TabBar.waitForTabBarShown(); await TabBar.openWebView(); start = Date.now(); @@ -28,7 +26,7 @@ describe('WebdriverIO and Appium, when interacting with a webview through XPATH' }); it('should be able to verify that the WebView is shown by switching to the WebView', async () => { - await WebViewScreen.waitForWebViewContextLoaded(); + await WebViewScreen.waitForWebsiteLoaded(); const end = Date.now(); timeDifference('Test time for switching to the WebView', start, end); }); From 5d79327b9138b7a05427f2c34e5369bc44a7250a Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sat, 6 Jan 2024 17:57:33 +0100 Subject: [PATCH 11/18] fix: fix iOS deeplink --- tests/helpers/Utils.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/helpers/Utils.ts b/tests/helpers/Utils.ts index 5fc56160..fbefc0e2 100644 --- a/tests/helpers/Utils.ts +++ b/tests/helpers/Utils.ts @@ -27,13 +27,10 @@ export async function openDeepLinkUrl(url:string) { // - https://blog.diawi.com/2018/10/15/2018-apple-devices-and-their-new-udid-format/ // - https://www.theiphonewiki.com/wiki/UDID // iOS sims have more than 1 `-` in the UDID and the UDID is being - const simulatorRegex = new RegExp('(.*-.*){2,}'); + const realDeviceRegex = /^[a-f0-9]{25}|[a-f0-9]{40}$/i; - // Check if we are a simulator - if ('appium:udid' in driver.capabilities && simulatorRegex.test(driver.capabilities['appium:udid'] as string)){ - await driver.url(`${ prefix }${ url }`); - } else { - // Else we are a real device and we need to take some extra steps + // Check if we are a real device + if ('appium:udid' in driver.capabilities && realDeviceRegex.test(driver.capabilities['appium:udid'] as string)){ // Launch Safari to open the deep link await driver.execute('mobile: launchApp', { bundleId: 'com.apple.mobilesafari' }); @@ -55,6 +52,9 @@ export async function openDeepLinkUrl(url:string) { // Submit the url and add a break await urlField.setValue(`${ prefix }${ url }\uE007`); + } else { + // Else we ne are a simulator + await driver.url(`${ prefix }${ url }`); } /** From 0ace161a0152d8a7b61e8d50667d055a460ad799 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sat, 6 Jan 2024 18:51:45 +0100 Subject: [PATCH 12/18] fix: fix biometrics for iOS --- tests/helpers/Biometrics.ts | 2 +- tests/helpers/Constants.ts | 2 ++ tests/helpers/Utils.ts | 26 ++++++++++++++----- tests/helpers/WebView.ts | 9 ++++--- tests/screenobjects/components/NativeAlert.ts | 2 +- tests/specs/app.biometric.login.spec.ts | 21 +++++---------- 6 files changed, 36 insertions(+), 26 deletions(-) diff --git a/tests/helpers/Biometrics.ts b/tests/helpers/Biometrics.ts index a005d3d3..3e9a6f28 100644 --- a/tests/helpers/Biometrics.ts +++ b/tests/helpers/Biometrics.ts @@ -2,7 +2,7 @@ import { DEFAULT_PIN, INCORRECT_PIN } from './Constants.js'; class Biometrics { private get iosAllowBiometry() {return $('~Don’t Allow');} - private get allowBiometry() {return $('~OK');} + private get allowBiometry() {return $('~Allow');} private get androidBiometryAlert() { const selector = 'android=new UiSelector().textContains("Please log in")'; diff --git a/tests/helpers/Constants.ts b/tests/helpers/Constants.ts index ea532626..d840c473 100644 --- a/tests/helpers/Constants.ts +++ b/tests/helpers/Constants.ts @@ -1,2 +1,4 @@ export const DEFAULT_PIN = 1234; export const INCORRECT_PIN = 4321; +export const PACKAGE_NAME = 'com.wdiodemoapp'; +export const BUNDLE_ID = 'org.reactjs.native.example.wdiodemoapp'; diff --git a/tests/helpers/Utils.ts b/tests/helpers/Utils.ts index fbefc0e2..c8f80c86 100644 --- a/tests/helpers/Utils.ts +++ b/tests/helpers/Utils.ts @@ -6,6 +6,18 @@ export function timeDifference (string: string, start:number, end:number) { console.log(`${string} It took ${elapsed} seconds.`); } +/** + * iOS sims and real devices can be distinguished by their UDID. Based on these sources there is a diff in the UDIDS + * - https://blog.diawi.com/2018/10/15/2018-apple-devices-and-their-new-udid-format/ + * - https://www.theiphonewiki.com/wiki/UDID + * iOS sims have more than 1 `-` in the UDID and the UDID is being + */ +export function isIosRealDevice(){ + const realDeviceRegex = /^[a-f0-9]{25}|[a-f0-9]{40}$/i; + + return 'appium:udid' in driver.capabilities && realDeviceRegex.test(driver.capabilities['appium:udid'] as string); +} + /** * Create a cross platform solution for opening a deep link */ @@ -23,14 +35,9 @@ export async function openDeepLinkUrl(url:string) { // We can use `driver.url` on iOS simulators, but not on iOS real devices. The reason is that iOS real devices // open Siri when you call `driver.url('')` to use a deep link. This means that real devices need to have a different implementation // then iOS sims - // iOS sims and real devices can be distinguished by their UDID. Based on these sources there is a diff in the UDIDS - // - https://blog.diawi.com/2018/10/15/2018-apple-devices-and-their-new-udid-format/ - // - https://www.theiphonewiki.com/wiki/UDID - // iOS sims have more than 1 `-` in the UDID and the UDID is being - const realDeviceRegex = /^[a-f0-9]{25}|[a-f0-9]{40}$/i; // Check if we are a real device - if ('appium:udid' in driver.capabilities && realDeviceRegex.test(driver.capabilities['appium:udid'] as string)){ + if (isIosRealDevice()){ // Launch Safari to open the deep link await driver.execute('mobile: launchApp', { bundleId: 'com.apple.mobilesafari' }); @@ -75,3 +82,10 @@ export async function openDeepLinkUrl(url:string) { } } +/** + * relaunch the app by closing it and starting it again + */ +export async function relaunchApp(identifier:string) { + await driver.execute('mobile: terminateApp', { bundleId: identifier }); + await driver.execute('mobile: launchApp', { bundleId: identifier }); +} diff --git a/tests/helpers/WebView.ts b/tests/helpers/WebView.ts index 3c186907..646b27f6 100644 --- a/tests/helpers/WebView.ts +++ b/tests/helpers/WebView.ts @@ -1,3 +1,5 @@ +import { BUNDLE_ID } from './Constants.js'; + export const CONTEXT_REF = { NATIVE_APP: 'NATIVE_APP', WEBVIEW: 'WEBVIEW', @@ -7,7 +9,6 @@ const DOCUMENT_READY_STATE = { INTERACTIVE: 'interactive', LOADING: 'loading', }; -const IOS_BUNDLE_ID = 'org.reactjs.native.example.wdiodemoapp'; type ContextType = typeof CONTEXT_REF[keyof typeof CONTEXT_REF]; type AndroidInternalContexts = Array<{ @@ -104,7 +105,7 @@ class WebView { const currentContexts = await this.getCurrentContexts(); // The name of the webview can be different on Android and iOS, so we need to check for both // We can get the app identifier for Android with the `driver.getCurrentPackage()` command, but there is no equivalent for iOS - const appIdentifier = driver.isIOS ? IOS_BUNDLE_ID : await driver.getCurrentPackage(); + const appIdentifier = driver.isIOS ? BUNDLE_ID : await driver.getCurrentPackage(); return currentContexts.length > 1 && currentContexts.find(context => ( @@ -143,7 +144,7 @@ class WebView { // This is where the magic happens, we are going to find the correct context(pae) to switch to for iOS or Android. if (driver.isIOS) { - matchingContext = this.findMatchingContext({ contexts: currentContexts, identifier: IOS_BUNDLE_ID, title, url }); + matchingContext = this.findMatchingContext({ contexts: currentContexts, identifier: BUNDLE_ID, title, url }); } else { packageName = await driver.getCurrentPackage(); // 1. To find the correct webview page for Android we need to switch to the webview first @@ -155,7 +156,7 @@ class WebView { if (!matchingContext) { throw new Error(this.generateNonMatchingErrorMessage({ - identifier: driver.isIOS ? IOS_BUNDLE_ID : + identifier: driver.isIOS ? BUNDLE_ID : packageName as string, title, url, diff --git a/tests/screenobjects/components/NativeAlert.ts b/tests/screenobjects/components/NativeAlert.ts index fededdf5..e3b2bb1a 100644 --- a/tests/screenobjects/components/NativeAlert.ts +++ b/tests/screenobjects/components/NativeAlert.ts @@ -54,7 +54,7 @@ class NativeAlert { */ static async text ():Promise { if (driver.isIOS) { - return driver.getAlertText(); + return $(SELECTORS.IOS.ALERT).getText(); } return `${await $(SELECTORS.ANDROID.ALERT_TITLE).getText()}\n${await $(SELECTORS.ANDROID.ALERT_MESSAGE).getText()}`; diff --git a/tests/specs/app.biometric.login.spec.ts b/tests/specs/app.biometric.login.spec.ts index 2cff2e0c..fb724d9a 100644 --- a/tests/specs/app.biometric.login.spec.ts +++ b/tests/specs/app.biometric.login.spec.ts @@ -3,6 +3,8 @@ import LoginScreen from '../screenobjects/LoginScreen.js'; import Biometrics from '../helpers/Biometrics.js'; import NativeAlert from '../screenobjects/components/NativeAlert.js'; import AndroidSettings from '../screenobjects/AndroidSettings.js'; +import { relaunchApp } from '../helpers/Utils.js'; +import { BUNDLE_ID, PACKAGE_NAME } from '../helpers/Constants.js'; /** * IMPORTANT! @@ -20,8 +22,7 @@ describe('WebdriverIO and Appium, when interacting with a biometric button,', () // iOS us pretty straightforward, just enabled it await driver.toggleEnrollTouchId(true); // restart the app - // @ts-expect-error command deprecated - await driver.reset(); + await relaunchApp(BUNDLE_ID); // Wait for the app again and go to the login screen await goToLoginPage(); @@ -29,8 +30,7 @@ describe('WebdriverIO and Appium, when interacting with a biometric button,', () // Android is more complex, see this method await AndroidSettings.enableBiometricLogin(); // restart the app - // @ts-expect-error command deprecated - await driver.reset(); + await relaunchApp(PACKAGE_NAME); // Wait for the app again and go to the login screen await goToLoginPage(); @@ -46,7 +46,7 @@ describe('WebdriverIO and Appium, when interacting with a biometric button,', () await Biometrics.submitBiometricLogin(true); // Wait for the alert and validate it await NativeAlert.waitForIsShown(); - await expect(await NativeAlert.text()).toContain('Success\nYou are logged in!'); + await expect(await NativeAlert.text()).toContain('Success'); // Close the alert await NativeAlert.topOnButtonWithText('OK'); @@ -61,21 +61,14 @@ describe('WebdriverIO and Appium, when interacting with a biometric button,', () // This method will let the biometric login for OR Android, OR iOS fail. await Biometrics.submitBiometricLogin(false); - // iOS shows an alert, Android doesn't + // Android doesn't show an alert, but keeps the "use fingerprint" native modal in the screen if (driver.isIOS) { // Wait for the alert and validate it await NativeAlert.waitForIsShown(); - await expect(await NativeAlert.text()).toContain('Try Again'); + await expect(await NativeAlert.text()).toContain('Not Recognised'); // Close the alert await NativeAlert.topOnButtonWithText('Cancel'); - try { - // In certain situations we need to Cancel it again for this specific app - await NativeAlert.topOnButtonWithText('Cancel'); - } catch (ign) { - // Do nothing - } - await NativeAlert.waitForIsShown(false); } else { await AndroidSettings.waitAndTap('Cancel'); From 85d57cfc32033a26621a938911d2649d9bb692c8 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sun, 7 Jan 2024 14:01:11 +0100 Subject: [PATCH 13/18] fix: multiple android biometric fixes - improve text matching for UiSelector - replace deprecated `reset` with a custom relaunch app method - improved Android settings Fingerprint flow - dropped support for Android 7 and 8 --- config/wdio.shared.local.appium.conf.ts | 12 ++- tests/helpers/Biometrics.ts | 8 +- tests/helpers/Utils.ts | 9 +- tests/screenobjects/AndroidSettings.ts | 138 ++++++++++++------------ tests/specs/app.biometric.login.spec.ts | 14 +-- 5 files changed, 97 insertions(+), 84 deletions(-) diff --git a/config/wdio.shared.local.appium.conf.ts b/config/wdio.shared.local.appium.conf.ts index 121886c1..84aabff9 100644 --- a/config/wdio.shared.local.appium.conf.ts +++ b/config/wdio.shared.local.appium.conf.ts @@ -24,5 +24,15 @@ export const config: WebdriverIO.Config = { }, }, ], - ] + ], + before: async ()=> { + // Only update the setting for Android, this is needed to reduce the timeout for the UiSelector locator strategy, + // which is also used in certain tests, so it will not wait for 10 seconds if it can't find an element + if (driver.isAndroid){ + await driver.updateSettings({ + // This reduces the timeout for the UiUiSelector from 10 seconds to 3 seconds + waitForSelectorTimeout: 3 * 1000 + }); + } + } }; diff --git a/tests/helpers/Biometrics.ts b/tests/helpers/Biometrics.ts index 3e9a6f28..2c46aee5 100644 --- a/tests/helpers/Biometrics.ts +++ b/tests/helpers/Biometrics.ts @@ -4,9 +4,9 @@ class Biometrics { private get iosAllowBiometry() {return $('~Don’t Allow');} private get allowBiometry() {return $('~Allow');} private get androidBiometryAlert() { - const selector = 'android=new UiSelector().textContains("Please log in")'; + const regex = '(Please log in|Login with.*)'; - return $(selector); + return $(`android=new UiSelector().textMatches("${regex}")`); } /** @@ -36,7 +36,7 @@ class Biometrics { async allowIosBiometricUsage() { // When Touch/FaceID is used for the first time it could be that an alert is shown which needs to be accepted try { - await this.iosAllowBiometry.waitForDisplayed({ timeout: 3000 }); + await this.iosAllowBiometry.waitForDisplayed({ timeout: 3 * 1000 }); await this.allowBiometry.click(); } catch (e) { // This means that allow using touch/facID has already been accepted and thus the alert is not shown @@ -47,7 +47,7 @@ class Biometrics { * Submit Android biometric login */ async submitAndroidBiometricLogin(fingerprintId:number) { - await this.androidBiometryAlert.waitForDisplayed(); + await this.androidBiometryAlert.waitForDisplayed({ timeout: 10 *1000 }); await driver.fingerPrint(fingerprintId); } diff --git a/tests/helpers/Utils.ts b/tests/helpers/Utils.ts index c8f80c86..9f8e4cac 100644 --- a/tests/helpers/Utils.ts +++ b/tests/helpers/Utils.ts @@ -86,6 +86,11 @@ export async function openDeepLinkUrl(url:string) { * relaunch the app by closing it and starting it again */ export async function relaunchApp(identifier:string) { - await driver.execute('mobile: terminateApp', { bundleId: identifier }); - await driver.execute('mobile: launchApp', { bundleId: identifier }); + const appIdentifier = { [driver.isAndroid ? 'appId' : 'bundleId']: identifier }; + const terminateCommand = 'mobile: terminateApp'; + const launchCommand = `mobile: ${driver.isAndroid ? 'activateApp' : 'launchApp'}`; + + await driver.execute(terminateCommand, appIdentifier); + await driver.execute(launchCommand, appIdentifier); + } diff --git a/tests/screenobjects/AndroidSettings.ts b/tests/screenobjects/AndroidSettings.ts index a18c151a..1d3ad209 100644 --- a/tests/screenobjects/AndroidSettings.ts +++ b/tests/screenobjects/AndroidSettings.ts @@ -6,85 +6,72 @@ class AndroidSettings { */ private get platformVersion(): number { return parseInt( - (('appium:platformVersion' in driver.capabilities && - driver.capabilities['appium:platformVersion']) as string) || '8', + ('platformVersion' in driver.capabilities ? driver.capabilities['platformVersion'] : '9') as string, 10, ); } - /** - * Execute the fingerprint wizard for Android 7 or lower - */ - private async fingerPrintWizardSevenOrLower(pin: number) { - await this.waitAndTap('NEXT'); - await this.setPinSevenOrLower(pin); - await this.touchSensorSevenOrLower(pin); - await this.waitAndTap('DONE'); - } - /** * Enable the finger print through the wizard */ - private async fingerPrintWizardEightOrHigher(pin: number) { - // There is a difference in the order the wizard in Android 10 is executed - if (this.platformVersion > 9) { - await this.reEnterPin(pin); - await this.waitAndTap('NEXT'); + private async fingerPrintWizard(pin: number) { + // There is a difference in the order the wizard in Android 10+ is executed + if (this.platformVersion >= 10) { + await this.postAndroidTenFingerPrintSetup(pin); } else { - await this.waitAndTap('NEXT'); - await this.reEnterPin(pin); + await this.preAndroidTenFingerPrintSetup(pin); } - await this.touchSensorEightAndHigher(pin); + await this.touchFingerPrintSensor(pin); await this.waitAndTap('DONE'); } /** - * Re-enter pin and submit screen + * Pre Android 10 finger print setup steps */ - private async reEnterPin(pin: number) { - await (await this.findAndroidElementByText('Re-enter your PIN')).waitForDisplayed(); - await this.executeAdbCommand(`input text ${pin} && input keyevent 66`); + private async preAndroidTenFingerPrintSetup(pin: number){ + await this.waitAndTap('NEXT'); + await this.reEnterPin(pin); } /** - * Set the pin for Android 7 or lower + * Post Android 10 finger print setup steps */ - private async setPinSevenOrLower(pin: number) { - await this.waitAndTap('Fingerprint + PIN'); - await this.waitAndTap('No thanks'); - await (await this.findAndroidElementByText('Choose your PIN')).waitForDisplayed(); - await this.executeAdbCommand( - `input text ${pin} && input keyevent 66 && input text ${pin} && input keyevent 66`, - ); - await this.waitAndTap('DONE'); + private async postAndroidTenFingerPrintSetup(pin: number){ + await this.reEnterPin(pin); + if (this.platformVersion >= 14) { + await this.waitAndTap('Pixel Imprint'); + } + if (this.platformVersion >= 12) { + await this.waitAndTap('MORE'); + await this.waitAndTap('I AGREE'); + } else { + await this.waitAndTap('NEXT'); + } } /** - * Touch sensor and enable finger print for Android 7 and lower + * Re-enter pin and submit screen */ - private async touchSensorSevenOrLower(touchCode: number) { - await this.waitAndTap('NEXT'); - await (await this.findAndroidElementByText('Put your finger')).waitForDisplayed(); - await driver.fingerPrint(touchCode); - await (await this.findAndroidElementByText('Move your finger')).waitForDisplayed(); - await driver.fingerPrint(touchCode); + private async reEnterPin(pin: number) { + await (await this.findAndroidElementByMatchingText('Re-enter your PIN')).waitForDisplayed({ timeout: 10*1000 }); + await this.executeAdbCommand(`input text ${pin} && input keyevent 66`); } /** - * Touch sensor and enable finger print for Android 8 and higher + * Touch the fingerprint sensor and enable it */ - private async touchSensorEightAndHigher(touchCode: number) { + private async touchFingerPrintSensor(touchCode: number) { // Touch the sensor for the first time to trigger finger print - await (await this.findAndroidElementByText('Touch the sensor')).waitForDisplayed(); + await (await this.findAndroidElementByMatchingText('Touch the sensor.*')).waitForDisplayed({ timeout: 10*1000 }); await driver.fingerPrint(touchCode); // Add finger print - await (await this.findAndroidElementByText('Put your finger')).waitForDisplayed(); + await (await this.findAndroidElementByMatchingText('Put your finger.*')).waitForDisplayed({ timeout: 10*1000 }); await driver.fingerPrint(touchCode); // Confirm finger print - await (await this.findAndroidElementByText('Keep lifting')).waitForDisplayed(); + await (await this.findAndroidElementByMatchingText('Keep lifting.*')).waitForDisplayed({ timeout: 10*1000 }); await driver.fingerPrint(touchCode); } @@ -98,44 +85,63 @@ class AndroidSettings { } /** - * Find an Android element based on text + * Find an Android element based on text that matches a regular expression which is case insensitive */ - async findAndroidElementByText(string: string) { - const selector = `android=new UiSelector().textContains("${string}")`; + async findAndroidElementByMatchingText(string: string) { + const selector = `android=new UiSelector().textMatches("(?i)${string}")`; return $(selector); } + /** + * Wait on an element + */ + async waitForMatchingElement(string: string) { + await (await this.findAndroidElementByMatchingText(string)).waitForDisplayed({ timeout: 10*1000 }); + } /** * Wait and click on an element */ async waitAndTap(string: string) { - await (await this.findAndroidElementByText(string)).waitForDisplayed(); - await (await this.findAndroidElementByText(string)).click(); + await this.waitForMatchingElement(string); + await (await this.findAndroidElementByMatchingText(string)).click(); + } + + /** + * Close the settings Screen lock notifications + */ + async closeSettingsScreenLockNotifications(){ + try { + if (await (await this.findAndroidElementByMatchingText('Set screen lock')).isDisplayed()){ + await $('android=new UiSelector().descriptionContains("Dismiss")').click(); + await $('android=new UiSelector().textMatches("(?i)Dismiss")').click(); + } + } catch (ign) { /* do nothing */ } } /** * This is the core methods to enable FingerPrint for Android. It will walk through all steps to enable - * FingerPrint on Android 7.1 till the latest one all automatically for you. + * FingerPrint on Android 9 (2018) till the latest one all automatically for you. */ async enableBiometricLogin() { - // Android Oreo and higher (Android 8) added `lock settings` to ADB to set the pin. So we need to take - // a different flow Android on lower than OREO - if (this.platformVersion < 8) { - // Open the settings screen - await this.executeAdbCommand( - 'am start -a android.settings.SECURITY_SETTINGS', - ); - await this.waitAndTap('Fingerprint'); - await this.fingerPrintWizardSevenOrLower(DEFAULT_PIN); + // Open the settings screen and set screen lock to pin + await this.executeAdbCommand( + `am start -a android.settings.SECURITY_SETTINGS && locksettings set-pin ${DEFAULT_PIN}`, + ); + // As of Android 14 there is a new flow to enable finger print + if (this.platformVersion >= 14) { + // There might be two Device unlock options, the first is the notification, the second is the actual setting + // First wait for the right screen to be shown + await this.waitForMatchingElement('Device unlock.*'); + // Android 14 might have notifications that might block searching the right element, so we need to close them + await this.closeSettingsScreenLockNotifications(); + await this.waitAndTap('Device unlock'); + await this.waitAndTap('.*Fingerprint Unlock'); } else { - // Open the settings screen and set screen lock to pin - await this.executeAdbCommand( - `am start -a android.settings.SECURITY_SETTINGS && locksettings set-pin ${DEFAULT_PIN}`, - ); - await this.waitAndTap('Fingerprint'); - await this.fingerPrintWizardEightOrHigher(DEFAULT_PIN); + await this.waitAndTap('.*Fingerprint.*'); } + await this.fingerPrintWizard(DEFAULT_PIN); + } } diff --git a/tests/specs/app.biometric.login.spec.ts b/tests/specs/app.biometric.login.spec.ts index fb724d9a..654abfb8 100644 --- a/tests/specs/app.biometric.login.spec.ts +++ b/tests/specs/app.biometric.login.spec.ts @@ -11,7 +11,7 @@ import { BUNDLE_ID, PACKAGE_NAME } from '../helpers/Constants.js'; * To verify if Touch/FaceID for iOS and FingerPrint for Android work we need to verify if they are enabled. This can be done by verifying * if the biometrics button is shown. If not shown we need to enabled it. * For iOS it's pretty straightforward, but for Android is more complex. There is a helper (Android Settings) that will handle all steps for - * you for Android 7.1 till the latest version of Android. + * you for Android 9.0 (2018) till the latest version of Android. */ describe('WebdriverIO and Appium, when interacting with a biometric button,', () => { beforeEach(async () => { @@ -71,16 +71,8 @@ describe('WebdriverIO and Appium, when interacting with a biometric button,', () await NativeAlert.topOnButtonWithText('Cancel'); } else { await AndroidSettings.waitAndTap('Cancel'); - - // When FingerPrint in this app is cancelled on Android 9 and higher it will show the - // FingerPrint modal again. This means it needs to be cancelled again. - // @ts-ignore - if (parseInt(driver.capabilities.platformVersion) > 8){ - // This will show the face ID alert again. Let it fail again to make the alert go away. - await Biometrics.submitBiometricLogin(false); - await AndroidSettings.waitAndTap('Cancel'); - } - await (await AndroidSettings.findAndroidElementByText('Cancel')).waitForDisplayed({ reverse:true }); + // @TODO: This takes very long, need to fix this + await (await AndroidSettings.findAndroidElementByMatchingText('Cancel')).waitForDisplayed({ reverse:true }); await NativeAlert.waitForIsShown(false); } }); From f60e0b67452df7709bd6bb3c39cb31331dd9c79f Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sun, 7 Jan 2024 18:53:30 +0100 Subject: [PATCH 14/18] chore: multiple fixes - explain which fields need to be changed in the configs to make it work locally - fix page objects - fix specs due to page object changes - update readme --- README.md | 73 ++++++++++++------------------ config/wdio.android.app.conf.ts | 8 +++- config/wdio.ios.app.conf.ts | 5 ++ tests/screenobjects/FormsScreen.ts | 13 ++++-- tests/screenobjects/LoginScreen.ts | 19 ++++++-- tests/specs/app.forms.spec.ts | 14 ++++-- tests/specs/app.login.spec.ts | 4 +- 7 files changed, 79 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 67e3c8cc..27aa5a67 100644 --- a/README.md +++ b/README.md @@ -42,11 +42,13 @@ npm install > Use the [appium-installer](https://github.com/AppiumTestDistribution/appium-installer) package to setup Appium on your local machine. This will also help you configure Android Emulators/ iOS Simulators. > [!NOTE] -> When running test in a cloud +> You don't need Appium installed on you local machine When running test in a cloud 3. Create a `./apps` directory at the root of this project. Download the app files (`.zip` / `.apk`) with version >= `1.0.0`, which can be found [here](https://github.com/webdriverio/native-demo-app/releases), into the `./apps` folder. -4. Running tests locally +4. Adjust the configuration file(s) for [Android](./config//wdio.android.app.conf.ts) and [iOS](./config/wdio.ios.app.conf.ts) regarding the device configuration you've created on your local machine. + +5. Running tests locally - **Android App:** `npm run android.app` - **Android Browser:** `npm run android.browser` - **iOS App:** `npm run ios.app` @@ -66,24 +68,19 @@ Choose one of the following options: This boilerplate uses a specific config for iOS and Android, see [configs](./config). The configs are based on a shared config [`wdio.shared.conf.ts`](./config/wdio.shared.conf.ts). -This shared config holds **all the defaults** so the iOS and Android configs only need to hold the capabilities and specs that are needed -for running on iOS and or Android (app or browser). +This shared config holds **all the defaults** so the iOS and Android configs only need to hold the capabilities and specs that are needed for running on iOS and or Android (app or browser). -Please check the [`wdio.shared.conf.ts`](./config/wdio.shared.conf.ts)-file for the minimal configuration options. Notes are added for why -a different value has been selected in comparison to the default values WebdriverIO provides. +Please check the [`wdio.shared.conf.ts`](./config/wdio.shared.conf.ts)-file for the minimal configuration options. Notes are added for why a different value has been selected in comparison to the default values WebdriverIO provides. -Since we do not have Appium installed as part of this package we are going to use the globally installed version of Appium. This is -configured in [`wdio.shared.local.appium.conf.ts`](./config/wdio.shared.local.appium.conf.ts). +Since we do not have Appium installed as part of this package we are going to use the globally installed version of Appium. This is configured in [`wdio.shared.local.appium.conf.ts`](./config/wdio.shared.local.appium.conf.ts). ## Locator strategy for native apps -The locator strategy for this boilerplate is to use `accessibilityID`'s, see also the -[WebdriverIO docs](https://webdriver.io/docs/selectors#accessibility-id) or this newsletter on -[AppiumPro](https://appiumpro.com/editions/20). -`accessibilityID`'s makes it easy to script once and run on iOS and Android because most of the apps already have some `accessibilityID`'s. +The locator strategy for this boilerplate is to use `accessibilityID`s, see also the +[WebdriverIO docs](https://webdriver.io/docs/selectors#accessibility-id) or this newsletter on [AppiumPro](https://appiumpro.com/editions/20). +`accessibilityID`s makes it easy to script once and run on iOS and Android because most of the apps already have some `accessibilityID`s. -If `accessibilityID`'s can't be used, and for example only XPATH is available, then the following setup could be used to make cross-platform -selectors +If `accessibilityID`'s can't be used, and for example only XPATH is available, then the following setup could be used to make cross-platform selectors ```js const SELECTORS = { @@ -94,12 +91,11 @@ const SELECTORS = { ``` > [!NOTE] -> If you look into the screen/page-objects you might see that a lot of selectors are made private, meaning you can use the elements in the spec-file itself. This has been done on purpose because one of the *best practices* is to remove all interactions from your spec files and implement the interactions in the page objects. This will make it easier to maintain for the future and easier to refactor if new interaction methods will be added or names will be adjusted. +> If you look into the screen/page-objects you might see that a lot of selectors are made private, meaning you can't use the elements in the spec-file itself. This has been done on purpose because one of the *best practices* is to remove all interactions from your spec files and implement the interactions in the page objects. This will make it easier to maintain for the future and easier to refactor if new interaction methods will be added or names will be adjusted. ## Native App Tests -All tests can be executed on the devices as configured in [`wdio.android.app.conf.ts`](./config/wdio.android.app.conf.ts) or -[`wdio.ios.app.conf.ts`](./config/wdio.ios.app.conf.ts). Please check the below tests on what they do or how to run them separately. +All tests can be executed on the devices as configured in [`wdio.android.app.conf.ts`](./config/wdio.android.app.conf.ts) or [`wdio.ios.app.conf.ts`](./config/wdio.ios.app.conf.ts). Please check the below tests on what they do or how to run them separately. ```sh # For Android local execution @@ -114,8 +110,7 @@ npm run ios.app Drag-and-drop an element can be a complex gesture to automate with Appium. The demo app has a simple puzzle that hopefully makes it easier and fun to understand how to implement a drag-and-drop in WebdriverIO. The test can be found [here](./tests/specs/app.drag.and.drop.spec.ts) and the drag-and-drop implementation can be found in [this](./tests/screenobjects DragScreen.ts) file. This file will now only hold the [`touchAction`](https://webdriver.io/docs/api/browser/touchAction/) way of using the drag and drop Gesture. -The `touchPerform` is the *old* JSONWP way of implementing a gesture and is not W3C compatible. The `touchAction` is the new official W3C -implementation of a gesture. +The `touchPerform` is the *old* JSONWP way of implementing a gesture and is not W3C compatible. The `touchAction` is the new official W3C implementation of a gesture. You can run the single test with the following commands @@ -136,8 +131,7 @@ The forms tab holds some components that might be a challenge during automation: - Dropdowns / Pickers - Native alerts -The tests and used page objects hopefully explain what you need to do to make this work and can be found -[here](./tests/specs/app.forms.spec.ts). +The tests and used page objects hopefully explain what you need to do to make this work and can be found [here](./tests/specs/app.forms.spec.ts). You can run the single test with the following commands @@ -151,16 +145,15 @@ npm run ios.app -- --spec=tests/specs/app.forms.spec.ts ### Login with Biometric support -The Login screen holds a simple implementation of a Login and SignUp form. This boilerplate holds 2 different test files for the Login -screen. +The Login screen holds a simple implementation of a Login and SignUp form. This boilerplate holds 2 different test files for the Login screen. - [Default Login/Sign Up](./tests/specs/app.login.spec.ts) - [Login through Touch-/FaceID or FingerPrint (Biometric Support)](./tests/specs/app.biometric.login.spec.ts) The last one can be very interesting because it will give you an idea of what you need to do when you need to log in with Touch-/FaceID or FingerPrint. The [`app.biometric.login.spec.ts`](./tests/specs/app.biometric.login.spec.ts) will also enable Touch-/FaceID if needed automatically for you for **Android Emulators** or **iOS Simulators**. It covers almost all platform versions. -> **NOTE:** The methods rely on the fact that the Android Emulator or iOS Simulator have English as the default language. If you have set up -> your test devices with a different language you might need to change certain selectors and or texts for the selectors. +> ![NOTE] +> The methods rely on the fact that the Android Emulator or iOS Simulator have English as the default language. If you have set up your test devices with a different language you might need to change certain selectors and or texts for the selectors. You can run the single test with the following commands @@ -181,9 +174,9 @@ There are 2 types of navigation tests explained in this boilerplate. 1. [Tab Bar](./tests/specs/app.tab.bar.navigation.spec.ts) 1. [Deep Links](./tests/specs/app.deep.link.navigation.spec.ts) -The most interesting test here will be the [Deep Links](./tests/specs/app.deep.link.navigation.spec.ts) because this might speed up your tests if your app supports Deep Links. Check the code and the `openDeepLinkUrl()` method in the [`Utils.ts`](./tests/helpers/Utils.ts)-file to see how this works. +The most interesting test here will be the [Deep Links](./tests/specs/app.deep.link.navigation.spec.ts) because this might speed up your tests if your app supports Deep Links. Check the code and the `openDeepLinkUrl()` method in the [`Utils.ts`](./tests/helpers/Utils.ts) file to see how this works. -> [!TIP]] +> [!TIP] > If you are automating iOS apps and you can use Deep Links, then you might want to try adding the capability `autoAcceptAlerts:true` when you start the iOS device. This capability will automatically accept all alerts, also the alert that will appear when you want to open your deep link in Safari. > > If you ware going to use this capability, then don't forget to remove the last few lines in the [`openDeepLinkUrl()`](./tests/helpers/Utils.ts)-method, see the comments in the method @@ -249,11 +242,10 @@ The app has a WebView that will automatically load the WebdriverIO documentation [0-0] PASSED in iOS - /tests/specs/app.webview.xpath.spec.ts ``` -You will also find a [WebView](./tests/helpers/WebView.ts)-helper with hopefully useful methods that can help you automate a Hybrid App. +You will also find a [WebView](./tests/helpers/WebView.ts) helper with hopefully useful methods that can help you automate a Hybrid App. Keep in the back of your mind that for the _simplicity_ of the Demo app, only one WebView is used. This is also used in the WebView-helper. -More information about **Automating Hybrid Applications with Appium** and more complex WebViews can be found in -[this webinar](https://youtu.be/_mPCRxplBfo) recording. +More information about **Automating Hybrid Applications with Appium** and more complex WebViews can be found in [this webinar](https://youtu.be/_mPCRxplBfo) recording. You can run the single test with the following commands @@ -269,13 +261,9 @@ npm run ios.app -- --spec=tests/specs/app.webview.xpath.spec.ts ## Automating Chrome or Safari -Mobile web automation is almost the same as writing tests for desktop browsers. The only difference can be found in the configuration that -needs to be used. Click [here](config/wdio.ios.browser.conf.ts) to find the config for iOS Safari and -[here](config/wdio.android.browser.conf.ts) for Android Chrome. +Mobile web automation is almost the same as writing tests for desktop browsers. The only difference can be found in the configuration that needs to be used. Click [here](config/wdio.ios.browser.conf.ts) to find the config for iOS Safari and [here](config/wdio.android.browser.conf.ts) for Android Chrome. For Android be sure that the latest version of Chrome is installed, see also -[here](./docs/FAQ.md#i-get-the-error-no-chromedriver-found-that-can-automate-chrome-). Our -[`wdio.shared.local.appium.conf.ts`](./config/wdio.shared.local.appium.conf.ts) uses the `relaxedSecurity: true` argument from Appium which -will allow Appium to automatically download the latest ChromeDriver. +[here](./docs/FAQ.md#i-get-the-error-no-chromedriver-found-that-can-automate-chrome-). Our [`wdio.shared.local.appium.conf.ts`](./config/wdio.shared.local.appium.conf.ts) uses the `relaxedSecurity: true` argument from Appium which will allow Appium to automatically download the latest ChromeDriver. For this boilerplate, the test cases from the Jasmine boilerplate, created by [Christian Bromann](https://github.com/christian-bromann), are used. @@ -306,9 +294,7 @@ If you provide `region: 'us'` or `region: 'eu'` it will connect to the US or the #### Upload apps to Sauce Storage -If you want to use Android emulators, iOS simulators or Android real devices in the Sauce Labs UI you need to upload the apps to the Sauce -Storage. You can find a script to upload them to, and the US, and EU DC in [this](./scripts) folder. You can push the files to the storage -by executing the following steps in a terminal from the root of this project: +If you want to use Android emulators, iOS simulators or Android real devices in the Sauce Labs UI you need to upload the apps to the Sauce Storage. You can find a script to upload them to, and the US, and EU DC in [this](./scripts) folder. You can push the files to the storage by executing the following steps in a terminal from the root of this project: ```sh cd scripts @@ -319,7 +305,8 @@ When you've done that you will see a lot of successful logs in your terminal. #### Run app tests on the Sauce Labs Real Device Cloud -> **NOTE:** Due to signing iOS Real Devices are not supported. Only Android Real Devices are supported. +> ![NOTE] +> Due to the lack of signing iOS apps, this boilerplate doesn't support Real Devices. Only Android Real Devices are supported. If you want to use iOS Real Devices then you need to provide your own app that has been signed properly. Please check the [Android Real Devices](./config/wdio.android.app.conf.ts)-config to see the setup for Android real devices. @@ -363,8 +350,7 @@ npm run ios.sauce.simulator.app.us ### BrowserStack -This boilerplate provides a setup for testing with BrowserStack. Please check the [BrowserStack](./config/browserstack) folder to see the -setup for iOS and Android. +This boilerplate provides a setup for testing with BrowserStack. Please check the [BrowserStack](./config/browserstack) folder to see the setup for iOS and Android. Make sure you install the latest version of the `@wdio/browserstack-service` with: @@ -384,8 +370,7 @@ $ npm run android.browserstack.app ### TestingBot -This boilerplate provides a setup for testing with TestingBot. Please check the [TestingBot](./config/testingbot)-folder to see the -setup for Android. +This boilerplate provides a setup for testing with TestingBot. Please check the [TestingBot](./config/testingbot)-folder to see the setup for Android. Make sure you install the latest version of the `@wdio/testingbot-service` with diff --git a/config/wdio.android.app.conf.ts b/config/wdio.android.app.conf.ts index 99043716..1318ff74 100644 --- a/config/wdio.android.app.conf.ts +++ b/config/wdio.android.app.conf.ts @@ -24,7 +24,12 @@ export const config: WebdriverIO.Config = { // For W3C the appium capabilities need to have an extension prefix // http://appium.io/docs/en/writing-running-appium/caps/ // This is `appium:` for all Appium Capabilities which can be found here + + // + // NOTE: Change this name according to the Emulator you have created on your local machine 'appium:deviceName': 'Pixel_7_Pro_Android_14_API_34', + // + // NOTE: Change this version according to the Emulator you have created on your local machine 'appium:platformVersion': '14.0', 'appium:orientation': 'PORTRAIT', 'appium:automationName': 'UiAutomator2', @@ -32,7 +37,8 @@ export const config: WebdriverIO.Config = { 'appium:app': join( process.cwd(), 'apps', - // Change this name according to the app version you downloaded + // + // NOTE: Change this name according to the app version you downloaded 'android.wdio.native.app.v1.0.8.apk', ), 'appium:appWaitActivity': 'com.wdiodemoapp.MainActivity', diff --git a/config/wdio.ios.app.conf.ts b/config/wdio.ios.app.conf.ts index 7a7588e7..eabeaaef 100644 --- a/config/wdio.ios.app.conf.ts +++ b/config/wdio.ios.app.conf.ts @@ -22,7 +22,12 @@ export const config: WebdriverIO.Config = { // For W3C the appium capabilities need to have an extension prefix // This is `appium:` for all Appium Capabilities which can be found here // http://appium.io/docs/en/writing-running-appium/caps/ + + // + // NOTE: Change this name according to the Simulator you have created on your local machine 'appium:deviceName': 'iPhone 15', + // + // NOTE: Change this version according to the Simulator Version you have created on your local machine 'appium:platformVersion': '17.2', 'appium:orientation': 'PORTRAIT', 'appium:automationName': 'XCUITest', diff --git a/tests/screenobjects/FormsScreen.ts b/tests/screenobjects/FormsScreen.ts index e96a5b63..54451063 100644 --- a/tests/screenobjects/FormsScreen.ts +++ b/tests/screenobjects/FormsScreen.ts @@ -1,15 +1,20 @@ import AppScreen from './AppScreen.js'; +const SELECTORS = { + SCREEN: '~Forms-screen', +}; + class FormsScreen extends AppScreen { constructor () { - super('~Forms-screen'); + super(SELECTORS.SCREEN); } + get screen () {return $(SELECTORS.SCREEN);} get input () {return $('~text-input');} get inputTextResult () {return $('~input-text-result');} - private get switch () {return $('~switch');} - private get switchText () {return $('~switch-text');} - private get dropDown () {return $('~Dropdown');} + get switch () {return $('~switch');} + get switchText () {return $('~switch-text');} + get dropDown () {return $('~Dropdown');} get activeButton () {return $('~button-Active');} get inActiveButton () {return $('~button-Inactive');} diff --git a/tests/screenobjects/LoginScreen.ts b/tests/screenobjects/LoginScreen.ts index 4740e59c..cad603ef 100644 --- a/tests/screenobjects/LoginScreen.ts +++ b/tests/screenobjects/LoginScreen.ts @@ -1,11 +1,16 @@ import AppScreen from './AppScreen.js'; import Gestures from '../helpers/Gestures.js'; +const SELECTORS = { + SCREEN: '~Login-screen', +}; + class LoginScreen extends AppScreen { constructor () { - super('~Login-screen'); + super(SELECTORS.SCREEN); } + get screen () {return $(SELECTORS.SCREEN);} private get loginContainerButton () {return $('~button-login-container');} private get signUpContainerButton () {return $('~button-sign-up-container');} private get loginButton () {return $('~button-LOGIN');} @@ -50,7 +55,11 @@ class LoginScreen extends AppScreen { await $('~Login-screen').click(); } // On smaller screens there could be a possibility that the button is not shown - await Gestures.checkIfDisplayedWithSwipeUp(await this.loginButton, 2); + await Gestures.checkIfDisplayedWithSwipe({ + scrollContainer: await this.screen, + searchableElement: await this.loginButton, + maxScrolls: 2, + }); await this.loginButton.click(); } @@ -74,7 +83,11 @@ class LoginScreen extends AppScreen { await $('~Login-screen').click(); } // On smaller screens there could be a possibility that the button is not shown - await Gestures.checkIfDisplayedWithSwipeUp(await this.signUpButton, 2); + await Gestures.checkIfDisplayedWithSwipe({ + scrollContainer: await this.screen, + searchableElement: await this.signUpButton, + maxScrolls: 2, + }); await this.signUpButton.click(); } } diff --git a/tests/specs/app.forms.spec.ts b/tests/specs/app.forms.spec.ts index ac59ed0c..f6f7d099 100644 --- a/tests/specs/app.forms.spec.ts +++ b/tests/specs/app.forms.spec.ts @@ -67,10 +67,14 @@ describe('WebdriverIO and Appium, when interacting with form elements,', () => { }); it('should be able to open the alert and close it with all 3 buttons', async () => { - await Gestures.checkIfDisplayedWithSwipeUp(await FormScreen.activeButton, 2); + await Gestures.checkIfDisplayedWithSwipe({ + scrollContainer: await FormScreen.screen, + searchableElement: await FormScreen.activeButton, + maxScrolls: 2, + }); await FormScreen.tapOnActiveButton(); await NativeAlert.waitForIsShown(true); - await expect(await NativeAlert.text()).toEqual('This button is\nThis button is active'); + await expect(await NativeAlert.text()).toContain('This button is'); /** * The following steps don't contain any assertions. This might look strange, but @@ -94,7 +98,11 @@ describe('WebdriverIO and Appium, when interacting with form elements,', () => { it('should be able to determine that the inactive button is inactive', async () => { // Depending on the size of the screen we might need to scroll. This methods determines if it's visible, // if not, it will automatically scroll to find it. This will be done two times. - await Gestures.checkIfDisplayedWithSwipeUp(await FormScreen.inActiveButton, 2); + await Gestures.checkIfDisplayedWithSwipe({ + scrollContainer:await FormScreen.screen, + searchableElement:await FormScreen.inActiveButton, + maxScrolls:2, + }); // In this case the button can't be asked if it is active or not with // `expect(FormScreen.inActiveButton.isEnabled()).toEqual(false);` // So use a click and check if shown, make sure the alert is not there diff --git a/tests/specs/app.login.spec.ts b/tests/specs/app.login.spec.ts index 13dcf8eb..e7f087e2 100644 --- a/tests/specs/app.login.spec.ts +++ b/tests/specs/app.login.spec.ts @@ -16,7 +16,7 @@ describe('WebdriverIO and Appium, when interacting with a login form,', () => { await LoginScreen.submitLoginForm({ username: 'test@webdriver.io', password: 'Test1234!' }); // Wait for the alert and validate it await NativeAlert.waitForIsShown(); - await expect(await NativeAlert.text()).toEqual('Success\nYou are logged in!'); + await expect(await NativeAlert.text()).toContain('Success'); // Close the alert await NativeAlert.topOnButtonWithText('OK'); @@ -30,7 +30,7 @@ describe('WebdriverIO and Appium, when interacting with a login form,', () => { await LoginScreen.submitSignUpForm({ username: 'test@webdriver.io', password: 'Test1234!' }); // Wait for the alert and validate it await NativeAlert.waitForIsShown(); - await expect(await NativeAlert.text()).toEqual('Signed Up!\nYou successfully signed up!'); + await expect(await NativeAlert.text()).toContain('Signed Up'); // Close the alert await NativeAlert.topOnButtonWithText('OK'); From 450049b7dc1c1888422e93242b91dfd5a4eb3ed5 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sun, 7 Jan 2024 18:56:29 +0100 Subject: [PATCH 15/18] chore: update mobile browser configs --- config/wdio.android.browser.conf.ts | 9 +++++++-- config/wdio.ios.browser.conf.ts | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/config/wdio.android.browser.conf.ts b/config/wdio.android.browser.conf.ts index 83d7913f..c976e911 100644 --- a/config/wdio.android.browser.conf.ts +++ b/config/wdio.android.browser.conf.ts @@ -24,8 +24,13 @@ export const config: WebdriverIO.Config = { // For W3C the appium capabilities need to have an extension prefix // http://appium.io/docs/en/writing-running-appium/caps/ // This is `appium:` for all Appium Capabilities which can be found here - 'appium:deviceName': 'Pixel_3_10.0', - 'appium:platformVersion': '10.0', + + // + // NOTE: Change this name according to the Emulator you have created on your local machine + 'appium:deviceName': 'Pixel_7_Pro_Android_14_API_34', + // + // NOTE: Change this version according to the Emulator you have created on your local machine + 'appium:platformVersion': '14.0', 'appium:automationName': 'UiAutomator2', 'appium:orientation': 'PORTRAIT', 'appium:newCommandTimeout': 240, diff --git a/config/wdio.ios.browser.conf.ts b/config/wdio.ios.browser.conf.ts index 7d220317..c4099d2a 100644 --- a/config/wdio.ios.browser.conf.ts +++ b/config/wdio.ios.browser.conf.ts @@ -24,8 +24,13 @@ export const config: WebdriverIO.Config = { // For W3C the appium capabilities need to have an extension prefix // This is `appium:` for all Appium Capabilities which can be found here // http://appium.io/docs/en/writing-running-appium/caps/ - 'appium:deviceName': 'iPhone 12', - 'appium:platformVersion': '14.5', + + // + // NOTE: Change this name according to the Simulator you have created on your local machine + 'appium:deviceName': 'iPhone 15', + // + // NOTE: Change this version according to the Simulator Version you have created on your local machine + 'appium:platformVersion': '17.2', 'appium:orientation': 'PORTRAIT', 'appium:automationName': 'XCUITest', 'appium:newCommandTimeout': 240, From 1965f10dac7e6ac140c3253dc2c4d71c87c96e6c Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sun, 7 Jan 2024 19:01:50 +0100 Subject: [PATCH 16/18] fix: fix hide keyboard for iOS --- tests/pageobjects/form.page.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/pageobjects/form.page.ts b/tests/pageobjects/form.page.ts index dc61e240..3e580a92 100644 --- a/tests/pageobjects/form.page.ts +++ b/tests/pageobjects/form.page.ts @@ -17,8 +17,19 @@ class FormPage extends Page { await this.username.setValue(username); await this.password.setValue(password); // only for mobile, if you test on a desktop browser `hideKeyboard` won't exist. - if (browser.hideKeyboard) { - await browser.hideKeyboard(); + if (driver.isMobile) { + /** + * Normally we would hide the keyboard with this command `driver.hideKeyboard()`, but there is an issue for hiding the keyboard + * on iOS when using the command. You will get an error like below + * + * Request failed with status 400 due to Error Domain=com.facebook.WebDriverAgent Code=1 "The keyboard on iPhone cannot be + * dismissed because of a known XCTest issue. Try to dismiss it in the way supported by your application under test." + * UserInfo={NSLocalizedDescription=The keyboard on iPhone cannot be dismissed because of a known XCTest issue. Try to dismiss + * it in the way supported by your application under test.} + * + * That's why we click outside of the keyboard. + */ + await $('h2').click(); } await this.submitButton.click(); } From 1731216fa81e2f3a3638f22d8d72069e98c43809 Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sun, 7 Jan 2024 19:57:26 +0100 Subject: [PATCH 17/18] chore: updated deps --- package-lock.json | 2219 ++++++++++++++++++++------------------------- package.json | 10 +- 2 files changed, 966 insertions(+), 1263 deletions(-) diff --git a/package-lock.json b/package-lock.json index dd7567b6..6a2398bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "5.3.1", "license": "MIT", "devDependencies": { - "@typescript-eslint/eslint-plugin": "^6.16.0", - "@typescript-eslint/parser": "^6.16.0", + "@typescript-eslint/eslint-plugin": "^6.18.0", + "@typescript-eslint/parser": "^6.18.0", "@wdio/appium-service": "^8.27.0", "@wdio/browserstack-service": "^8.27.1", "@wdio/cli": "^8.27.1", @@ -20,9 +20,9 @@ "@wdio/sauce-service": "^8.27.0", "@wdio/spec-reporter": "^8.27.0", "@wdio/testingbot-service": "^8.27.0", - "appium": "^2.3.0", - "appium-uiautomator2-driver": "^2.37.0", - "appium-xcuitest-driver": "^5.12.2", + "appium": "^2.4.1", + "appium-uiautomator2-driver": "^2.40.0", + "appium-xcuitest-driver": "^5.13.0", "eslint-plugin-wdio": "^8.24.12", "ts-node": "^10.9.2", "typescript": "^5.3.3" @@ -42,13 +42,13 @@ } }, "node_modules/@appium/base-driver": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.4.4.tgz", - "integrity": "sha512-oxtXbFWMQVg8Y+lpdv0oL/G4C5TO3Ns7MDL/di2O//GcOMINCq+LJHvpvO2EX3HpLUX35yOu+3TUKQigPWwbQw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.5.0.tgz", + "integrity": "sha512-xzxXUrkMen4CqdUjggVeKwrh3+AyO4eSjkrRV+z4Ic39qclAqJS1HGjgJzCuu0RruTRg9DEMd4r2k1RVuf5udA==", "dev": true, "dependencies": { - "@appium/support": "^4.1.11", - "@appium/types": "^0.15.0", + "@appium/support": "^4.2.0", + "@appium/types": "^0.16.0", "@colors/colors": "1.6.0", "@types/async-lock": "1.4.2", "@types/bluebird": "3.5.42", @@ -56,9 +56,9 @@ "@types/lodash": "4.14.202", "@types/method-override": "0.0.35", "@types/serve-favicon": "2.5.7", - "async-lock": "1.4.0", + "async-lock": "1.4.1", "asyncbox": "3.0.0", - "axios": "1.6.2", + "axios": "1.6.3", "bluebird": "3.7.2", "body-parser": "1.20.2", "es6-error": "4.1.1", @@ -71,7 +71,7 @@ "path-to-regexp": "6.2.1", "serve-favicon": "2.5.0", "source-map-support": "0.5.21", - "type-fest": "4.8.3", + "type-fest": "4.9.0", "validate.js": "0.13.1" }, "engines": { @@ -89,9 +89,9 @@ "dev": true }, "node_modules/@appium/base-driver/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -101,13 +101,13 @@ } }, "node_modules/@appium/base-plugin": { - "version": "2.2.25", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.25.tgz", - "integrity": "sha512-bi2pM76ChfZ8fOG9OUOFovmPmMbUpUAETZar9/NHCOEHtUKV/5K1am/1hCrRmvkeB62UZah9jWSKv1kk61bLpA==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.26.tgz", + "integrity": "sha512-zzmRw1MBZSVOEySMlGO/OMGAVn0Nu2mhbgCZ2mnnemOwjMu/VKpxKmKlzQbIU37QYIj/8WJlgtrpHV/hgXYvVA==", "dev": true, "dependencies": { - "@appium/base-driver": "^9.4.4", - "@appium/support": "^4.1.11" + "@appium/base-driver": "^9.5.0", + "@appium/support": "^4.2.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", @@ -115,12 +115,12 @@ } }, "node_modules/@appium/docutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.1.tgz", - "integrity": "sha512-6G0WlosgQ3+S3WLc66GRVGkxeKpMmdmKIcBZTkPt73yNSV5Klu7FLUhEQAKP/hmVorEYs7GqtD6HH6KP7xkSAw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.2.tgz", + "integrity": "sha512-GoqbqT2pHkVDU66TpbVjF/r5Nz7eVAKgCedoDzZqHmzq/ook6KvgfKSZpKVxdsfNJDt4dH+YzmSV63XUGHMv/g==", "dev": true, "dependencies": { - "@appium/support": "^4.1.11", + "@appium/support": "^4.2.0", "@appium/tsconfig": "^0.x", "@sliphua/lilconfig-ts-loader": "3.2.2", "@types/which": "3.0.3", @@ -129,7 +129,7 @@ "diff": "5.1.0", "figures": "3.2.0", "json5": "2.2.3", - "lilconfig": "2.1.0", + "lilconfig": "3.0.0", "lodash": "4.17.21", "log-symbols": "4.1.0", "pkg-dir": "5.0.0", @@ -137,7 +137,7 @@ "semver": "7.5.4", "source-map-support": "0.5.21", "teen_process": "2.1.1", - "type-fest": "4.8.3", + "type-fest": "4.9.0", "typescript": "5.2.2", "yaml": "2.3.4", "yargs": "17.7.2", @@ -324,9 +324,9 @@ } }, "node_modules/@appium/docutils/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -373,13 +373,13 @@ } }, "node_modules/@appium/support": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.1.11.tgz", - "integrity": "sha512-d6Ujgn5IDlzmepI2i41Z3FexuhipZ2DE2omadNCJRMBlf0dd5cXW54WQjsS/5GI1S9c++/9Mk0aEHl/6RQcOpw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.2.0.tgz", + "integrity": "sha512-DhUufCuuzwq+DfiOQc3OcL8gk++XBUnGMytUa3PcLJg98LmKZW2sZadp1M0IUm5TkYxnxq7DfRvdTK5kpULTvw==", "dev": true, "dependencies": { "@appium/tsconfig": "^0.x", - "@appium/types": "^0.15.0", + "@appium/types": "^0.16.0", "@colors/colors": "1.6.0", "@types/archiver": "6.0.2", "@types/base64-stream": "1.0.5", @@ -398,7 +398,7 @@ "@types/uuid": "9.0.7", "@types/which": "3.0.3", "archiver": "6.0.1", - "axios": "1.6.2", + "axios": "1.6.3", "base64-stream": "1.0.0", "bluebird": "3.7.2", "bplist-creator": "0.1.1", @@ -411,7 +411,7 @@ "lockfile": "1.0.4", "lodash": "4.17.21", "log-symbols": "4.1.0", - "moment": "2.29.4", + "moment": "2.30.1", "mv": "2.1.1", "ncp": "2.0.0", "npmlog": "7.0.1", @@ -427,7 +427,7 @@ "source-map-support": "0.5.21", "supports-color": "8.1.1", "teen_process": "2.1.1", - "type-fest": "4.8.3", + "type-fest": "4.9.0", "uuid": "9.0.1", "which": "4.0.0", "yauzl": "2.10.0" @@ -437,7 +437,7 @@ "npm": ">=8" }, "optionalDependencies": { - "sharp": "0.32.6" + "sharp": "0.33.1" } }, "node_modules/@appium/support/node_modules/@types/which": { @@ -555,9 +555,9 @@ } }, "node_modules/@appium/support/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -586,9 +586,9 @@ "dev": true }, "node_modules/@appium/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.15.0.tgz", - "integrity": "sha512-7Ht9ZdvcgBHc0ecttIlfFSMbVmKNL5YRX05BVCBakArWghN97xGRJ5VoUwgEeR8VE+iK0m+3R1p0/7HIxyqRJg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.16.0.tgz", + "integrity": "sha512-AFKzzgoA3pDZ2YWJpPMAI3ei5j2LTDa8yQGblIf11bhVvLp9dUvCozEbilgaXmMRu3m/pU/ZfU1Se13ARlCQuQ==", "dev": true, "dependencies": { "@appium/schema": "^0.5.0", @@ -596,7 +596,7 @@ "@types/express": "4.17.21", "@types/npmlog": "7.0.0", "@types/ws": "8.5.10", - "type-fest": "4.8.3" + "type-fest": "4.9.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", @@ -604,9 +604,9 @@ } }, "node_modules/@appium/types/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -805,6 +805,16 @@ "fd-slicer2": "^1.2.0" } }, + "node_modules/@emnapi/runtime": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.44.0.tgz", + "integrity": "sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==", + "dev": true, + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -899,6 +909,456 @@ "dev": true, "peer": true }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.1.tgz", + "integrity": "sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.1.tgz", + "integrity": "sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.0.tgz", + "integrity": "sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.0.tgz", + "integrity": "sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.0.tgz", + "integrity": "sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.0.tgz", + "integrity": "sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.0.tgz", + "integrity": "sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.0.tgz", + "integrity": "sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.0.tgz", + "integrity": "sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.0.tgz", + "integrity": "sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.1.tgz", + "integrity": "sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.1.tgz", + "integrity": "sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.1.tgz", + "integrity": "sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.1.tgz", + "integrity": "sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.1.tgz", + "integrity": "sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.1.tgz", + "integrity": "sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.1.tgz", + "integrity": "sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/runtime": "^0.44.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.1.tgz", + "integrity": "sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.1.tgz", + "integrity": "sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1771,16 +2231,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.16.0.tgz", - "integrity": "sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.0.tgz", + "integrity": "sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.16.0", - "@typescript-eslint/type-utils": "6.16.0", - "@typescript-eslint/utils": "6.16.0", - "@typescript-eslint/visitor-keys": "6.16.0", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/type-utils": "6.18.0", + "@typescript-eslint/utils": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1806,15 +2266,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.16.0.tgz", - "integrity": "sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.0.tgz", + "integrity": "sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.16.0", - "@typescript-eslint/types": "6.16.0", - "@typescript-eslint/typescript-estree": "6.16.0", - "@typescript-eslint/visitor-keys": "6.16.0", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", "debug": "^4.3.4" }, "engines": { @@ -1834,13 +2294,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz", - "integrity": "sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.18.0.tgz", + "integrity": "sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.16.0", - "@typescript-eslint/visitor-keys": "6.16.0" + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1851,13 +2311,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.16.0.tgz", - "integrity": "sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.18.0.tgz", + "integrity": "sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.16.0", - "@typescript-eslint/utils": "6.16.0", + "@typescript-eslint/typescript-estree": "6.18.0", + "@typescript-eslint/utils": "6.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1878,9 +2338,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.16.0.tgz", - "integrity": "sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.18.0.tgz", + "integrity": "sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1891,13 +2351,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz", - "integrity": "sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.0.tgz", + "integrity": "sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.16.0", - "@typescript-eslint/visitor-keys": "6.16.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/visitor-keys": "6.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1943,17 +2403,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.16.0.tgz", - "integrity": "sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.18.0.tgz", + "integrity": "sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.16.0", - "@typescript-eslint/types": "6.16.0", - "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/scope-manager": "6.18.0", + "@typescript-eslint/types": "6.18.0", + "@typescript-eslint/typescript-estree": "6.18.0", "semver": "^7.5.4" }, "engines": { @@ -1968,12 +2428,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz", - "integrity": "sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==", + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.0.tgz", + "integrity": "sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/types": "6.18.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -2307,18 +2767,6 @@ "node": ">=10.0.0" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -2502,18 +2950,18 @@ } }, "node_modules/appium": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/appium/-/appium-2.3.0.tgz", - "integrity": "sha512-uhLh+Glfr31vt3R6lnE6+LcBdxDArGKV1FRf072K6DZlEhz94aniRpMwKuMaQ76jfoF3BqWFmEJRIQL+2eRUKQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/appium/-/appium-2.4.1.tgz", + "integrity": "sha512-Z21fX+nRhZfM8ZX5pTISRyzCVraS4GF84/wueWdMKb36aEXXq38VnNrqHH+SCvir0rwqSG4N4ofW0CYXJ7JeiA==", "dev": true, "hasInstallScript": true, "dependencies": { - "@appium/base-driver": "^9.4.4", - "@appium/base-plugin": "^2.2.25", - "@appium/docutils": "^1.0.1", - "@appium/schema": "^0.5.0", - "@appium/support": "^4.1.11", - "@appium/types": "^0.15.0", + "@appium/base-driver": "^9.5.0", + "@appium/base-plugin": "^2.2.26", + "@appium/docutils": "^1.0.2", + "@appium/schema": "~0.5.0", + "@appium/support": "^4.2.0", + "@appium/types": "^0.16.0", "@sidvind/better-ajv-errors": "2.1.3", "@types/argparse": "2.0.14", "@types/bluebird": "3.5.42", @@ -2524,13 +2972,12 @@ "ajv": "8.12.0", "ajv-formats": "2.1.1", "argparse": "2.0.1", - "async-lock": "1.4.0", + "async-lock": "1.4.1", "asyncbox": "3.0.0", - "axios": "1.6.2", + "axios": "1.6.3", "bluebird": "3.7.2", "cross-env": "7.0.3", - "find-up": "5.0.0", - "lilconfig": "2.1.0", + "lilconfig": "3.0.0", "lodash": "4.17.21", "npmlog": "7.0.1", "ora": "5.4.1", @@ -2539,9 +2986,10 @@ "semver": "7.5.4", "source-map-support": "0.5.21", "teen_process": "2.1.1", - "type-fest": "4.8.3", + "type-fest": "4.9.0", "winston": "3.11.0", "wrap-ansi": "7.0.0", + "ws": "8.16.0", "yaml": "2.3.4" }, "bin": { @@ -2553,16 +3001,16 @@ } }, "node_modules/appium-uiautomator2-driver": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/appium-uiautomator2-driver/-/appium-uiautomator2-driver-2.37.0.tgz", - "integrity": "sha512-nQXgs1XCh3wcBWCKLxX3zEI1FBioryrz8mftfmQqSe2kLQqCITGUgmVk4h3wuGSr6HeSAc7MILuuuZdKJ5UUIQ==", + "version": "2.40.0", + "resolved": "https://registry.npmjs.org/appium-uiautomator2-driver/-/appium-uiautomator2-driver-2.40.0.tgz", + "integrity": "sha512-tDyr62aWkgMkKe0WPO6Db8xI4NgDpCnNZOO9c/f2WQy7gn1QEJ4AJHMJhP5jgYUOFT91/fiz1L5OJbAfD7O43Q==", "dev": true, "hasShrinkwrap": true, "dependencies": { "appium-adb": "^11.0.1", - "appium-android-driver": "^7.4.0", + "appium-android-driver": "^7.6.0", "appium-chromedriver": "^5.6.5", - "appium-uiautomator2-server": "^5.15.0", + "appium-uiautomator2-server": "^6.0.0", "asyncbox": "^3.0.0", "axios": "^1.x", "bluebird": "^3.5.1", @@ -2578,17 +3026,17 @@ "npm": ">=8" }, "peerDependencies": { - "appium": "^2.0.0" + "appium": "^2.4.1" } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-driver": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.4.4.tgz", - "integrity": "sha512-oxtXbFWMQVg8Y+lpdv0oL/G4C5TO3Ns7MDL/di2O//GcOMINCq+LJHvpvO2EX3HpLUX35yOu+3TUKQigPWwbQw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.5.0.tgz", + "integrity": "sha512-xzxXUrkMen4CqdUjggVeKwrh3+AyO4eSjkrRV+z4Ic39qclAqJS1HGjgJzCuu0RruTRg9DEMd4r2k1RVuf5udA==", "dev": true, "dependencies": { - "@appium/support": "^4.1.11", - "@appium/types": "^0.15.0", + "@appium/support": "^4.2.0", + "@appium/types": "^0.16.0", "@colors/colors": "1.6.0", "@types/async-lock": "1.4.2", "@types/bluebird": "3.5.42", @@ -2596,9 +3044,9 @@ "@types/lodash": "4.14.202", "@types/method-override": "0.0.35", "@types/serve-favicon": "2.5.7", - "async-lock": "1.4.0", + "async-lock": "1.4.1", "asyncbox": "3.0.0", - "axios": "1.6.2", + "axios": "1.6.3", "bluebird": "3.7.2", "body-parser": "1.20.2", "es6-error": "4.1.1", @@ -2611,7 +3059,7 @@ "path-to-regexp": "6.2.1", "serve-favicon": "2.5.0", "source-map-support": "0.5.21", - "type-fest": "4.8.3", + "type-fest": "4.9.0", "validate.js": "0.13.1" }, "engines": { @@ -2623,9 +3071,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-driver/node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -2633,27 +3081,15 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-driver/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/base-plugin": { - "version": "2.2.25", - "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.25.tgz", - "integrity": "sha512-bi2pM76ChfZ8fOG9OUOFovmPmMbUpUAETZar9/NHCOEHtUKV/5K1am/1hCrRmvkeB62UZah9jWSKv1kk61bLpA==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.26.tgz", + "integrity": "sha512-zzmRw1MBZSVOEySMlGO/OMGAVn0Nu2mhbgCZ2mnnemOwjMu/VKpxKmKlzQbIU37QYIj/8WJlgtrpHV/hgXYvVA==", "dev": true, "peer": true, "dependencies": { - "@appium/base-driver": "^9.4.4", - "@appium/support": "^4.1.11" + "@appium/base-driver": "^9.5.0", + "@appium/support": "^4.2.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", @@ -2661,13 +3097,13 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.1.tgz", - "integrity": "sha512-6G0WlosgQ3+S3WLc66GRVGkxeKpMmdmKIcBZTkPt73yNSV5Klu7FLUhEQAKP/hmVorEYs7GqtD6HH6KP7xkSAw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.2.tgz", + "integrity": "sha512-GoqbqT2pHkVDU66TpbVjF/r5Nz7eVAKgCedoDzZqHmzq/ook6KvgfKSZpKVxdsfNJDt4dH+YzmSV63XUGHMv/g==", "dev": true, "peer": true, "dependencies": { - "@appium/support": "^4.1.11", + "@appium/support": "^4.2.0", "@appium/tsconfig": "^0.x", "@sliphua/lilconfig-ts-loader": "3.2.2", "@types/which": "3.0.3", @@ -2676,7 +3112,7 @@ "diff": "5.1.0", "figures": "3.2.0", "json5": "2.2.3", - "lilconfig": "2.1.0", + "lilconfig": "3.0.0", "lodash": "4.17.21", "log-symbols": "4.1.0", "pkg-dir": "5.0.0", @@ -2684,7 +3120,7 @@ "semver": "7.5.4", "source-map-support": "0.5.21", "teen_process": "2.1.1", - "type-fest": "4.8.3", + "type-fest": "4.9.0", "typescript": "5.2.2", "yaml": "2.3.4", "yargs": "17.7.2", @@ -2695,20 +3131,7 @@ }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/docutils/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "npm": ">=8" } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/schema": { @@ -2727,13 +3150,13 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/support": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.1.11.tgz", - "integrity": "sha512-d6Ujgn5IDlzmepI2i41Z3FexuhipZ2DE2omadNCJRMBlf0dd5cXW54WQjsS/5GI1S9c++/9Mk0aEHl/6RQcOpw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.2.0.tgz", + "integrity": "sha512-DhUufCuuzwq+DfiOQc3OcL8gk++XBUnGMytUa3PcLJg98LmKZW2sZadp1M0IUm5TkYxnxq7DfRvdTK5kpULTvw==", "dev": true, "dependencies": { "@appium/tsconfig": "^0.x", - "@appium/types": "^0.15.0", + "@appium/types": "^0.16.0", "@colors/colors": "1.6.0", "@types/archiver": "6.0.2", "@types/base64-stream": "1.0.5", @@ -2752,7 +3175,7 @@ "@types/uuid": "9.0.7", "@types/which": "3.0.3", "archiver": "6.0.1", - "axios": "1.6.2", + "axios": "1.6.3", "base64-stream": "1.0.0", "bluebird": "3.7.2", "bplist-creator": "0.1.1", @@ -2765,7 +3188,7 @@ "lockfile": "1.0.4", "lodash": "4.17.21", "log-symbols": "4.1.0", - "moment": "2.29.4", + "moment": "2.30.1", "mv": "2.1.1", "ncp": "2.0.0", "npmlog": "7.0.1", @@ -2781,7 +3204,7 @@ "source-map-support": "0.5.21", "supports-color": "8.1.1", "teen_process": "2.1.1", - "type-fest": "4.8.3", + "type-fest": "4.9.0", "uuid": "9.0.1", "which": "4.0.0", "yauzl": "2.10.0" @@ -2791,13 +3214,13 @@ "npm": ">=8" }, "optionalDependencies": { - "sharp": "0.32.6" + "sharp": "0.33.1" } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/support/node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -2805,42 +3228,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/support/node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/support/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/tsconfig": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.2.tgz", @@ -2855,9 +3242,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@appium/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.15.0.tgz", - "integrity": "sha512-7Ht9ZdvcgBHc0ecttIlfFSMbVmKNL5YRX05BVCBakArWghN97xGRJ5VoUwgEeR8VE+iK0m+3R1p0/7HIxyqRJg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.16.0.tgz", + "integrity": "sha512-AFKzzgoA3pDZ2YWJpPMAI3ei5j2LTDa8yQGblIf11bhVvLp9dUvCozEbilgaXmMRu3m/pU/ZfU1Se13ARlCQuQ==", "dev": true, "dependencies": { "@appium/schema": "^0.5.0", @@ -2865,25 +3252,13 @@ "@types/express": "4.17.21", "@types/npmlog": "7.0.0", "@types/ws": "8.5.10", - "type-fest": "4.8.3" + "type-fest": "4.9.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/@appium/types/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -3425,9 +3800,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -3576,18 +3951,6 @@ "node": ">=10.0.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3661,19 +4024,19 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/appium/-/appium-2.3.0.tgz", - "integrity": "sha512-uhLh+Glfr31vt3R6lnE6+LcBdxDArGKV1FRf072K6DZlEhz94aniRpMwKuMaQ76jfoF3BqWFmEJRIQL+2eRUKQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/appium/-/appium-2.4.1.tgz", + "integrity": "sha512-Z21fX+nRhZfM8ZX5pTISRyzCVraS4GF84/wueWdMKb36aEXXq38VnNrqHH+SCvir0rwqSG4N4ofW0CYXJ7JeiA==", "dev": true, "hasInstallScript": true, "peer": true, "dependencies": { - "@appium/base-driver": "^9.4.4", - "@appium/base-plugin": "^2.2.25", - "@appium/docutils": "^1.0.1", - "@appium/schema": "^0.5.0", - "@appium/support": "^4.1.11", - "@appium/types": "^0.15.0", + "@appium/base-driver": "^9.5.0", + "@appium/base-plugin": "^2.2.26", + "@appium/docutils": "^1.0.2", + "@appium/schema": "~0.5.0", + "@appium/support": "^4.2.0", + "@appium/types": "^0.16.0", "@sidvind/better-ajv-errors": "2.1.3", "@types/argparse": "2.0.14", "@types/bluebird": "3.5.42", @@ -3684,13 +4047,12 @@ "ajv": "8.12.0", "ajv-formats": "2.1.1", "argparse": "2.0.1", - "async-lock": "1.4.0", + "async-lock": "1.4.1", "asyncbox": "3.0.0", - "axios": "1.6.2", + "axios": "1.6.3", "bluebird": "3.7.2", "cross-env": "7.0.3", - "find-up": "5.0.0", - "lilconfig": "2.1.0", + "lilconfig": "3.0.0", "lodash": "4.17.21", "npmlog": "7.0.1", "ora": "5.4.1", @@ -3699,9 +4061,10 @@ "semver": "7.5.4", "source-map-support": "0.5.21", "teen_process": "2.1.1", - "type-fest": "4.8.3", + "type-fest": "4.9.0", "winston": "3.11.0", "wrap-ansi": "7.0.0", + "ws": "8.16.0", "yaml": "2.3.4" }, "bin": { @@ -3736,17 +4099,19 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium-android-driver": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-7.4.1.tgz", - "integrity": "sha512-xTc0ymH8bcpdKRMWMkKbekBz4dH/MoBPLEqsPCn6XndSQF3FQLjYbAJ4Bd+GgcDaSGo0CZNeHH15nN7mKSMDhg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-7.6.0.tgz", + "integrity": "sha512-8i2y+LyNf+n3gQ36sSgREz/XYHo2DN0tWfj0JnOZUUI3lnSitt6cAV0TFhx4+8HukbNKgxoE5SnqMvBBNTXVdA==", "dev": true, "dependencies": { + "@appium/support": "^4.2.0", + "@colors/colors": "^1.6.0", "appium-adb": "^11.0.1", "appium-chromedriver": "^5.5.1", "asyncbox": "^3.0.0", "axios": "^1.x", "bluebird": "^3.4.7", - "io.appium.settings": "^5.2.0", + "io.appium.settings": "^5.3.0", "lodash": "^4.17.4", "lru-cache": "^10.0.1", "moment": "^2.24.0", @@ -3794,9 +4159,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium-uiautomator2-server": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/appium-uiautomator2-server/-/appium-uiautomator2-server-5.15.0.tgz", - "integrity": "sha512-c3VAGootEOohgsSjiTi/ugqyXiUgbceaIBcGPTkQrbz61/PbpLhtefD7I0Nc0EFdRiY4V9Rvb0G/55944Ztzeg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/appium-uiautomator2-server/-/appium-uiautomator2-server-6.0.1.tgz", + "integrity": "sha512-gTSuRti1b0nUEfv/e1+t2/Pu571gn3hRqY2+LRrVNUtH7pOF7lGcRGamjBbWvLAMtzVJs4NTz+BPqKSEEEIQ1A==", "dev": true, "engines": { "node": ">=14", @@ -3804,9 +4169,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/appium/node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dev": true, "peer": true, "dependencies": { @@ -3815,19 +4180,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/appium/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -3901,58 +4253,14 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/are-we-there-yet": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", - "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.2.tgz", + "integrity": "sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==", "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/are-we-there-yet/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3980,9 +4288,9 @@ "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/async-lock": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", - "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/asyncbox": { @@ -4006,12 +4314,12 @@ "dev": true }, "node_modules/appium-uiautomator2-driver/node_modules/axios": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", - "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -4086,6 +4394,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -4186,6 +4495,7 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -4257,13 +4567,6 @@ "node": ">=8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "optional": true - }, "node_modules/appium-uiautomator2-driver/node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", @@ -4637,45 +4940,6 @@ } } }, - "node_modules/appium-uiautomator2-driver/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -4712,12 +4976,6 @@ "node": ">=0.4.0" } }, - "node_modules/appium-uiautomator2-driver/node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "node_modules/appium-uiautomator2-driver/node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4804,16 +5062,6 @@ "node": ">= 0.8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4854,34 +5102,6 @@ "node": ">= 0.6" } }, - "node_modules/appium-uiautomator2-driver/node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -5108,9 +5328,9 @@ "peer": true }, "node_modules/appium-uiautomator2-driver/node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -5187,13 +5407,6 @@ "node": ">= 0.6" } }, - "node_modules/appium-uiautomator2-driver/node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "optional": true - }, "node_modules/appium-uiautomator2-driver/node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5342,13 +5555,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/appium-uiautomator2-driver/node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true, - "optional": true - }, "node_modules/appium-uiautomator2-driver/node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -5577,7 +5783,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "peer": true }, "node_modules/appium-uiautomator2-driver/node_modules/inflight": { "version": "1.0.6", @@ -5605,9 +5812,9 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/io.appium.settings": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-5.2.0.tgz", - "integrity": "sha512-jovWBfW4SDJqdI6SxKDJUEZHxjT+zGIaogcXPQk6l7jxgF+hdVisWXUJCZxCX1JPzraZWk8q71E9d6fvmyCrtA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-5.3.1.tgz", + "integrity": "sha512-LHR2iBxNpldubyCdndJW9GSU8cICeXUNNXWnd6ee6k8VlCoBm9LsqIKT5CgwZ5m0/mXRUopjtgLvZMUsnLNUjQ==", "dev": true, "engines": { "node": ">=14", @@ -5841,13 +6048,13 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dev": true, "peer": true, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/appium-uiautomator2-driver/node_modules/lines-and-columns": { @@ -6086,17 +6293,10 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/appium-uiautomator2-driver/node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "optional": true - }, "node_modules/appium-uiautomator2-driver/node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, "engines": { "node": "*" @@ -6227,13 +6427,6 @@ "rimraf": "bin.js" } }, - "node_modules/appium-uiautomator2-driver/node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true, - "optional": true - }, "node_modules/appium-uiautomator2-driver/node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", @@ -6244,33 +6437,13 @@ } }, "node_modules/appium-uiautomator2-driver/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/node-abi": { - "version": "3.52.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.52.0.tgz", - "integrity": "sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==", - "dev": true, - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "optional": true + "engines": { + "node": ">= 0.6" + } }, "node_modules/appium-uiautomator2-driver/node_modules/normalize-package-data": { "version": "2.5.0", @@ -6654,72 +6827,6 @@ "lodash": "^4.17.14" } }, - "node_modules/appium-uiautomator2-driver/node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -6745,17 +6852,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/appium-uiautomator2-driver/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6811,39 +6907,6 @@ "node": ">= 0.8" } }, - "node_modules/appium-uiautomator2-driver/node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/appium-uiautomator2-driver/node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "optional": true - }, - "node_modules/appium-uiautomator2-driver/node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -7155,6 +7218,47 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/appium-uiautomator2-driver/node_modules/sharp": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.1.tgz", + "integrity": "sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.0", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.1", + "@img/sharp-darwin-x64": "0.33.1", + "@img/sharp-libvips-darwin-arm64": "1.0.0", + "@img/sharp-libvips-darwin-x64": "1.0.0", + "@img/sharp-libvips-linux-arm": "1.0.0", + "@img/sharp-libvips-linux-arm64": "1.0.0", + "@img/sharp-libvips-linux-s390x": "1.0.0", + "@img/sharp-libvips-linux-x64": "1.0.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", + "@img/sharp-libvips-linuxmusl-x64": "1.0.0", + "@img/sharp-linux-arm": "0.33.1", + "@img/sharp-linux-arm64": "0.33.1", + "@img/sharp-linux-s390x": "0.33.1", + "@img/sharp-linux-x64": "0.33.1", + "@img/sharp-linuxmusl-arm64": "0.33.1", + "@img/sharp-linuxmusl-x64": "0.33.1", + "@img/sharp-wasm32": "0.33.1", + "@img/sharp-win32-ia32": "0.33.1", + "@img/sharp-win32-x64": "0.33.1" + } + }, "node_modules/appium-uiautomator2-driver/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7205,53 +7309,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/appium-uiautomator2-driver/node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/appium-uiautomator2-driver/node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -7533,18 +7590,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/appium-uiautomator2-driver/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "optional": true, - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/tar-stream": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", @@ -7620,19 +7665,6 @@ "dev": true, "peer": true }, - "node_modules/appium-uiautomator2-driver/node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/appium-uiautomator2-driver/node_modules/type-fest": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", @@ -8152,12 +8184,13 @@ } }, "node_modules/appium-xcuitest-driver": { - "version": "5.12.2", - "resolved": "https://registry.npmjs.org/appium-xcuitest-driver/-/appium-xcuitest-driver-5.12.2.tgz", - "integrity": "sha512-5nXiJzZTp76gIqcIROmn1QTEdpGfphnbpQtVKCb6ZHza0W6ujCxjeSFLyIsMNbqTwnGfd8kWMVDDqTi8XN2bhQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/appium-xcuitest-driver/-/appium-xcuitest-driver-5.13.0.tgz", + "integrity": "sha512-mq6N798MvU30RvybBPfFbc9+eAPZc3AYVyOqx4VtKQOx0E392YQZPIqCUcOiFKcdgcJZBdknQNz4RxM0I2YiOA==", "dev": true, "hasShrinkwrap": true, "dependencies": { + "@colors/colors": "^1.6.0", "appium-idb": "^1.6.13", "appium-ios-device": "^2.5.4", "appium-ios-simulator": "^5.5.1", @@ -8169,7 +8202,7 @@ "bluebird": "^3.7.2", "css-selector-parser": "^3.0.0", "fancy-log": "^2.0.0", - "js2xmlparser2": "^0.2.0", + "js2xmlparser2": "^0.x", "lodash": "^4.17.21", "lru-cache": "^10.0.0", "moment": "^2.29.4", @@ -8186,17 +8219,17 @@ "npm": ">=8" }, "peerDependencies": { - "appium": "^2.0.0" + "appium": "^2.4.1" } }, "node_modules/appium-xcuitest-driver/node_modules/@appium/base-driver": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.4.3.tgz", - "integrity": "sha512-+aDcXzo23Nfm0WdBwD9hGMmo3PSVwPuTEXIMHeoFk2RjHCqy0cSTJ+WIzQV5NOQG7gYEWQlz9p5y8gCo8QkqSw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.5.0.tgz", + "integrity": "sha512-xzxXUrkMen4CqdUjggVeKwrh3+AyO4eSjkrRV+z4Ic39qclAqJS1HGjgJzCuu0RruTRg9DEMd4r2k1RVuf5udA==", "dev": true, "dependencies": { - "@appium/support": "^4.1.10", - "@appium/types": "^0.14.3", + "@appium/support": "^4.2.0", + "@appium/types": "^0.16.0", "@colors/colors": "1.6.0", "@types/async-lock": "1.4.2", "@types/bluebird": "3.5.42", @@ -8204,22 +8237,22 @@ "@types/lodash": "4.14.202", "@types/method-override": "0.0.35", "@types/serve-favicon": "2.5.7", - "async-lock": "1.4.0", + "async-lock": "1.4.1", "asyncbox": "3.0.0", - "axios": "1.6.2", + "axios": "1.6.3", "bluebird": "3.7.2", "body-parser": "1.20.2", "es6-error": "4.1.1", "express": "4.18.2", "http-status-codes": "2.3.0", "lodash": "4.17.21", - "lru-cache": "10.0.1", + "lru-cache": "10.1.0", "method-override": "3.0.0", "morgan": "1.10.0", "path-to-regexp": "6.2.1", "serve-favicon": "2.5.0", "source-map-support": "0.5.21", - "type-fest": "3.13.1", + "type-fest": "4.9.0", "validate.js": "0.13.1" }, "engines": { @@ -8230,31 +8263,21 @@ "spdy": "4.0.2" } }, - "node_modules/appium-xcuitest-driver/node_modules/@appium/base-driver/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/appium-xcuitest-driver/node_modules/@appium/base-driver/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "node_modules/appium-xcuitest-driver/node_modules/@appium/base-driver/node_modules/axios": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/appium-xcuitest-driver/node_modules/@appium/schema": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.4.2.tgz", - "integrity": "sha512-b2tC2sKAS8wnw8V7W7Rm6pXFt8QY4NTWvibprVYi1g8rZLnlmlIwUW0Gl6FhrWTUyK+u4rbF8vVIIBIU8C+i/g==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.5.0.tgz", + "integrity": "sha512-HFed9HtFU6+kLdVyp/xpS/Wfcge8PuMS37LJVShviT6OuzHOYvNFx1/y8+KMa/l0Npvll5eafdfHmUsWlRnUAA==", "dev": true, "dependencies": { "@types/json-schema": "7.0.15", @@ -8267,9 +8290,9 @@ } }, "node_modules/appium-xcuitest-driver/node_modules/@appium/strongbox": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@appium/strongbox/-/strongbox-0.3.1.tgz", - "integrity": "sha512-bNgdra8R4vmEBie4G2DsmPGwcqUP6CFfwOSlhJltaNnkUn3UO4PaK0MzAui+cfi1ThwlZO6MSECf0BDCnS53dA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@appium/strongbox/-/strongbox-0.3.2.tgz", + "integrity": "sha512-3UJi5MP+MBfDomaBtzuXtCzYJCSTpYKfM2bcFp4yl8AWpfSzZLgszOY31Gg8/u1R3LZ9irdBGYxb5wqyaQbYLw==", "dev": true, "dependencies": { "env-paths": "2.2.1", @@ -8281,13 +8304,13 @@ } }, "node_modules/appium-xcuitest-driver/node_modules/@appium/support": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.1.10.tgz", - "integrity": "sha512-zM2Rfw/Moqe3OeC4XiZIDi1kb93iE0nZc5NGybTkP+oWcxv/5UnpZ6MoYl5GH54gblEQHMi9My0dXzA8wYvtMA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.2.0.tgz", + "integrity": "sha512-DhUufCuuzwq+DfiOQc3OcL8gk++XBUnGMytUa3PcLJg98LmKZW2sZadp1M0IUm5TkYxnxq7DfRvdTK5kpULTvw==", "dev": true, "dependencies": { "@appium/tsconfig": "^0.x", - "@appium/types": "^0.14.3", + "@appium/types": "^0.16.0", "@colors/colors": "1.6.0", "@types/archiver": "6.0.2", "@types/base64-stream": "1.0.5", @@ -8297,16 +8320,16 @@ "@types/lockfile": "1.0.4", "@types/mv": "2.1.4", "@types/ncp": "2.0.8", - "@types/npmlog": "4.1.6", + "@types/npmlog": "7.0.0", "@types/pluralize": "0.0.33", "@types/semver": "7.5.6", "@types/shell-quote": "1.7.5", "@types/supports-color": "8.1.3", "@types/teen_process": "2.0.4", "@types/uuid": "9.0.7", - "@types/which": "3.0.1", + "@types/which": "3.0.3", "archiver": "6.0.1", - "axios": "1.6.2", + "axios": "1.6.3", "base64-stream": "1.0.0", "bluebird": "3.7.2", "bplist-creator": "0.1.1", @@ -8319,7 +8342,7 @@ "lockfile": "1.0.4", "lodash": "4.17.21", "log-symbols": "4.1.0", - "moment": "2.29.4", + "moment": "2.30.1", "mv": "2.1.1", "ncp": "2.0.0", "npmlog": "7.0.1", @@ -8334,70 +8357,35 @@ "shell-quote": "1.8.1", "source-map-support": "0.5.21", "supports-color": "8.1.1", - "teen_process": "2.0.101", - "type-fest": "3.13.1", - "uuid": "9.0.1", - "which": "4.0.0", - "yauzl": "2.10.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0", - "npm": ">=8" - }, - "optionalDependencies": { - "sharp": "0.32.6" - } - }, - "node_modules/appium-xcuitest-driver/node_modules/@appium/support/node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/appium-xcuitest-driver/node_modules/@appium/support/node_modules/teen_process": { - "version": "2.0.101", - "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.0.101.tgz", - "integrity": "sha512-rRfOeOc2mv+LU6SjjmE3mjCwS2sQRX5KWexHXu0PXefjLrzFQyooylLOsufzIktIgztDfmCVxuyWFeQLmQXDyQ==", - "dev": true, - "dependencies": { - "bluebird": "3.7.2", - "lodash": "4.17.21", - "shell-quote": "1.8.1", - "source-map-support": "0.5.21" + "teen_process": "2.1.1", + "type-fest": "4.9.0", + "uuid": "9.0.1", + "which": "4.0.0", + "yauzl": "2.10.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=8" + }, + "optionalDependencies": { + "sharp": "0.33.1" } }, - "node_modules/appium-xcuitest-driver/node_modules/@appium/support/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "node_modules/appium-xcuitest-driver/node_modules/@appium/support/node_modules/@types/which": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.3.tgz", + "integrity": "sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==", + "dev": true + }, + "node_modules/appium-xcuitest-driver/node_modules/@appium/support/node_modules/axios": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/appium-xcuitest-driver/node_modules/@appium/tsconfig": { @@ -8414,35 +8402,23 @@ } }, "node_modules/appium-xcuitest-driver/node_modules/@appium/types": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.14.3.tgz", - "integrity": "sha512-zW/fjn6HqvXLQVvWBX0qjYiWpfWKweXQQxUBO6egtiq77PRbDMkpeVAJIF8fvnng7XdaOo4OTdvADaZxpcgKCw==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.16.0.tgz", + "integrity": "sha512-AFKzzgoA3pDZ2YWJpPMAI3ei5j2LTDa8yQGblIf11bhVvLp9dUvCozEbilgaXmMRu3m/pU/ZfU1Se13ARlCQuQ==", "dev": true, "dependencies": { - "@appium/schema": "^0.4.2", + "@appium/schema": "^0.5.0", "@appium/tsconfig": "^0.x", "@types/express": "4.17.21", - "@types/npmlog": "4.1.6", + "@types/npmlog": "7.0.0", "@types/ws": "8.5.10", - "type-fest": "3.13.1" + "type-fest": "4.9.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=8" } }, - "node_modules/appium-xcuitest-driver/node_modules/@appium/types/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/appium-xcuitest-driver/node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -8871,9 +8847,9 @@ } }, "node_modules/appium-xcuitest-driver/node_modules/@types/node": { - "version": "20.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", - "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -8886,9 +8862,9 @@ "dev": true }, "node_modules/appium-xcuitest-driver/node_modules/@types/npmlog": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-4.1.6.tgz", - "integrity": "sha512-0l3z16vnlJGl2Mi/rgJFrdwfLZ4jfNYgE6ZShEpjqhHuGTqdEzNles03NpYHwUMVYZa+Tj46UxKIEpE78lQ3DQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-7.0.0.tgz", + "integrity": "sha512-hJWbrKFvxKyWwSUXjZMYTINsSOY6IclhvGOZ97M8ac2tmR9hMwmTnYaMdpGhvju9ctWLTPhCS+eLfQNluiEjQQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -8901,9 +8877,9 @@ "dev": true }, "node_modules/appium-xcuitest-driver/node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true }, "node_modules/appium-xcuitest-driver/node_modules/@types/range-parser": { @@ -9229,15 +9205,6 @@ "node": ">= 12.0.0" } }, - "node_modules/appium-xcuitest-driver/node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/appium-xcuitest-driver/node_modules/archiver-utils/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -9270,58 +9237,14 @@ } }, "node_modules/appium-xcuitest-driver/node_modules/are-we-there-yet": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", - "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.2.tgz", + "integrity": "sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==", "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/appium-xcuitest-driver/node_modules/are-we-there-yet/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/appium-xcuitest-driver/node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/appium-xcuitest-driver/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -9335,9 +9258,9 @@ "dev": true }, "node_modules/appium-xcuitest-driver/node_modules/async-lock": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", - "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", "dev": true }, "node_modules/appium-xcuitest-driver/node_modules/asyncbox": { @@ -9361,12 +9284,12 @@ "dev": true }, "node_modules/appium-xcuitest-driver/node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.4.tgz", + "integrity": "sha512-heJnIs6N4aa1eSthhN9M5ioILu8Wi8vmQW9iHQ9NUvfkJb0lEEDUiIdQNAuBtfUt3FxReaKdpQA5DbmMOqzF/A==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -9515,13 +9438,12 @@ } }, "node_modules/appium-xcuitest-driver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/appium-xcuitest-driver/node_modules/buffer": { @@ -9816,9 +9738,9 @@ } }, "node_modules/appium-xcuitest-driver/node_modules/css-selector-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.0.3.tgz", - "integrity": "sha512-HAcgYSBFKo1jnglINdHeBPIscPOCOh8vCDCaOV5xkwMSlGPEnfdynxBuWkgZMwXltMKgFbDcr4EPmDpSWi34MA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.0.4.tgz", + "integrity": "sha512-pnmS1dbKsz6KA4EW4BznyPL2xxkNDRg62hcD0v8g6DEw2W7hxOln5M953jsp9hmw5Dg57S6o/A8GOn37mbAgcQ==", "dev": true, "funding": [ { @@ -10242,9 +10164,9 @@ } }, "node_modules/appium-xcuitest-driver/node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "dev": true, "funding": [ { @@ -10495,30 +10417,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/appium-xcuitest-driver/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/appium-xcuitest-driver/node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/appium-xcuitest-driver/node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -11082,15 +10980,18 @@ "optional": true }, "node_modules/appium-xcuitest-driver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/appium-xcuitest-driver/node_modules/minimist": { @@ -11119,18 +11020,18 @@ "optional": true }, "node_modules/appium-xcuitest-driver/node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, "engines": { "node": "*" } }, "node_modules/appium-xcuitest-driver/node_modules/moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "version": "0.5.44", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.44.tgz", + "integrity": "sha512-nv3YpzI/8lkQn0U6RkLd+f0W/zy/JnoR5/EyPz/dNkPTBjA2jNLCVxaiQ8QpeLymhSZvX0wCL5s27NQWdOPwAw==", "dev": true, "dependencies": { "moment": "^2.29.4" @@ -11202,6 +11103,16 @@ "node": ">=0.8.0" } }, + "node_modules/appium-xcuitest-driver/node_modules/mv/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/appium-xcuitest-driver/node_modules/mv/node_modules/glob": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", @@ -11218,6 +11129,18 @@ "node": "*" } }, + "node_modules/appium-xcuitest-driver/node_modules/mv/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/appium-xcuitest-driver/node_modules/mv/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -11811,15 +11734,6 @@ "minimatch": "^5.1.0" } }, - "node_modules/appium-xcuitest-driver/node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/appium-xcuitest-driver/node_modules/readdir-glob/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -12072,6 +11986,47 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/appium-xcuitest-driver/node_modules/sharp": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.1.tgz", + "integrity": "sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.0", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.1", + "@img/sharp-darwin-x64": "0.33.1", + "@img/sharp-libvips-darwin-arm64": "1.0.0", + "@img/sharp-libvips-darwin-x64": "1.0.0", + "@img/sharp-libvips-linux-arm": "1.0.0", + "@img/sharp-libvips-linux-arm64": "1.0.0", + "@img/sharp-libvips-linux-s390x": "1.0.0", + "@img/sharp-libvips-linux-x64": "1.0.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", + "@img/sharp-libvips-linuxmusl-x64": "1.0.0", + "@img/sharp-linux-arm": "0.33.1", + "@img/sharp-linux-arm64": "0.33.1", + "@img/sharp-linux-s390x": "0.33.1", + "@img/sharp-linux-x64": "0.33.1", + "@img/sharp-linuxmusl-arm64": "0.33.1", + "@img/sharp-linuxmusl-x64": "0.33.1", + "@img/sharp-wasm32": "0.33.1", + "@img/sharp-win32-ia32": "0.33.1", + "@img/sharp-win32-x64": "0.33.1" + } + }, "node_modules/appium-xcuitest-driver/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -12527,6 +12482,18 @@ "node": "*" } }, + "node_modules/appium-xcuitest-driver/node_modules/type-fest": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/appium-xcuitest-driver/node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -12740,9 +12707,9 @@ "dev": true }, "node_modules/appium-xcuitest-driver/node_modules/ws": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz", - "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -12894,9 +12861,9 @@ } }, "node_modules/appium/node_modules/type-fest": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz", - "integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.9.0.tgz", + "integrity": "sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==", "dev": true, "engines": { "node": ">=16" @@ -12994,77 +12961,33 @@ "node_modules/archiver-utils/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/archiver/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/are-we-there-yet": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz", - "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/are-we-there-yet/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/archiver/node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", "dev": true, "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/are-we-there-yet": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.2.tgz", + "integrity": "sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==", + "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/arg": { @@ -13131,9 +13054,9 @@ } }, "node_modules/async-lock": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", - "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", "dev": true }, "node_modules/asyncbox": { @@ -13163,9 +13086,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.3.tgz", + "integrity": "sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -13657,13 +13580,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "optional": true - }, "node_modules/chromium-bidi": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", @@ -14262,16 +14178,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -14346,12 +14252,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -14985,24 +14885,6 @@ "through": "~2.3.1" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -15026,16 +14908,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -15940,13 +15812,6 @@ "ini": "^1.3.2" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true, - "optional": true - }, "node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -17324,12 +17189,12 @@ } }, "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" } }, "node_modules/lines-and-columns": { @@ -18021,9 +17886,9 @@ } }, "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, "engines": { "node": "*" @@ -18147,13 +18012,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true, - "optional": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -18197,26 +18055,6 @@ "tslib": "^2.0.3" } }, - "node_modules/node-abi": { - "version": "3.52.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.52.0.tgz", - "integrity": "sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==", - "dev": true, - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "optional": true - }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -18888,63 +18726,6 @@ "node": ">=4" } }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -18984,15 +18765,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -19385,32 +19157,6 @@ "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -20262,27 +20008,44 @@ "dev": true }, "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.1.tgz", + "integrity": "sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==", "dev": true, "hasInstallScript": true, "optional": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=14.15.0" + "libvips": ">=8.15.0", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.1", + "@img/sharp-darwin-x64": "0.33.1", + "@img/sharp-libvips-darwin-arm64": "1.0.0", + "@img/sharp-libvips-darwin-x64": "1.0.0", + "@img/sharp-libvips-linux-arm": "1.0.0", + "@img/sharp-libvips-linux-arm64": "1.0.0", + "@img/sharp-libvips-linux-s390x": "1.0.0", + "@img/sharp-libvips-linux-x64": "1.0.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.0", + "@img/sharp-libvips-linuxmusl-x64": "1.0.0", + "@img/sharp-linux-arm": "0.33.1", + "@img/sharp-linux-arm64": "0.33.1", + "@img/sharp-linux-s390x": "0.33.1", + "@img/sharp-linux-x64": "0.33.1", + "@img/sharp-linuxmusl-arm64": "0.33.1", + "@img/sharp-linuxmusl-x64": "0.33.1", + "@img/sharp-wasm32": "0.33.1", + "@img/sharp-win32-ia32": "0.33.1", + "@img/sharp-win32-x64": "0.33.1" } }, "node_modules/shebang-command": { @@ -20341,53 +20104,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -21157,19 +20873,6 @@ "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index ca9dc3c5..dd011770 100644 --- a/package.json +++ b/package.json @@ -42,8 +42,8 @@ "lint": "eslint config tests" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^6.16.0", - "@typescript-eslint/parser": "^6.16.0", + "@typescript-eslint/eslint-plugin": "^6.18.0", + "@typescript-eslint/parser": "^6.18.0", "@wdio/appium-service": "^8.27.0", "@wdio/browserstack-service": "^8.27.1", "@wdio/cli": "^8.27.1", @@ -53,9 +53,9 @@ "@wdio/sauce-service": "^8.27.0", "@wdio/spec-reporter": "^8.27.0", "@wdio/testingbot-service": "^8.27.0", - "appium": "^2.3.0", - "appium-uiautomator2-driver": "^2.37.0", - "appium-xcuitest-driver": "^5.12.2", + "appium": "^2.4.1", + "appium-uiautomator2-driver": "^2.40.0", + "appium-xcuitest-driver": "^5.13.0", "eslint-plugin-wdio": "^8.24.12", "ts-node": "^10.9.2", "typescript": "^5.3.3" From d24432101d988715193e3494ab31789f4c54fc8c Mon Sep 17 00:00:00 2001 From: wswebcreation Date: Sun, 7 Jan 2024 20:32:03 +0100 Subject: [PATCH 18/18] chore: update/simplify Android app workflow --- .github/workflows/e2e-android-app.yml | 109 ++++++++------------------ 1 file changed, 32 insertions(+), 77 deletions(-) diff --git a/.github/workflows/e2e-android-app.yml b/.github/workflows/e2e-android-app.yml index 85a0341a..8da12af9 100644 --- a/.github/workflows/e2e-android-app.yml +++ b/.github/workflows/e2e-android-app.yml @@ -8,92 +8,47 @@ on: jobs: android-app: - strategy: - matrix: - include: - - chromedriverVersion: "74.0.3729.6" - apiLevel: 30 - emuTag: google_apis - arch: x86 - profile: Nexus 6P - - chromedriverVersion: "2.44" - apiLevel: 28 - emuTag: default - arch: x86 - profile: Nexus 6P - - chromedriverVersion: "2.28" - apiLevel: 25 - emuTag: default - arch: x86 - profile: Nexus 6P - - chromedriverVersion: "2.20" - apiLevel: 23 - emuTag: default - arch: x86 - profile: Nexus 6P - env: - CI: true - ANDROID_AVD: emulator - APPIUM_TEST_SERVER_PORT: 4723 - APPIUM_TEST_SERVER_HOST: 0.0.0.0 - _FORCE_LOGS: 1 # No hardware acceleration is available for emulators on Ubuntu: # https://github.com/marketplace/actions/android-emulator-runner#can-i-use-this-action-on-linux-vms runs-on: macos-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version-file: '.nvmrc' - - run: yarn install - - run: | - mkdir apps - wget https://github.com/webdriverio/native-demo-app/releases/download/v0.4.0/Android-NativeDemoApp-0.4.0.apk -P apps - - run: | - npm config set legacy-peer-deps true - npm install -g appium@next - npm install --chromedriver_version="${{ matrix.chromedriverVersion }}" - npm install --no-save mjpeg-consumer - name: Install dev dependencies - - uses: actions/setup-java@v3 + - name: ⬇️ Checkout Repository + uses: actions/checkout@v3 + + - name: 🟢 Setup Node.js + uses: actions/setup-node@v3 with: - distribution: 'temurin' - java-version: '11' - - run: | - cwd=$(pwd) - pushd "$cwd" - cd ~ - appium driver install uiautomator2 - nohup appium server \ - --port=$APPIUM_TEST_SERVER_PORT \ - --address=$APPIUM_TEST_SERVER_HOST \ - --relaxed-security \ - 2>&1 > "$cwd/appium.log" & - popd - name: Start Appium server - - run: nohup adb logcat > logcat.log & - name: Capture logcat - - uses: reactivecircus/android-emulator-runner@v2 - name: e2e_api${{ matrix.apiLevel }} + node-version-file: '.nvmrc' + + - name: 🧩 Install Dependencies + run: npm ci + + - name: 📦 Download apps + run: | + mkdir apps + wget https://github.com/webdriverio/native-demo-app/releases/download/v1.0.8/android.wdio.native.app.v1.0.8.apk -P apps + + - name: ☕ Setup Java and Android SDK + uses: actions/setup-java@v4 with: - script: yarn android.app - avd-name: ${{ env.ANDROID_AVD }} - sdcard-path-or-size: 1500M - api-level: ${{ matrix.apiLevel }} - disable-spellchecker: true - target: ${{ matrix.emuTag }} - arch: ${{ matrix.arch }} - profile: ${{ matrix.profile }} - - name: Save logcat output - if: ${{ always() }} - uses: actions/upload-artifact@master + distribution: 'zulu' + java-version: '17.x' + + # https://github.com/marketplace/actions/android-emulator-runner#configurations + - name: 📱 Setup Android Emulator + uses: reactivecircus/android-emulator-runner@v2 with: - name: logcat-api${{ matrix.apiLevel }} - path: logcat.log + avd-name: Pixel_7_Pro_Android_14_API_34 + api-level: 34 + script: yarn android.app + + - name: 📲 Run Tests on Android Emulator + run: npm run android.app + - name: Save server output if: ${{ always() }} uses: actions/upload-artifact@master with: - name: appium-api${{ matrix.apiLevel }} - path: appium.log + name: appium-api + path: appium.log