diff --git a/packages/testing/.eslintignore b/packages/testing/.eslintignore new file mode 100644 index 00000000..76add878 --- /dev/null +++ b/packages/testing/.eslintignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/packages/testing/.eslintrc.json b/packages/testing/.eslintrc.json new file mode 100644 index 00000000..8efdd5f0 --- /dev/null +++ b/packages/testing/.eslintrc.json @@ -0,0 +1,6 @@ +{ + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "root": true +} diff --git a/packages/testing/.npmignore b/packages/testing/.npmignore new file mode 100644 index 00000000..ba49d743 --- /dev/null +++ b/packages/testing/.npmignore @@ -0,0 +1,2 @@ +src +node_modules diff --git a/packages/testing/README.md b/packages/testing/README.md new file mode 100644 index 00000000..1150c758 --- /dev/null +++ b/packages/testing/README.md @@ -0,0 +1,161 @@ +# @sei-js/react + +A React helper library for [@sei-js/core](https://www.npmjs.com/package/@sei-js/core) written in Typescript. + +## Tutorial + +For an in depth tutorial, please see [our documentation](https://docs.seinetwork.io/front-end-development/react-tutorial). + +## Installation + +```shell +yarn add @sei-js/react +``` + +# WalletProvider +The first step is to wrap your entire application in a Sei wallet provider and pass in a chainId, rest url, and rpc url. +```javascript + + + +``` + +# Hooks + +| Hook | Params | +|-----------------------------------------------|-----------------------| +| [useWallet](#useWallet) | --- | +| [useQueryClient](#useQueryClient) | (rpcAddress?: string) | +| [useSigningClient](#useSigningClient) | (rpcAddress?: string) | +| [useSeiCosmWasmClient](#useSeiCosmWasmClient) | --- | + +## useWallet + +A hook to connect one of our supported wallets to your application. + + +```javascript +import { useWallet } from '@sei-js/react'; + +const { offlineSigner, accounts, connectedWallet } = useWallet(); +``` + +### Return Values + +| Property | Type | Description | +|------------------|-----------|---------------------------------------------------------| +| connectedWallet | string? | The currently connected wallet | +| chainId | string | Sei chain id | +| restUrl | string | The rest url associated with the connected wallet | +| rpcUrl | string | The rpc url associated with the connected wallet | +| offlineSigner | object? | The offline signer associated with the connected wallet | +| accounts | object[]? | The accounts associated with the connected wallet | + +## useQueryClient + +```javascript +import { useQueryClient } from '@sei-js/react'; + +const { queryClient, isLoading } = useQueryClient(); +``` + +| Property | Type | Description | +|-------------|------------------------|---------------------------------------------------------| +| queryClient | StargateSigningClient? | A stargate signing client. | +| isLoading | boolean | Boolean value for when the initial loading is happening | + +## useSigningClient + +```javascript +import { useSigningClient } from '@sei-js/react'; + +const { signingClient, isLoading } = useSigningClient(); +``` + +| Property | Type | Description | +|---------------|------------------------|---------------------------------------------------------| +| signingClient | StargateSigningClient? | A stargate signing client. | +| isLoading | boolean | Boolean value for when the initial loading is happening | + +## useSeiCosmWasmClient + +```javascript +import { useSeiCosmWasmClient } from '@sei-js/react'; + +const { cosmWasmClient } = useSeiCosmWasmClient(); +``` + +| Property | Type | Description | +|----------------|-----------------|-----------------------------------------| +| cosmWasmClient | CosmWasmClient? | A cosm wasm client for smart contracts. | + +# UI Components +This package contains two helpful UI components for connecting to a wallet provider. + +## \ +This component renders a button that will open a modal to connect to a wallet provider. + +```javascript +import React from "react"; +import {useWallet, WalletConnectButton} from "../lib"; + +const Component = () => { + const { connectedWallet } = useWallet(); + + return ( +
+ +

Connected wallet: {connectedWallet?.walletInfo?.name || "---"}

