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 (
+
+
Open Modal
+
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"