+
+ ); +}; + +export default Component; + +``` + + +| Property | Type | Description | +|-----------------|--------------|-----------------------------------------------------------------------------| +| wallets | SeiWallet[]? | A stargate signing client. | +| buttonClassName | string | A css class name for styling the button | +| primaryColor | string | A hex value of the color you want to tint the text and icons with | +| secondaryColor | string | A secondary hex value of the color you want to tint the text and icons with | +| backgroundColor | string | A hex value of the color you want to use as a background | + +*If your page has a on the page it can be opened programmatically by calling the hook "useSelectWallet"* + + +## useSelectWallet() +This hook allows you to programmatically open and close the wallet modal. + +```javascript +import React from "react"; +import { useWallet, useSelectWallet } from "../lib"; + +const Component = () => { + const { connectedWallet } = useWallet(); + const { openModal, closeModal } = useSelectWallet(); + + return ( +
+ +

Connected wallet: {connectedWallet?.walletInfo?.name || "---"}

+
+ ); +}; + +export default Component; + +``` + +### Other helpful packages + +- [@sei-js/core](https://www.npmjs.com/package/@sei-js/core) - TypeScript library containing helper functions for wallet connection, transaction sig +ning, and RPC querying. +- [@sei-js/proto](https://www.npmjs.com/package/@sei-js/proto) - TypeScript library for Sei protobufs generated using Telescope diff --git a/packages/testing/babel.config.json b/packages/testing/babel.config.json new file mode 100644 index 00000000..f057b7fe --- /dev/null +++ b/packages/testing/babel.config.json @@ -0,0 +1,10 @@ +{ + "presets": [ + "@babel/preset-env", + "@babel/preset-react", + "@babel/preset-typescript" + ], + "plugins": [ + "@babel/plugin-transform-runtime" + ] +} diff --git a/packages/testing/jest.config.ts b/packages/testing/jest.config.ts new file mode 100644 index 00000000..b9148150 --- /dev/null +++ b/packages/testing/jest.config.ts @@ -0,0 +1,5 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'jsdom', +}; diff --git a/packages/testing/package.json b/packages/testing/package.json new file mode 100644 index 00000000..db85913b --- /dev/null +++ b/packages/testing/package.json @@ -0,0 +1,50 @@ +{ + "name": "@sei-js/testing", + "version": "3.0.2", + "description": "React library for helping with writing great tests for your Sei projects.", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "prebuild": "rimraf dist", + "build": "yarn build:types && yarn build:js && yarn build:prettier", + "build:types": "tsc --project tsconfig.declarations.json", + "build:js": "babel src --out-dir dist --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files", + "build:prettier": "prettier --write dist" + }, + "homepage": "https://github.com/sei-protocol/sei-js#readme", + "keywords": [ + "sei", + "javascript", + "typescript", + "react", + "jest", + "selenium" + ], + "repository": "git@github.com:sei-protocol/sei-js.git", + "license": "MIT", + "private": false, + "dependencies": { + "adm-zip": "^0.5.10", + "axios": "^1.5.0", + "chromedriver": "^116.0.0", + "selenium-webdriver": "^4.12.0" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "devDependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@types/adm-zip": "^0.5.1", + "@types/react": "^17.0.0 || ^18.0.0", + "@types/react-outside-click-handler": "^1.3.1", + "@types/selenium-webdriver": "^4.1.16", + "prettier": "^3.0.0", + "react": "^17.0.0 || ^18.0.0", + "typescript": "5.1.6" + } +} diff --git a/packages/testing/src/index.ts b/packages/testing/src/index.ts new file mode 100644 index 00000000..b303bc8e --- /dev/null +++ b/packages/testing/src/index.ts @@ -0,0 +1,11 @@ +import * as process from 'process'; +import { Buffer } from 'buffer'; + +// Polyfill process and buffer for browser +Object.assign(self, { + process, + global: self, + Buffer +}); + +export * from './lib'; diff --git a/packages/testing/src/lib/index.ts b/packages/testing/src/lib/index.ts new file mode 100644 index 00000000..9a616300 --- /dev/null +++ b/packages/testing/src/lib/index.ts @@ -0,0 +1 @@ +export * from './selenium'; diff --git a/packages/testing/src/lib/selenium/compass.crx b/packages/testing/src/lib/selenium/compass.crx new file mode 100644 index 00000000..0c469dd5 Binary files /dev/null and b/packages/testing/src/lib/selenium/compass.crx differ diff --git a/packages/testing/src/lib/selenium/compass.ts b/packages/testing/src/lib/selenium/compass.ts new file mode 100644 index 00000000..92a64312 --- /dev/null +++ b/packages/testing/src/lib/selenium/compass.ts @@ -0,0 +1,48 @@ +import { By, until, WebDriver } from 'selenium-webdriver'; + +export const setupWallet = async (driver: WebDriver, extensionId: string, seedPhrase: string, password: string) => { + await driver.get(`chrome-extension://${extensionId}/tabs/welcome.html`); + + const createWalletButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Restore a wallet')]")), 100000); + await driver.wait(until.elementIsVisible(createWalletButton), 5000); + await createWalletButton.click(); + + const passwordInput = await driver.wait(until.elementLocated(By.xpath("//input[@placeholder='Enter your new password']")), 100000); + await driver.wait(until.elementIsVisible(passwordInput), 5000); + await passwordInput.click(); + await passwordInput.sendKeys(password); + + const confirmPasswordInput = await driver.wait(until.elementLocated(By.xpath("//input[@placeholder='Re-enter your new password']")), 100000); + await driver.wait(until.elementIsVisible(confirmPasswordInput), 5000); + await confirmPasswordInput.click(); + await confirmPasswordInput.sendKeys(password); + + const checkBox = await driver.wait(until.elementLocated(By.xpath('//*[@id="__plasmo"]/main/div/div/div[2]/form/div[3]/div/div')), 100000); + await driver.wait(until.elementIsVisible(checkBox), 5000); + await checkBox.click(); + + const createPasswordButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Create Password')]")), 100000); + await driver.wait(until.elementIsVisible(createPasswordButton), 5000); + await createPasswordButton.click(); + + const restoreWalletButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Restore a wallet')]")), 100000); + await driver.wait(until.elementIsVisible(restoreWalletButton), 5000); + await restoreWalletButton.click(); + + const passphraseButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Using a passphrase')]")), 100000); + await driver.wait(until.elementIsVisible(passphraseButton), 5000); + await passphraseButton.click(); + + const seedPhraseInput = await driver.wait(until.elementLocated(By.xpath("//textarea[@placeholder='cake pizza cat...']")), 100000); + await driver.wait(until.elementIsVisible(seedPhraseInput), 5000); + await seedPhraseInput.click(); + await seedPhraseInput.sendKeys(seedPhrase); +}; + +export const confirmTransaction = async (driver: WebDriver, confirm = true) => { + //Confirm or reject transaction +}; + +export const unlockWallet = async (driver: WebDriver, password: string) => { + //Unlock wallet with password +}; diff --git a/packages/testing/src/lib/selenium/fin.crx b/packages/testing/src/lib/selenium/fin.crx new file mode 100644 index 00000000..3cff533d Binary files /dev/null and b/packages/testing/src/lib/selenium/fin.crx differ diff --git a/packages/testing/src/lib/selenium/fin.ts b/packages/testing/src/lib/selenium/fin.ts new file mode 100644 index 00000000..2fd590df --- /dev/null +++ b/packages/testing/src/lib/selenium/fin.ts @@ -0,0 +1,80 @@ +import { By, until, WebDriver } from 'selenium-webdriver'; + +const WAIT_TIME = 5000; +export const setupWallet = async (driver: WebDriver, extensionId: string, seedPhrase: string, password: string) => { + await driver.get(`chrome-extension://${extensionId}/tabs/welcome.html`); + + const createWalletButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Restore a wallet')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(createWalletButton), WAIT_TIME); + await driver.sleep(1000); + await createWalletButton.click(); + + const passwordInput = await driver.wait(until.elementLocated(By.xpath("//input[@placeholder='Enter your new password']")), WAIT_TIME); + await driver.wait(until.elementIsVisible(passwordInput), WAIT_TIME); + await passwordInput.click(); + await passwordInput.sendKeys(password); + + const confirmPasswordInput = await driver.wait(until.elementLocated(By.xpath("//input[@placeholder='Re-enter your new password']")), WAIT_TIME); + await driver.wait(until.elementIsVisible(confirmPasswordInput), WAIT_TIME); + await confirmPasswordInput.click(); + await confirmPasswordInput.sendKeys(password); + + const checkBox = await driver.wait(until.elementLocated(By.xpath('//*[@id="__plasmo"]/main/div/div/div[2]/form/div[3]/div/div')), WAIT_TIME); + await driver.wait(until.elementIsVisible(checkBox), WAIT_TIME); + await checkBox.click(); + + const createPasswordButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Create Password')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(createPasswordButton), WAIT_TIME); + await createPasswordButton.click(); + + const restoreWalletButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Restore a wallet')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(restoreWalletButton), WAIT_TIME); + await restoreWalletButton.click(); + + // const passphraseButton = await driver.wait(until.elementLocated(By.xpath('//*[@id="__plasmo"]/main/div[2]/div/div[2]/div[1]/div/div[2]/div')), 100000); + const passphraseButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Using a passphrase / private key')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(passphraseButton), WAIT_TIME); + await passphraseButton.click(); + + const seedPhraseInput = await driver.wait(until.elementLocated(By.xpath("//textarea[@placeholder='cake pizza cat...']")), WAIT_TIME); + await driver.wait(until.elementIsVisible(seedPhraseInput), WAIT_TIME); + await seedPhraseInput.click(); + await seedPhraseInput.sendKeys(seedPhrase); + + const restoreButton = await driver.wait(until.elementLocated(By.xpath("//button[contains(text(), 'Restore')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(restoreButton), WAIT_TIME); + await restoreButton.click(); + + const clearButton = await driver.wait(until.elementLocated(By.xpath("//*[contains(text(), 'Clear')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(clearButton), WAIT_TIME); + await clearButton.click(); + + const nameInput = await driver.wait(until.elementLocated(By.xpath("//input[@value='']")), WAIT_TIME); + await driver.wait(until.elementIsVisible(nameInput), WAIT_TIME); + await nameInput.click(); + await nameInput.sendKeys('Automated Wallet'); + + const startUsingButton = await driver.wait(until.elementLocated(By.xpath("//button[contains(text(), 'Start Using')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(startUsingButton), WAIT_TIME); + await startUsingButton.click(); +}; + +export const connectToApp = async (driver: WebDriver, connect = true) => { + if (connect) { + const connectButton = await driver.wait(until.elementLocated(By.xpath("//button[contains(text(), 'Connect')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(connectButton), WAIT_TIME); + await connectButton.click(); + } else { + const rejectButton = await driver.wait(until.elementLocated(By.xpath("//button[contains(text(), 'Reject')]")), WAIT_TIME); + await driver.wait(until.elementIsVisible(rejectButton), WAIT_TIME); + await rejectButton.click(); + } +}; + +export const confirmTransaction = async (driver: WebDriver, confirm = true) => { + //Confirm or reject transaction +}; + +export const unlockWallet = async (driver: WebDriver, password: string) => { + //Unlock wallet with password +}; diff --git a/packages/testing/src/lib/selenium/index.ts b/packages/testing/src/lib/selenium/index.ts new file mode 100644 index 00000000..3c5958cf --- /dev/null +++ b/packages/testing/src/lib/selenium/index.ts @@ -0,0 +1 @@ +export * from './wallet'; diff --git a/packages/testing/src/lib/selenium/registry.ts b/packages/testing/src/lib/selenium/registry.ts new file mode 100644 index 00000000..a8f51655 --- /dev/null +++ b/packages/testing/src/lib/selenium/registry.ts @@ -0,0 +1,4 @@ +export type Extension = { id?: string; path: string; provider: 'compass' | 'fin' }; + +export const COMPASS_LATEST_RELEASE: Extension = { provider: 'compass', path: './compass.crx' }; +export const FIN_LATEST_RELEASE: Extension = { provider: 'fin', path: './fin.crx' }; diff --git a/packages/testing/src/lib/selenium/wallet.ts b/packages/testing/src/lib/selenium/wallet.ts new file mode 100644 index 00000000..8ed95399 --- /dev/null +++ b/packages/testing/src/lib/selenium/wallet.ts @@ -0,0 +1,124 @@ +import { Builder, By, until, WebDriver } from 'selenium-webdriver'; +import chrome from 'selenium-webdriver/chrome'; +import { setupWallet as setupCompassWallet } from './compass'; +import { connectToApp, setupWallet as setupFinWallet } from './fin'; +import { COMPASS_LATEST_RELEASE, Extension, FIN_LATEST_RELEASE } from './registry'; +import * as path from 'path'; +import { promises as fs } from 'fs'; + +export const initializeWallet = async (driver: WebDriver, extension: Extension) => { + if (!extension.id) { + throw new Error('Extension id not found'); + } + + switch (extension.provider) { + case 'compass': + await setupCompassWallet(driver, extension.id, 'betray knock armed museum gesture visit vapor text curious stove bomb rate', 'password1234'); + return; + case 'fin': + await setupFinWallet(driver, extension.id, 'betray knock armed museum gesture visit vapor text curious stove bomb rate', 'password1234'); + return; + } +}; + +export const switchToExtensionWindow = async (driver: WebDriver) => { + const originalWindow = await driver.getWindowHandle(); + + // Wait for the new window or tab + await driver.wait(async () => (await driver.getAllWindowHandles()).length > 1, 10000, 'New window did not open in time'); + + // Loop through until we find a new window handle + let handles = await driver.getAllWindowHandles(); + for (const handle of handles) { + if (handle !== originalWindow) { + await driver.switchTo().window(handle); + break; + } + } +}; + +const createTempDir = async (dirPath: string): Promise => { + try { + await fs.mkdir(dirPath, { recursive: true }); + } catch (err) { + console.error(`Failed to create directory: ${err}`); + } +}; + +const fileExists = async (filePath: string): Promise => { + try { + const stats = await fs.stat(filePath); + return stats.isDirectory(); + } catch (err) { + return false; + } +}; + +const getExtensionIds = async (userDataDir: string): Promise => { + const extensionsDir = path.join(userDataDir, 'Default', 'Local Extension Settings'); + let extensionIds: string[] = []; + + try { + const doesDirExist = await fileExists(extensionsDir); + if (doesDirExist) { + extensionIds = await fs.readdir(extensionsDir); + } + } catch (err) { + console.error(`Could not read directory: ${err}`); + } + + return extensionIds; +}; + +const test = async (extension: Extension) => { + const userDataDir = path.resolve(__dirname, './instance-data'); + + await createTempDir(userDataDir); + let options = new chrome.Options(); + + options.addExtensions(extension.path); + options.addArguments(`user-data-dir=${userDataDir}`); + + let driver = await new Builder().forBrowser('chrome').setChromeOptions(options).build(); + + await driver.get('https://app.sei.io'); + // await driver.sleep(2000); + + const extensionIds = await getExtensionIds(userDataDir); + + if (extensionIds[0]) { + extension.id = extensionIds[0]; + } + + try { + await initializeWallet(driver, extension); + + const checkbox = await driver.wait(until.elementLocated(By.xpath("//input[@type='checkbox']")), 100000); + await driver.wait(until.elementIsVisible(checkbox), 5000); + await checkbox.click(); + + const agreeButton = await driver.wait(until.elementLocated(By.xpath("//button[contains(text(), 'Agree')]")), 100000); + await driver.wait(until.elementIsVisible(agreeButton), 5000); + await agreeButton.click(); + + const connectWalletButton = await driver.wait(until.elementLocated(By.xpath("//button[contains(text(), 'connect wallet')]")), 100000); + await driver.wait(until.elementIsVisible(connectWalletButton), 5000); + await connectWalletButton.click(); + + const finButton = await driver.wait(until.elementLocated(By.xpath("//p[contains(text(), 'Fin')]")), 100000); + await driver.wait(until.elementIsVisible(finButton), 5000); + await finButton.click(); + + await switchToExtensionWindow(driver); + + await connectToApp(driver, true); + + await driver.sleep(100000); + } finally { + await driver.quit(); + const dirPath = path.resolve(__dirname, './instance-data'); + await fs.rm(dirPath, { recursive: true, force: true }); + } +}; + +test(COMPASS_LATEST_RELEASE); diff --git a/packages/testing/tsconfig.declarations.json b/packages/testing/tsconfig.declarations.json new file mode 100644 index 00000000..40ea07df --- /dev/null +++ b/packages/testing/tsconfig.declarations.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true + }, + "include": ["src"], + "exclude": ["node_modules", "**/*.test.ts"] +} diff --git a/packages/testing/tsconfig.json b/packages/testing/tsconfig.json new file mode 100644 index 00000000..de119117 --- /dev/null +++ b/packages/testing/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "declaration": true, + "outDir": "./dist", + "strict": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "noImplicitAny": false, + "esModuleInterop": true, + "types": ["node"], + "lib": [ + "ES5", + "DOM", + "ES6", + "DOM.Iterable", + "ScriptHost", + "ES2016.Array.Include" + ], + "jsx": "react", + }, + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/yarn.lock b/yarn.lock index 9ffebb0f..c2ec3996 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3600,6 +3600,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@testim/chrome-version@^1.1.3": + version "1.1.3" + resolved "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz#fbb68696899d7b8c1b9b891eded9c04fe2cd5529" + integrity sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A== + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -3625,6 +3630,13 @@ resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== +"@types/adm-zip@^0.5.1": + version "0.5.1" + resolved "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.1.tgz#2d3ab14cd537b68dc53aebe73d91024ce1373e89" + integrity sha512-3+psmbh60N5JXM2LMkujFqnjMf3KB0LZoIQO73NJvkv57q+384nK/A7pP0v+ZkB/Zrfqn+5xtAyt5OsY+GiYLQ== + dependencies: + "@types/node" "*" + "@types/babel__core@^7.1.14": version "7.20.0" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" @@ -3830,6 +3842,13 @@ resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/selenium-webdriver@^4.1.16": + version "4.1.16" + resolved "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.16.tgz#8438a3027c7905f516f7b2fbf85e7ded3763bc53" + integrity sha512-ETje9rr7nTrD0r/mNnIuCAF7fAZ2xKE/1WyxXZZH9N9Cy2NKJTrpEd7SCdzuIlm/1iu1gjHCVbaDwT+MuDrVZg== + dependencies: + "@types/ws" "*" + "@types/semver@^6.0.0": version "6.2.3" resolved "https://registry.npmjs.org/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" @@ -3857,6 +3876,13 @@ resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== +"@types/ws@*": + version "8.5.5" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -3869,6 +3895,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@^5.50.0": version "5.54.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz#2c821ad81b2c786d142279a8292090f77d1881f4" @@ -4011,6 +4044,11 @@ acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.0: resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +adm-zip@^0.5.10: + version "0.5.10" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b" + integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== + agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -4286,6 +4324,15 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.4.0, axios@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" + integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -4547,6 +4594,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -4691,6 +4743,19 @@ chownr@^2.0.0: resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chromedriver@^116.0.0: + version "116.0.0" + resolved "https://registry.npmjs.org/chromedriver/-/chromedriver-116.0.0.tgz#3f5d07b5427953270461791651d7b68cb6afe9fe" + integrity sha512-/TQaRn+RUAYnVqy5Vx8VtU8DvtWosU8QLM2u7BoNM5h55PRQPXF/onHAehEi8Sj/CehdKqH50NFdiumQAUr0DQ== + dependencies: + "@testim/chrome-version" "^1.1.3" + axios "^1.4.0" + compare-versions "^6.0.0" + extract-zip "^2.0.1" + https-proxy-agent "^5.0.1" + proxy-from-env "^1.1.0" + tcp-port-used "^1.0.1" + ci-info@^3.1.0, ci-info@^3.2.0: version "3.8.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" @@ -4838,6 +4903,11 @@ commondir@^1.0.1: resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +compare-versions@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a" + integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -4889,6 +4959,11 @@ core-js@^3.26.0: resolved "https://registry.npmjs.org/core-js/-/core-js-3.29.0.tgz#0273e142b67761058bcde5615c503c7406b572d6" integrity sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cosmjs-types@0.5.1: version "0.5.1" resolved "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.5.1.tgz#f9bc35e78c32b687fb6018dc573eb454b3ae2587" @@ -5029,6 +5104,13 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" +debug@4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -5236,7 +5318,7 @@ emoji-regex@^9.2.2: resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.4.1: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5688,6 +5770,17 @@ external-editor@^3.0.3, external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5744,6 +5837,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + figures@3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -5983,6 +6083,13 @@ get-stdin@^8.0.0: resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -6219,7 +6326,7 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -6261,6 +6368,11 @@ ignore@^5.0.4, ignore@^5.2.0: resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -6295,7 +6407,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6380,6 +6492,11 @@ interpret@^1.0.0: resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +ip-regex@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + is-array-buffer@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" @@ -6570,6 +6687,11 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -6589,6 +6711,20 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +is2@^2.0.6: + version "2.0.9" + resolved "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz#ff63b441f90de343fa8fac2125ee170da8e8240d" + integrity sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g== + dependencies: + deep-is "^0.1.3" + ip-regex "^4.1.0" + is-url "^1.2.4" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -7223,6 +7359,16 @@ jsonfile@^6.0.1: array-includes "^3.1.5" object.assign "^4.1.3" +jszip@^3.10.1: + version "3.10.1" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -7283,6 +7429,13 @@ libsodium@^0.7.11: resolved "https://registry.npmjs.org/libsodium/-/libsodium-0.7.11.tgz#cd10aae7bcc34a300cc6ad0ac88fcca674cfbc2e" integrity sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A== +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -7856,7 +8009,7 @@ object.values@^1.1.0, object.values@^1.1.5, object.values@^1.1.6: define-properties "^1.1.4" es-abstract "^1.20.4" -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -7977,6 +8130,11 @@ pako@^2.0.2: resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -8047,6 +8205,11 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -8137,6 +8300,11 @@ pretty-format@^29.0.0, pretty-format@^29.4.3: ansi-styles "^5.0.0" react-is "^18.0.0" +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + process@^0.11.10: version "0.11.10" resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -8202,6 +8370,14 @@ psl@^1.1.33: resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -8288,6 +8464,19 @@ readable-stream@^3.1.1, readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8503,6 +8692,11 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -8524,6 +8718,15 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +selenium-webdriver@^4.12.0: + version "4.12.0" + resolved "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.12.0.tgz#a8dc8ecf129a2414c2ace6e429aba84722a950a5" + integrity sha512-zvPzmTsky6WfO6+BGMj2mCJsw7qKnfQONur2b+pGn8jeTiC+WAUOthZOnaK+HkX5wiU6L4uoMF+JIcOVstp25A== + dependencies: + jszip "^3.10.1" + tmp "^0.2.1" + ws ">=8.13.0" + "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -8558,6 +8761,11 @@ set-blocking@^2.0.0: resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + sha.js@^2.4.11: version "2.4.11" resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -8813,6 +9021,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -8963,6 +9178,14 @@ tar@6.1.11: mkdirp "^1.0.3" yallist "^4.0.0" +tcp-port-used@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea" + integrity sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA== + dependencies: + debug "4.3.1" + is2 "^2.0.6" + term-size@^2.1.0: version "2.2.1" resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" @@ -9024,7 +9247,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@~0.2.1: +tmp@^0.2.1, tmp@~0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -9304,7 +9527,7 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -9527,6 +9750,11 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@>=8.13.0: + version "8.14.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0" + integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A== + ws@^7: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" @@ -9623,6 +9851,14 @@ yargs@^17.1.1, yargs@^17.3.1, yargs@^17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yn@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"