From 7a90acf90be136a152b6459d54b46a6393125a44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=A6=AB=EA=A6=B6=EA=A6=A4=EA=A6=BA=EA=A6=B4?= <62529025+spiritbroski@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:04:22 +0700 Subject: [PATCH] add meta code verify (#311) Add meta code verify to check integrity of dashboard --- .../workflows/ci-test-meta-code-verify.yml | 22 + package.json | 6 +- packages/apps/escrow-dashboard/README.md | 10 +- packages/apps/escrow-dashboard/index.html | 1 + packages/apps/escrow-dashboard/package.json | 6 + .../__tests__/generateMerkleTree.test.ts | 72 + .../scripts/generateMerkleTree.ts | 51 + packages/apps/escrow-dashboard/vite.config.ts | 75 +- packages/apps/meta-code-verify/.eslintrc.json | 21 + packages/apps/meta-code-verify/.gitignore | 5 + packages/apps/meta-code-verify/.prettierrc | 12 + packages/apps/meta-code-verify/README.md | 95 + .../_locales/en/messages.json | 116 + .../meta-code-verify/config/v2/manifest.json | 44 + .../meta-code-verify/config/v3/manifest.json | 42 + .../apps/meta-code-verify/images/check.svg | 5 + .../meta-code-verify/images/chevron-right.svg | 14 + .../images/circle-download-cta.svg | 14 + .../images/circle-exclamation-mark.svg | 14 + .../meta-code-verify/images/circle-info.svg | 14 + .../meta-code-verify/images/default_32.png | Bin 0 -> 1186 bytes .../meta-code-verify/images/default_64.png | Bin 0 -> 2563 bytes .../meta-code-verify/images/default_64@2x.png | Bin 0 -> 4532 bytes .../meta-code-verify/images/error-badge.svg | 16 + .../meta-code-verify/images/error-header.svg | 36 + .../meta-code-verify/images/failure_32.png | Bin 0 -> 945 bytes .../meta-code-verify/images/icon-badge.svg | 16 + .../images/loading-header.svg | 36 + .../meta-code-verify/images/menu-badge.svg | 14 + .../apps/meta-code-verify/images/risk_32.png | Bin 0 -> 1274 bytes .../images/temporary-extension-icon.svg | 3 + .../images/temporary-extension-icon128.png | Bin 0 -> 2176 bytes .../images/temporary-extension-icon32.png | Bin 0 -> 756 bytes .../images/temporary-extension-icon48.png | Bin 0 -> 1413 bytes .../images/validated-badge.svg | 16 + .../images/validated-header.svg | 36 + .../meta-code-verify/images/validated_32.png | Bin 0 -> 1180 bytes .../meta-code-verify/images/warning-badge.svg | 16 + .../images/warning-header.svg | 36 + packages/apps/meta-code-verify/images/x.svg | 14 + packages/apps/meta-code-verify/package.json | 46 + .../apps/meta-code-verify/rollup.config.ts | 70 + .../rollup-plugin-clean-once.ts | 45 + .../rollup-plugin-prettier-build-start.ts | 49 + .../rollup-plugin-static-files.ts | 52 + .../rollup-plugin-watch-additional.ts | 24 + .../meta-code-verify/rollup_scripts/utils.ts | 27 + .../apps/meta-code-verify/src/css/popup.css | 280 ++ .../apps/meta-code-verify/src/html/popup.html | 147 ++ .../src/js/__tests__/background.test.ts | 299 +++ .../src/js/__tests__/contentUtils.test.ts | 412 +++ .../js/__tests__/detectKvstoreMeta.test.ts | 14 + .../meta-code-verify/src/js/background.ts | 434 ++++ .../apps/meta-code-verify/src/js/config.ts | 148 ++ .../meta-code-verify/src/js/contentUtils.ts | 1115 ++++++++ .../src/js/detectKvstoreMeta.ts | 11 + .../apps/meta-code-verify/src/js/popup.ts | 355 +++ .../js/tab_state_tracker/FrameStateMachine.ts | 21 + .../src/js/tab_state_tracker/StateMachine.ts | 101 + .../js/tab_state_tracker/TabStateMachine.ts | 90 + .../js/tab_state_tracker/tabStateTracker.ts | 50 + packages/apps/meta-code-verify/tsconfig.json | 6 + .../apps/meta-code-verify/vitest.config.ts | 14 + .../apps/meta-code-verify/vitest.setup.ts | 103 + yarn.lock | 2242 ++++++++++++++++- 65 files changed, 6946 insertions(+), 87 deletions(-) create mode 100644 .github/workflows/ci-test-meta-code-verify.yml create mode 100644 packages/apps/escrow-dashboard/scripts/__tests__/generateMerkleTree.test.ts create mode 100644 packages/apps/escrow-dashboard/scripts/generateMerkleTree.ts create mode 100644 packages/apps/meta-code-verify/.eslintrc.json create mode 100644 packages/apps/meta-code-verify/.gitignore create mode 100644 packages/apps/meta-code-verify/.prettierrc create mode 100644 packages/apps/meta-code-verify/README.md create mode 100644 packages/apps/meta-code-verify/_locales/en/messages.json create mode 100644 packages/apps/meta-code-verify/config/v2/manifest.json create mode 100644 packages/apps/meta-code-verify/config/v3/manifest.json create mode 100644 packages/apps/meta-code-verify/images/check.svg create mode 100644 packages/apps/meta-code-verify/images/chevron-right.svg create mode 100644 packages/apps/meta-code-verify/images/circle-download-cta.svg create mode 100644 packages/apps/meta-code-verify/images/circle-exclamation-mark.svg create mode 100644 packages/apps/meta-code-verify/images/circle-info.svg create mode 100755 packages/apps/meta-code-verify/images/default_32.png create mode 100755 packages/apps/meta-code-verify/images/default_64.png create mode 100755 packages/apps/meta-code-verify/images/default_64@2x.png create mode 100644 packages/apps/meta-code-verify/images/error-badge.svg create mode 100644 packages/apps/meta-code-verify/images/error-header.svg create mode 100755 packages/apps/meta-code-verify/images/failure_32.png create mode 100644 packages/apps/meta-code-verify/images/icon-badge.svg create mode 100644 packages/apps/meta-code-verify/images/loading-header.svg create mode 100644 packages/apps/meta-code-verify/images/menu-badge.svg create mode 100755 packages/apps/meta-code-verify/images/risk_32.png create mode 100644 packages/apps/meta-code-verify/images/temporary-extension-icon.svg create mode 100644 packages/apps/meta-code-verify/images/temporary-extension-icon128.png create mode 100644 packages/apps/meta-code-verify/images/temporary-extension-icon32.png create mode 100644 packages/apps/meta-code-verify/images/temporary-extension-icon48.png create mode 100644 packages/apps/meta-code-verify/images/validated-badge.svg create mode 100644 packages/apps/meta-code-verify/images/validated-header.svg create mode 100755 packages/apps/meta-code-verify/images/validated_32.png create mode 100644 packages/apps/meta-code-verify/images/warning-badge.svg create mode 100644 packages/apps/meta-code-verify/images/warning-header.svg create mode 100644 packages/apps/meta-code-verify/images/x.svg create mode 100644 packages/apps/meta-code-verify/package.json create mode 100644 packages/apps/meta-code-verify/rollup.config.ts create mode 100644 packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-clean-once.ts create mode 100644 packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-prettier-build-start.ts create mode 100644 packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-static-files.ts create mode 100644 packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-watch-additional.ts create mode 100644 packages/apps/meta-code-verify/rollup_scripts/utils.ts create mode 100644 packages/apps/meta-code-verify/src/css/popup.css create mode 100644 packages/apps/meta-code-verify/src/html/popup.html create mode 100644 packages/apps/meta-code-verify/src/js/__tests__/background.test.ts create mode 100644 packages/apps/meta-code-verify/src/js/__tests__/contentUtils.test.ts create mode 100644 packages/apps/meta-code-verify/src/js/__tests__/detectKvstoreMeta.test.ts create mode 100644 packages/apps/meta-code-verify/src/js/background.ts create mode 100644 packages/apps/meta-code-verify/src/js/config.ts create mode 100644 packages/apps/meta-code-verify/src/js/contentUtils.ts create mode 100644 packages/apps/meta-code-verify/src/js/detectKvstoreMeta.ts create mode 100644 packages/apps/meta-code-verify/src/js/popup.ts create mode 100644 packages/apps/meta-code-verify/src/js/tab_state_tracker/FrameStateMachine.ts create mode 100644 packages/apps/meta-code-verify/src/js/tab_state_tracker/StateMachine.ts create mode 100644 packages/apps/meta-code-verify/src/js/tab_state_tracker/TabStateMachine.ts create mode 100644 packages/apps/meta-code-verify/src/js/tab_state_tracker/tabStateTracker.ts create mode 100644 packages/apps/meta-code-verify/tsconfig.json create mode 100644 packages/apps/meta-code-verify/vitest.config.ts create mode 100644 packages/apps/meta-code-verify/vitest.setup.ts diff --git a/.github/workflows/ci-test-meta-code-verify.yml b/.github/workflows/ci-test-meta-code-verify.yml new file mode 100644 index 0000000000..2e03dd5a72 --- /dev/null +++ b/.github/workflows/ci-test-meta-code-verify.yml @@ -0,0 +1,22 @@ +name: meta-code-verify CI + +on: + push: + branches: + - "main" + pull_request: + workflow_dispatch: + +jobs: + meta-code-verify-test: + name: meta-code-verify Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: npm install --global yarn && yarn + name: Install dependencies + - run: yarn compile + name: Compile smart contracts + working-directory: ./packages/core + - run: yarn meta-code-verify:test + name: Run meta-code-verify test diff --git a/package.json b/package.json index b8a4f617f2..db6d41dcad 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,10 @@ "sdk:lint": "yarn workspace @human-protocol/sdk lint", "basemodels:test": "yarn workspace @human-protocol/basemodels test", "basemodels:lint": "yarn workspace @human-protocol/basemodels lint", - "test": "concurrently npm:core:test npm:subgraph:test npm:escrow-dashboard:test npm:fortune:test npm:sdk:test npm:basemodels:test npm:faucet-server:test", - "lint": "concurrently npm:core:lint npm:subgraph:lint npm:escrow-dashboard:lint npm:fortune:lint npm:sdk:lint npm:basemodels:lint npm:faucet-server:lint", + "meta-code-verify:test": "yarn workspace @human-protocol/meta-code-verify test", + "meta-code-verify:lint": "yarn workspace @human-protocol/meta-code-verify lint", + "test": "concurrently npm:core:test npm:subgraph:test npm:escrow-dashboard:test npm:fortune:test npm:sdk:test npm:basemodels:test npm:faucet-server:test npm:meta-code-verify:test", + "lint": "concurrently npm:core:lint npm:subgraph:lint npm:escrow-dashboard:lint npm:fortune:lint npm:sdk:lint npm:basemodels:lint npm:faucet-server:lint npm:meta-code-verify:lint", "prepare": "husky install" }, "workspaces": { diff --git a/packages/apps/escrow-dashboard/README.md b/packages/apps/escrow-dashboard/README.md index ccf89539ea..9fabd03730 100644 --- a/packages/apps/escrow-dashboard/README.md +++ b/packages/apps/escrow-dashboard/README.md @@ -18,7 +18,15 @@ You may also see any lint errors in the console. ### `yarn run build` -Builds the app for production to the `build` folder.\ +Before building you need to set environment variable in `.env`: + +``` +VITE_APP_NFT_STORAGE_API= +VITE_APP_FAUCET_SERVER_URL= +VITE_APP_WALLETCONNECT_PROJECT_ID= +``` + +Builds the app for production to the `dist` folder.\ It correctly bundles React in production mode and optimizes the build for the best performance. The build is minified and the filenames include the hashes. diff --git a/packages/apps/escrow-dashboard/index.html b/packages/apps/escrow-dashboard/index.html index bb2dbacb77..6723031f36 100644 --- a/packages/apps/escrow-dashboard/index.html +++ b/packages/apps/escrow-dashboard/index.html @@ -30,5 +30,6 @@
+ diff --git a/packages/apps/escrow-dashboard/package.json b/packages/apps/escrow-dashboard/package.json index 8a698631c9..b69fec0007 100644 --- a/packages/apps/escrow-dashboard/package.json +++ b/packages/apps/escrow-dashboard/package.json @@ -36,11 +36,15 @@ "devDependencies": { "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", + "@types/crypto-js": "^4.1.1", + "@types/glob": "^8.1.0", "@types/numeral": "^2.0.2", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", "@types/react-test-renderer": "^18.0.0", "@vitejs/plugin-react": "^3.1.0", + "crypto-js": "^4.1.1", + "dotenv": "^16.0.3", "eslint-config-react-app": "^7.0.1", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.26.0", @@ -49,7 +53,9 @@ "happy-dom": "^8.2.6", "identity-obj-proxy": "^3.0.0", "jsdom": "^21.1.0", + "merkletreejs": "^0.3.9", "resize-observer-polyfill": "^1.5.1", + "sinon": "^15.0.4", "vite": "^4.1.4", "vite-plugin-node-polyfills": "^0.7.0", "vitest": "^0.29.2" diff --git a/packages/apps/escrow-dashboard/scripts/__tests__/generateMerkleTree.test.ts b/packages/apps/escrow-dashboard/scripts/__tests__/generateMerkleTree.test.ts new file mode 100644 index 0000000000..ba0dad7bce --- /dev/null +++ b/packages/apps/escrow-dashboard/scripts/__tests__/generateMerkleTree.test.ts @@ -0,0 +1,72 @@ +import * as fs from 'node:fs'; +import * as path from 'path'; +import { NFTStorage } from 'nft.storage'; +import sinon from 'sinon'; +import tmp from 'tmp'; +import { test, assert } from 'vitest'; +import generateMerkleTree from '../generateMerkleTree'; +const mockToken = 'test-token'; + +test('generateMerkleTree should return a valid Merkle tree JSON', async () => { + // Create a temporary directory for the dist/assets folder + const tmpDir = tmp.dirSync(); + const tmpDistAssetsPath = path.join(tmpDir.name, 'dist/assets'); + fs.mkdirSync(tmpDistAssetsPath, { recursive: true }); + + // Create some JS files in the temporary dist/assets folder + fs.writeFileSync( + path.join(tmpDistAssetsPath, 'test.js'), + 'console.log("Hello, world!");' + ); + fs.writeFileSync( + path.join(tmpDistAssetsPath, 'test2.js'), + 'console.log("Another file!");' + ); + + // Mock NFTStorage.storeBlob method + const fakeCid = 'bafybeih42y6g7zkr76j6ax7z6wjc5d56xazsrtxzp6f7j6fsk67djnppmq'; + sinon.stub(NFTStorage.prototype, 'storeBlob').resolves(fakeCid); + + const origin = 'https://example.com'; + + const merkleTreeJson = await generateMerkleTree( + origin, + mockToken, + tmpDistAssetsPath + ); + const merkleTreeData = JSON.parse(merkleTreeJson); + + // Cleanup and restore the actual file system and NFTStorage.storeBlob method + fs.rmdirSync(tmpDir.name, { recursive: true }); + sinon.restore(); + + // Assertions + assert( + merkleTreeData.hasOwnProperty('version'), + 'Merkle tree JSON should have a "version" property' + ); + assert( + merkleTreeData.version === fakeCid, + 'Merkle tree JSON "version" should match the fake CID' + ); + assert( + merkleTreeData.hasOwnProperty('root'), + 'Merkle tree JSON should have a "root" property' + ); + assert( + merkleTreeData.hasOwnProperty('leaves'), + 'Merkle tree JSON should have a "leaves" property' + ); + assert( + merkleTreeData.root.startsWith('0x'), + 'Merkle tree root hash should start with "0x"' + ); + assert( + merkleTreeData.leaves.length > 0, + 'Merkle tree leaves should not be empty' + ); + assert( + merkleTreeData.leaves.every((leaf) => leaf.startsWith('0x')), + 'Each Merkle tree leaf hash should start with "0x"' + ); +}); diff --git a/packages/apps/escrow-dashboard/scripts/generateMerkleTree.ts b/packages/apps/escrow-dashboard/scripts/generateMerkleTree.ts new file mode 100644 index 0000000000..473684243c --- /dev/null +++ b/packages/apps/escrow-dashboard/scripts/generateMerkleTree.ts @@ -0,0 +1,51 @@ +import * as fs from 'node:fs'; +import * as path from 'path'; +import { SHA256 } from 'crypto-js'; +import * as glob from 'glob'; +import { MerkleTree } from 'merkletreejs'; +import { NFTStorage } from 'nft.storage'; + +export default async function generateMerkleTree( + origin: string, + token: string, + buildPath?: string +): Promise { + if (!buildPath) { + buildPath = path.join(__dirname, '../dist/assets'); + } + + const allFiles = glob.sync('**/*.js', { cwd: buildPath }); + const NFT_STORAGE_CLIENT = new NFTStorage({ + token, + }); + const fileHashes = allFiles.map((file) => { + const filePath = path.join(buildPath, file); + const fileContent = fs.readFileSync(filePath, 'utf-8'); + return SHA256(fileContent).toString(); + }); + + const merkleTree = new MerkleTree(fileHashes, SHA256); + const merkleRoot = '0x' + merkleTree.getRoot().toString('hex'); + + // Add the '0x' prefix to each leaf + const leaves = merkleTree + .getLeaves() + .map((leaf) => '0x' + leaf.toString('hex')); + + const someData = new Blob([ + JSON.stringify({ + origin, + root_hash: merkleRoot, + published_date: Date.now(), + }) as string, + ]); + const cid = await NFT_STORAGE_CLIENT.storeBlob(someData); + + const merkleTreeJson = JSON.stringify({ + version: cid, + root: merkleRoot, + leaves: leaves, + }); + + return merkleTreeJson; +} diff --git a/packages/apps/escrow-dashboard/vite.config.ts b/packages/apps/escrow-dashboard/vite.config.ts index 42f282cecb..d75bd1a589 100644 --- a/packages/apps/escrow-dashboard/vite.config.ts +++ b/packages/apps/escrow-dashboard/vite.config.ts @@ -1,35 +1,60 @@ /// /// - +import * as fs from 'fs'; import path from 'path'; import react from '@vitejs/plugin-react'; +import dotenv from 'dotenv'; import { defineConfig } from 'vite'; import { nodePolyfills } from 'vite-plugin-node-polyfills'; +import generateMerkleTree from './scripts/generateMerkleTree'; +dotenv.config(); // https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - react({ fastRefresh: false }), - nodePolyfills({ - // Whether to polyfill `node:` protocol imports. - protocolImports: true, - }), - ], - worker: { - plugins: [react()], - }, - resolve: { - alias: [{ find: 'src', replacement: path.resolve(__dirname, 'src') }], - }, - test: { - globals: true, - environment: 'happy-dom', - setupFiles: './tests/setup.ts', - coverage: { - reporter: ['text', 'json', 'html'], +export default defineConfig(({ mode }) => { + return { + plugins: [ + react({ fastRefresh: false }), + nodePolyfills({ + // Whether to polyfill `node:` protocol imports. + protocolImports: true, + }), + { + name: 'generate-merkle-tree', + apply: 'build', + async writeBundle() { + const merkleTreeJson = await generateMerkleTree( + mode === 'development' + ? 'localhost' + : 'dashboard.humanprotocol.org', + process.env.VITE_APP_NFT_STORAGE_API as string + ); + + const indexPath = path.resolve(__dirname, './dist/index.html'); + const indexContent = fs.readFileSync(indexPath, 'utf-8'); + const newIndexContent = indexContent.replace( + '', + `` + ); + fs.writeFileSync(indexPath, newIndexContent); + }, + }, + ], + worker: { + plugins: [react()], + }, + resolve: { + alias: [{ find: 'src', replacement: path.resolve(__dirname, 'src') }], + }, + test: { + globals: true, + environment: 'happy-dom', + setupFiles: './tests/setup.ts', + coverage: { + reporter: ['text', 'json', 'html'], + }, + }, + server: { + port: 3002, }, - }, - server: { - port: 3002, - }, + }; }); diff --git a/packages/apps/meta-code-verify/.eslintrc.json b/packages/apps/meta-code-verify/.eslintrc.json new file mode 100644 index 0000000000..e0832ce8ef --- /dev/null +++ b/packages/apps/meta-code-verify/.eslintrc.json @@ -0,0 +1,21 @@ +{ + "root": true, + "env": { + "browser": true, + "es2021": true, + "jest": true, + "webextensions": true + }, + "parserOptions": { "project": ["./tsconfig.json"] }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "rules": { + "@typescript-eslint/no-unused-vars": ["error", {"argsIgnorePattern": "^_"}], + "@typescript-eslint/no-empty-function": 0, + "@typescript-eslint/no-extra-semi": 0 + } +} diff --git a/packages/apps/meta-code-verify/.gitignore b/packages/apps/meta-code-verify/.gitignore new file mode 100644 index 0000000000..2063f12809 --- /dev/null +++ b/packages/apps/meta-code-verify/.gitignore @@ -0,0 +1,5 @@ +dist/chrome +dist/edge +dist/firefox +node_modules +.env diff --git a/packages/apps/meta-code-verify/.prettierrc b/packages/apps/meta-code-verify/.prettierrc new file mode 100644 index 0000000000..a34b4a5acf --- /dev/null +++ b/packages/apps/meta-code-verify/.prettierrc @@ -0,0 +1,12 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "trailingComma": "es5", + "bracketSpacing": true, + "jsxBracketSameLine": false, + "arrowParens": "avoid", + "proseWrap": "preserve" +} \ No newline at end of file diff --git a/packages/apps/meta-code-verify/README.md b/packages/apps/meta-code-verify/README.md new file mode 100644 index 0000000000..0e1dcc77fa --- /dev/null +++ b/packages/apps/meta-code-verify/README.md @@ -0,0 +1,95 @@ +# Video Demo + +[Video Demo](https://www.youtube.com/watch?v=BZfnLPGep-4) + +# Description + +This project is a modified version of [meta-code-verify](https://github.com/facebookincubator/meta-code-verify) by Facebook. In simple terms, it's a web extension for checking if the JavaScript hasn't been tampered with by creating a Merkle tree both on the client and server side. You can read more about this concept on the [Mozilla Wiki](https://wiki.mozilla.org/Security/Binary_Transparency). The code pushed to the repository includes a [script](https://github.com/spiritbroski/human-protocol/blob/24b39697a51096c9f982b00b44a469b0c11470de/packages/apps/escrow-dashboard/scripts/generateMerkleTree.ts) to generate a Merkle tree in Vite, and then push the root of the Merkle tree to IPFS. The design is inspired by the WhatsApp binary transparency manifest: + +![WhatsApp Binary Transparency Manifest](https://user-images.githubusercontent.com/62529025/228214669-6cc7446d-e2b1-455f-af94-ebd8f60aba80.png) + +Here's what it looks like in our apps: + +![image](https://user-images.githubusercontent.com/62529025/233022112-f4de94fd-ec48-4d4b-aa4e-e86a907bcec8.png) + + +The main difference is the removal of `hash_function`. While WhatsApp pushes their Merkle root to Cloudflare, our implementation is more resilient as it's decentralized in IPFS, in contrast to the centralized server solution used by Cloudflare. The following is a brief description of the project and how to use it. + +# How to Use + +As this is a web extension, you'll need to have either a Chrome-based browser or Firefox. In this demo, we use Brave browser. First, navigate to `packages/apps/meta-code-verify` and run this script: + +```bash +$ yarn +$ yarn build-local-dev +``` + +Then, go to your browser and open this URL: `brave://extensions/` Turn on developer mode if you haven't: + +![Developer mode](https://user-images.githubusercontent.com/62529025/228216854-1e85b3c3-3f13-441f-82c3-ed188dffeed6.png) + +Click "Load Unpacked": + +![Load unpacked](https://user-images.githubusercontent.com/62529025/228217073-da947a33-e591-48a4-b283-29b258c5128c.png) + +Navigate to the `dist/chrome` folder of meta-code-verify, then click "Select Folder": + +![Navigate](https://user-images.githubusercontent.com/62529025/228217002-c866ff59-2f32-4c7d-9596-af88e98e0e2b.png) + +If successful, it will show something like this: + +![Success](https://user-images.githubusercontent.com/62529025/228217415-034622c6-0cf6-46c2-9d58-237ca72d8bf5.png) + +Now, go to `packages/apps/escrow-dashboard` and then add the necessary environment variable: + +``` +VITE_APP_NFT_STORAGE_API= +``` + +And then run this command: + +``` +$ yarn +$ yarn build --mode development +``` + +Wait until it finishes building, then run: + +``` +$ yarn start-prod +``` + +Go to your browser and navigate to `http://localhost:3000` If you click on the web extension icon, you'll see a green checkmark, indicating that our code is not tampered with: + +![Not tampered](https://user-images.githubusercontent.com/62529025/228218083-ea324fe9-fb45-46be-80dc-3ed6a712d983.png) + +To test if our code is getting tampered with, first, stop the `yarn start-prod` command (use CTRL+C on Linux). Then, go to `index.html` in the `packages/apps/escrow-dashboard` and add ``: + +![Script added](https://user-images.githubusercontent.com/62529025/228218787-69c76cbe-fef1-42eb-b917-5fc5c2959048.png) + +Run `yarn build --mode development` again, followed by `yarn start-prod`. When you go to `http://localhost:3000` again, you'll see a red exclamation mark: + +![Red exclamation](https://user-images.githubusercontent.com/62529025/228222259-d144fd17-0f7d-4a2b-93ff-caf57ae31ced.png) + +This indicates that one or more scripts are not in the Merkle tree. If you download it, you'll get a list of all JavaScript files and their source code in gzip files, so you can check it yourself. + +# Allowlist + +Allowlist allowing you to allow some of the extension that you deemed safe to use for example you want to use [metamask](https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=en) you will surely get an error like this: + +![Red exclamation](https://user-images.githubusercontent.com/62529025/228222259-d144fd17-0f7d-4a2b-93ff-caf57ae31ced.png) + +You can now open allowlist on the right sidebar and click allow + +![image](https://user-images.githubusercontent.com/62529025/233215157-4df40b3b-c9b1-49fb-a689-9e41784607e9.png) + + +![image](https://user-images.githubusercontent.com/62529025/233020636-032fd746-82f5-4974-b2e7-bab0c4f5c76b.png) + +And now your code is validated again + +![image](https://user-images.githubusercontent.com/62529025/233020950-76945a40-82fa-4f06-8dfa-4f4eeb8093d8.png) + + + + diff --git a/packages/apps/meta-code-verify/_locales/en/messages.json b/packages/apps/meta-code-verify/_locales/en/messages.json new file mode 100644 index 0000000000..1f64facf40 --- /dev/null +++ b/packages/apps/meta-code-verify/_locales/en/messages.json @@ -0,0 +1,116 @@ +{ + "about_code_verify_faq_url_msgr": { + "message": "https://www.messenger.com/help/799550494558955" + }, + "i18nAllowlist": { + "message": "Allowlist" + }, + "about_code_verify_faq_url_wa": { + "message": "https://faq.whatsapp.com/web/security-and-privacy/about-code-verify" + }, + "about_code_verify_faq_url_fb": { + "message": "https://www.facebook.com/help/728172628487328" + }, + "validation_failure_faq_url_msgr": { + "message": "https://www.messenger.com/help/799550494558955?ref=learn_more#validationfailure" + }, + "validation_failure_faq_url_wa": { + "message": "https://faq.whatsapp.com/web/security-and-privacy/why-am-i-seeing-a-validation-failure-warning" + }, + "validation_failure_faq_url_fb": { + "message": "https://www.facebook.com/help/728172628487328?ref=learn_more#validationfailure" + }, + "possible_risk_detected_faq_url_msgr": { + "message": "https://www.messenger.com/help/799550494558955?ref=learn_more#possibleriskdetected" + }, + "possible_risk_detected_faq_url_wa": { + "message": "https://faq.whatsapp.com/web/security-and-privacy/why-am-i-seeing-a-possible-risk-detected-warning" + }, + "possible_risk_detected_faq_url_fb": { + "message": "https://www.facebook.com/help/728172628487328?ref=learn_more#possibleriskdetected" + }, + "network_timeout_faq_url_msgr": { + "message": "https://www.messenger.com/help/799550494558955?ref=learn_more#networktimedout" + }, + "network_timeout_faq_url_wa": { + "message": "https://faq.whatsapp.com/web/security-and-privacy/why-am-i-seeing-a-network-timeout-error" + }, + "network_timeout_faq_url_fb": { + "message": "https://www.facebook.com/help/728172628487328?ref=learn_more#networktimedout" + }, + "i18nValidatedStatusHeader": { + "message": "Validated" + }, + "i18nValidatedStatusMessage": { + "message": "Web page code verified." + }, + "i18nCheckingStatusHeader": { + "message": "Checking..." + }, + "i18nRiskDetectedStatusHeader": { + "message": "Possible Risk Detected" + }, + "i18nRiskDetectedStatusMessage": { + "message": "Cannot validate the page due to another browser extension. Consider pausing the other extension(s) and re-trying." + }, + "i18nRiskDetectedLearnMoreButton": { + "message": "Learn More" + }, + "i18nRiskDetectedRetryButton": { + "message": "Retry" + }, + "i18nNetworkTimeoutStatusHeader": { + "message": "Network Timed Out" + }, + "i18nNetworkTimeoutStatusMessage": { + "message": "Unable to validate this page." + }, + "i18nTimeoutLearnMoreButton": { + "message": "Learn More" + }, + "i18nTimeoutRetryButton": { + "message": "Retry" + }, + "i18nValidationFailureStatusHeader": { + "message": "Validation Failure" + }, + "i18nValidationFailureStatusMessagePartOne": { + "message": "The source code on this page doesn't match what was sent to other users. " + }, + "i18nstatusValidationFailureMessageHighlighted": { + "message": "Download the source code" + }, + "i18nValidationFailureStatusMessagePartTwo": { + "message": "to examine why the page was not validated." + }, + "i18nAnomalyLearnMoreButton": { + "message": "Learn More" + }, + "i18nTopLevel": { + "message": "KV Store Code Verify" + }, + "i18nTopLevelLearnMore": { + "message": "Learn More" + }, + "i18ndownloadSourcePrompt": { + "message": "Download Source Code" + }, + "i18nReportBugStatusHeader": { + "message": "Report a Bug" + }, + "i18nReportBugStatusMessage": { + "message": "Having a problem? Click below to report the bug." + }, + "i18nReportBugButton": { + "message": "Report Bug" + }, + "i18nDownloadPrompt": { + "message": "Download" + }, + "i18ndownloadSourceDescription": { + "message": "Download a .zip file containing all running JavaScript on the page." + }, + "i18nDownloadSourceButton": { + "message": "Download" + } +} diff --git a/packages/apps/meta-code-verify/config/v2/manifest.json b/packages/apps/meta-code-verify/config/v2/manifest.json new file mode 100644 index 0000000000..138a8b60a6 --- /dev/null +++ b/packages/apps/meta-code-verify/config/v2/manifest.json @@ -0,0 +1,44 @@ +{ + "manifest_version": 2, + "name": "KV Store Code Verify", + "version": "2.0.1", + "default_locale": "en", + "description": "An extension to verify the code running in your browser matches what was published.", + "page_action": { + "default_title": "KV Store Code Verify", + "default_icon": { + "32": "temporary-extension-icon32.png", + "48": "temporary-extension-icon48.png", + "128": "temporary-extension-icon128.png" + } + }, + "icons": { + "32": "temporary-extension-icon32.png", + "48": "temporary-extension-icon48.png", + "128": "temporary-extension-icon128.png" + }, + "background": { + "persistent": true, + "scripts": ["background.js"] + }, + "content_scripts": [ + { + "matches": [ "*://localhost/*", + "https://dashboard.humanprotocol.org/*"], + "all_frames": true, + "match_about_blank": true, + "exclude_matches": [ + + ], + "js": ["contentKvstore.js"], + "run_at": "document_start" + } + ], + "permissions": [ + "management", + "storage", + "https://*.nftstorage.link/*", + "webRequest" + + ] +} diff --git a/packages/apps/meta-code-verify/config/v3/manifest.json b/packages/apps/meta-code-verify/config/v3/manifest.json new file mode 100644 index 0000000000..dc6f900bce --- /dev/null +++ b/packages/apps/meta-code-verify/config/v3/manifest.json @@ -0,0 +1,42 @@ +{ + "manifest_version": 3, + "name": "KV Store Code Verify", + "version": "2.0.1", + "default_locale": "en", + "description": "An extension to verify the code running in your browser matches what was published.", + "action": { + "default_title": "KV Store Code Verify", + "default_icon": { + "32": "default_32.png", + "64": "default_64.png", + "128": "default_64@2x.png" + } + }, + "icons": { + "32": "default_32.png", + "64": "default_64.png", + "128": "default_64@2x.png" + }, + "background": { + "service_worker": "background.js" + }, + "content_scripts": [ + { + "matches": [ "*://localhost/*", + "https://dashboard.humanprotocol.org/*"], + "all_frames": true, + "match_about_blank": true, + "exclude_matches": [ ], + "js": ["contentKvstore.js"], + "run_at": "document_start" + } + ], + "permissions": [ + "webRequest", + "storage", + "management" + ], + "host_permissions": [ + "https://*.nftstorage.link/*" + ] +} diff --git a/packages/apps/meta-code-verify/images/check.svg b/packages/apps/meta-code-verify/images/check.svg new file mode 100644 index 0000000000..925923dd81 --- /dev/null +++ b/packages/apps/meta-code-verify/images/check.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/packages/apps/meta-code-verify/images/chevron-right.svg b/packages/apps/meta-code-verify/images/chevron-right.svg new file mode 100644 index 0000000000..1c164aca51 --- /dev/null +++ b/packages/apps/meta-code-verify/images/chevron-right.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/circle-download-cta.svg b/packages/apps/meta-code-verify/images/circle-download-cta.svg new file mode 100644 index 0000000000..186eb0815d --- /dev/null +++ b/packages/apps/meta-code-verify/images/circle-download-cta.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/circle-exclamation-mark.svg b/packages/apps/meta-code-verify/images/circle-exclamation-mark.svg new file mode 100644 index 0000000000..54971d8840 --- /dev/null +++ b/packages/apps/meta-code-verify/images/circle-exclamation-mark.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/circle-info.svg b/packages/apps/meta-code-verify/images/circle-info.svg new file mode 100644 index 0000000000..347c514ff8 --- /dev/null +++ b/packages/apps/meta-code-verify/images/circle-info.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/default_32.png b/packages/apps/meta-code-verify/images/default_32.png new file mode 100755 index 0000000000000000000000000000000000000000..6f911396382c78bf4f042218bae9ba035d6f118d GIT binary patch literal 1186 zcmV;T1YP@yP)uN6UvsE`muiLHk= z(P={cwie-`RYrsssV=K3m8Q;jJF}Uc&dg3H{gS(PckbD9zWd#C@0{x)hv@3+@^QC} zTNbx8ZW1@2IvnPva0_vhx!v)2JYgq(J@E`Uu*6+{B+`~w|6cLQHP5K-)f;MR{zj3u zKf=bFG?-E*PoOCiCCW&hM*g{(cwEY@h>0k!2&gkIjQnoPzgBjSuHFhp1I9!0=#jKE zC!2B?XHoK)QN>JRXRipTv#z>!t6VyF`MTr4W<)lvSxLD$euaN#o2lV336AwGJAS5A zx>{CFeSy`>m(Z>)>lFUFoJoW%31~AfI&xYHR#s78B6qQ$3ioVP$e=`mE;!b_3Nv>T zTpB-)5)%_G$AgtJ!8c;4v0@1@3WF80E7|??GU>*JVmf(fzpWj7b3#jq6+-~h^R~)A z&k5%S3+K-keany5xV9pxd1tB19aSI@tgNOlU%yjtF6{h zA3t^sojn?$!v_j_kkI6pYo5}ASsB9S;>klIDXjn%8u(O2Y!L9*^3iGqI68mgpy*p# z!&Kj>M8}NsV+=M>3xw@R;7Dg=fk0|Q<44Qja0G{Nym@zkK7DD9jvM927;K!7sOz3| z8VE@BjUOBZS3Z4?vC+%l(eY1whm8{wP2Ec_fq>8KtlzV3gKcoV{1tLd%$Sh`d>Mf} zKww9wN5@fiT|ZMjSbH!B$31{%V%Lv$Hd1%(#5;WrTM~61p%5D9NKo z^)N77OKpG0%KtFtf3Q7%aIfw10V$It5e5Warl(FNGZ;zWtVgexzxLJJnBX9abHgq; zfa-}60s&c@O*|5ic4qo?OZhRTofme&fsEMy<2K82g7d& zjpDgce*7LWd>B1=QfC_+ONloq<4yvqS5Amat5z%_JHX+Un|H-=YbHMcHDF^G9N-cS zT`6K~+prjAli6-CBF8^Z^k&)b1X{t$D8h#zfD(ySDA~AnWn2fop~4a? zry4w4e`~TV%i}508|Y?kUzY1gNZeJSNJX9Krc?uv)W|DNaD|*+OmrlW69Im0?zqe4 zT6u-+m*??wXfe&!#jmgL+CH3c%P)F@x^pbCZ$Z2 z!d`FEB_1kveK|EDqFvAZ+)~NV!Z literal 0 HcmV?d00001 diff --git a/packages/apps/meta-code-verify/images/default_64.png b/packages/apps/meta-code-verify/images/default_64.png new file mode 100755 index 0000000000000000000000000000000000000000..2b5568702d722ed7b62bc9f215d4a7dc13da909a GIT binary patch literal 2563 zcmV+e3jFnnP)2S+nW7CQWUdR89ZuKd$|!o2H4{ zq#N6$THC}n>mw3tqvF;vy2e!z&pb?oFgH|$hB{>y3Dd&f@G5B!9s#~m;jh7rJK-(*n|l%1Lv zyCew~!~lXAlJucRc3m<`GISGQG$tMjO@mXCv0s(dBYFv8f)1?6duOL4%cqEn1vL3Y zj1qj$vP+t2Q}V(rXLIe{3Pg#hB*0d%$*Opi!~7B$1K_3MF}YVqBMl>#0Ks*y{4e6d zVvG?G7cH_TZ%ba3+1pfGd2J+pM?`>}^+o&WppAc3Dm^|i-FVW-~7N6rb00Wl5^1RL4WJufa^1&KzDfC+cLiCyY&=TRS#kSr|MQy%N?hj{)&DQkdl_QhXWhL0W+sh!^VO&C|qyH+&QyQ z_plK?y)GDxL|K-5$w_kfD*^;y?#mweAmZfau3TZm_IEcUD#r??tEU&|E`1gQogiqUvP zO+jK}pGDrXAy0U0`wku<-=G&p!DTkv722&aEY_brb2_$ec^mH(<_GGS>z`e}h0d<7 z0qxoR<=Nj1l&imZfX3#>=dX;TB`vO85`^1alS`*2_XvSF$C0gcVi z;Aa^DV!l--(Xv7(SnRiMDHJd0=a^en@gJJNU>wU|^WDJr&dx5}tF43ErHV55;l4}+ zRqd;rOk?*Ep-? zR5;HqH1u`0x8r}b{v$z;q8$qK-cE%KV7;Vs=Z6(kF9jV|{{nbI!}&$rM7?3mn#C;p?21!CDS{GKI0%aEABi*lJyW5ED~^W3IQvCz8B7ZYKEgoeKN>mHKx z(>P!(Zo46`zuP+;&vL{tp-lFgybc%yzvss5(+{3NA!U1+qoJYiruT9!EM_+Iz(S? zcj8Qm$R`*X3bO^^x%WBm9&a&esGTqntQa4E^$b%cPZEl*ySt}f=zFuG5>Hy5hVAQY zYsa7ddQ=dswXKcB{tS#qpX3VyP*`}1J`5!QbL-I26M=Fr1wO%{@7?MebVuMQr^Rnq z-V=YZ0w28OPa%)u1f~WjVu-i%UmVtGdD=?RUtO%WzlH>ff1Ur-X|OAN05QT$;=FCi zi$i7ACCAc2>%%5QRFnEatj*$Rf{ab8$K+lU?zgb{Bwi!4(=vN0 zdX39z5u-t3{+nCpPo53;Tf~G~^MlH3b5b*=ke8T?@eB=n$?1uB-f_^3Vsl;9**R$$ zsYY&}jV8$S{;l-FiQR*>d3g^@Yq&_9Uo%v*VP%DHmK@I}xAh3d37GT4nLK0IN%iIj zRi~2EG9{83JH{?Z;cEv<+IY$izN@aOpq3j z)@3T+#DDKm)pu|G_oM?lVBFQ&zN5DG7)pdDZj1td7gG+ecuZfOjs&4F-6osQo8x~2DNV065CJO^++N2uM{KXp Ze+`lsE%FHSp7a0!002ovPDHLkV1gf4^hp2! literal 0 HcmV?d00001 diff --git a/packages/apps/meta-code-verify/images/default_64@2x.png b/packages/apps/meta-code-verify/images/default_64@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..0bef927305eeca853a1664c4227471c8c385f990 GIT binary patch literal 4532 zcmV;l5lilgP)6Af-(*h|iL?GdKh~ZC?U?Y9|jQGwn0@Ei>&*!b4{I zMtDs~YMzon2x6M1q~IXZK!5<2!5G^ZkomB|+ST@)Ys-=4U1?X^)!u9EZ^p=I<(0Je z+;jiuoO|yw7>8_#G}R|7f??1D3jtCM0f6UpVD&m<^>m!+dcD!#;qf>gOW>~wV35#t zy&WLXhRRCz{%q8BsAmjnzyXt@Vj&NK<4X%()nl#4KWYI95ZVCNZ`(sXeW#v+H$`o9Gf;EHQGZ0Wpw=w%Fd?J? zP;bXib^w2k!1y4F7SSx?5FwNSjKhW>1@{V!9c(@R!4VJyAq-%=H+(iC8G@$<5Z=*L zuV~6)D3gXC1A`VdpuXj$M)1S{cqmt)?8mNf5PYZ=4yuFdp;)vf0VSs720-o}Gj4|& zcpkqC1q}|(Ynt&eITf21Sv(D?6&VY-!Y5?oD?|ug>YHwrX zSAvgSD$y0}s9mxW&G0w3|wVUyLFMV1V}kN4$*CyA2DHCFNimWBYD z!09)>Jn*4FQ7lcp%j*G#%e!shBOMqOG~|m4@_GP8Ro(#~DH&dKk&~Pr;Q4L4_68tO zRH{){CRbO(^l8sQRaF&C2!-JCwKmW+4U(z~Qjtdx=JWszg0@16@kB*M2n}E=%$+k6 z=Fgi0p^yT>pzCvJoo8stU5>*hlymR@{jOibs-G-@Uv7G7)bsy28-pVsv_SmkZMgTK z^#JAE`{&orf$3AnCe*5{tDvE79!#p92vU*53m6&z-;JY;!@f1Em&1a2 zW0x_^nmHXdtPR7=8Ph;AB0Q02fUyV2Gj5Dmswyj?X3AukJ#z+3o;+#H@kfuJK>XHi zc>JUvq{F05#~1*`{ZOX!`APUyRaL?iZ2XCpW7o0_4kr27|7>s&BqTyx?qolyWIqv9 zg9qi`JgzX7FKvKD3m2Fk@9OS_=)eC9iM~f5Bf73P;lrrC4#y4wEU*#Elo=TIkpMK} z;iJds`kz4mzyN3|4Wxv@{_Lkl8Nk{tuQipk_*+mrn+rfAy6^Tv@BRDG_wX?v3M8c_ zTMUl&01TR-45`3OABn%|)249&XvF#NF2l{vZjc??YcccxqYQun+X-a|W%x+^O`cTE z1)vcfon3J6zC_6%6R=d=lsRi?L<9~`_$bS%UUO#6fDP*!`J)*m{`v==!Z?6$wF|U& zA!HbU4*FguiTtN{efqQ-6m2!U=RU-7xerAe_0mF^i02^jS7i|T4Pc{F0f@xkU~;Gs zv;bdAo?^*Wd8Ht>d{UOTmB%5d(U!Ntq=41tS3{96)# z@`iP=bWt5lnKTLJ&YlSi7tG_HXvM9?aO{(lAUYK3(Kh>MqAhW50KsH1T-+kD(m|!! zMfD4yF(X`?KHPIDOV@Gx4s_T!A2nR{#41zqN5U^{Q1qJB*!!0@)L~I*{>W>{2uL5) zJU3Yi10V)Np$I;_pB@4tAUHd)G)r#xcd!1+@HjONx#X|Tod-KaUVH&FfQw9zU;g0+ zcklc?rVPCYJ!X?0l86|FjG`L?gB17p+yGcW-0`1W^g=AbE?wNfOR;7oQJ|3!OeXEk z*fA^plJFw|__%+73qV4(@E&wN5{2ZU+HZD3;^9LO5xTnyJq~#Q9mjt`0|09LrdPJ` zvEM9BOAI`H3f(=uywU7H;?Kza(|IWScOQq9v;ZVGPw!Dbzt;48^f_msK~YYj1-(Gx zJ24Fasi%K}VXP1Zn3%hF?!<;)+qfEjw&tfW4KFH9%Q7N%@iLtM_7Z${>PxtVyKQyMUShk4wd?SUPhAZ`(9dPl=HD0u_LcY>3^>#XM zX7Y#5P4Cfm^H$DCBb`@Rf!ZQ$Qd+AB4_Y|Ie|HE~-9=`>J z;6&+{8kGbejrr-Egb|_&L(B-)D_9;{2!dc$@KNK_xPS6rXW#-hLLpc!{pNytG&L#- zzFePKRAERr)Ko-S>raA@dOlsOX;aNV5;gqySFght*!b<3g0%~kerb$$s`T4_>ozw8 z>ftMvEjAqv=sVG|N00lV9y5m`3H`=83Sj_t1RuG5a=(c_`#s6&(l2QQ`YhMu zH>DGXbSqs&53m}h>);io5PX@qRr-}x7%E=fdX@6;vt~?#x_Py(3%*S3mVWJGM;P8u zJmlHU9?UH~=^ubn!C^!~ZPMDB$!DX?6FPnU&-?n%MTx)BGVzDX=gTvQA@o>?pX9j=;DBc4C zIdTx0g3k%^m43T>@9~Ucv2bD7cNrEgs2%YHM$mVsYvAQfEJ2h+yC_V-STOEIB%o?3 ze&K1?4Ktk1pqZ6^6AvHp-rsZY0sl3Rk&U+MSh(`V3y`Tqe2dcU2FCVh9h243ULCaVArQ#2X zKQe?uDRoBE5dzSsU_~GS0+fT@EUo4${dV=xw68uc{!#^`#J$RBI)RSfAFF{Z4g%n2 zX*E~rm&D)guAYL$pH~@8Ctx~?K(Yc+CWP26t@hl#2U9WRikigkR!YAl{&Li7mb+VbVk!bVgW6r#Xu13mR4z8U$(fx^mSHBza;)B3@ij%q|&f(KJWQv z=O>CSVY>x(`~>g%>$dKGAmYm41Al!Zr!Y*@{P*|xMb1tc)9M{^&$Qp4nS0*6YcC)F z?F<2pd`;pUIPjM@a=uO|!8ew~xf4gHri0=*2sk;^sxYJmp}qThah#>GmIN1(tMp6W zh8mq3U$dBqNv}#?i6QBthC0*Ni75ESpbza8#0>y-z-e>`!Wn>7Vc4`|3pW;8p3QsR z@bHnV^xJj!E{^^8Z1w!~s^rZt|2$_-LPWurjm~s_gQ+0{2?c1XX6kwK*qSn!PktFipL^`Czyr}+6aQ84m!UKf-f7) z03J#IK4Ji>s>T#WNyxBMSXvlzG|2Z zfToYr5^|9RUlxhXdk2hMA-cub+O4~fVJz@E2u@lU8Zi+YKVAAYqL|Vz6^l}+HE4yf ztf2dE$^8GQE`p8!K1g5yxmbfGS=z?M3@1vzGK1mYC<7Q3`*GKxgVft$QlZGL(y#2$ z6tHuj9X*!$oKf(92qcDb^kEC7U(KU=c;1qVWGMaTk;`?TJVLPN>|8c|H? zcRZj4wdU;S#uz~C#D^3kMnN)YfdvV_>R}ORL@}jb>Cqu-bQe*@E5HgAVNdVd@{f;NN__KT8K<))3BCP?8 z+&`6mNdWTtzihXDbppl?njJDV0NK0%%@6##^#Xs)hL?U(0G1=v`&*BHaK!9*AkSY* z;{~2P8Q{Bm8!fUZr1U#($kF@xVaUU}ZM$jWKm;VAazX{_fDml_#d_$+N*(3=rMuU! zQ|Qowp8VBZFUh+$Pz|d46ipFwuTvv5ErtK8d}h#Ka*!8m=&>A874@xrugSYLMc1{< ziP}XgnJi&pDwX1^ZOP@|#gZ?@{Sx2it#EMo{^t0{d6RmU=7C|U_+1hc;3EapR@7!z zUTet!s8q~!eINKp0ksvinU&XC-kqrP#-;e&h80s8V;jInSg_uIsP*%Y{$cg?wx$AO z7VV%v6o?Ct`A>Xg>)sEx41nB<7EErEea^smM8`JaZDSMLivg&jlwzs8;e}6W!Gun; zQME501?^CH=f?LjUk?ZbhJ2Xtc^e9#sP$m7WeLY4==xh)^JM#SQPg@cHL21Y3$wpK zxj~{&Q`Mrv^P&uZL?Nb%U-ct{(!(1cMW5Ap-wa2V1k=5TgIeemZ9fh^t~1j31&F?E z99t9a8$oGsvhfK=HwEyGz+Iefe8SO90qBF#2lO?8E5w{`e8TZvA-EAFlWS-)0{A!r zg?boqIo|k$tNX&N+q(N8zQY0VDHvYdv6uDyB*$N)FDEa-$XlBvux@AWKfxt7_)*reCR`V#Q|IHU4mwb~UPj`pp z+CWv_VGNp}9MK`FD(b#cjP+&+u|4SX+ji|`5Ij&e!-CG2+%=cl-5Vj){;=cT5Cm%Y zG(v6=OhR!uffRx9fPf93M$8?ehZ)icLChuwHp=D|D3OB~_YiHsd3I>m6(JGY05ZWG zLKASY$aXS8H?!o~JEphjIy)j_Z#P031IUEu5s27$dW?3RZZcI$DS>8EMK<%(n~dM4^!2 + + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/error-header.svg b/packages/apps/meta-code-verify/images/error-header.svg new file mode 100644 index 0000000000..cf5fd2373b --- /dev/null +++ b/packages/apps/meta-code-verify/images/error-header.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/failure_32.png b/packages/apps/meta-code-verify/images/failure_32.png new file mode 100755 index 0000000000000000000000000000000000000000..df4214cffeb1d8cc2f698fb5ed1e85cebfb878b1 GIT binary patch literal 945 zcmV;i15W&jP)QLjVO>Pf=@6;Ar6z0=l#1%GlfFrCi%dhVTj|1$uqN-Yjd zDi(_gcxc9G#Hhs(7ecdi4s3jpj0XwBhcSXN#BrQ#;`Z!72qNOa6%ER5GtXWKp*Ld? zo}7e;|J$PL@+!)qpt2H*>UKkM<3X?sB{%SN4}wW7dC~%@73qrj{jT8ke)#?P3B?;NU2IR>XmQZ7N@UXV+Jt-D?Qf%!kN<&{(Cr8wYU^8 zwF{xpy{U_xA`MS2#5dH#hRc^ETQT2)P(EM!-T4$`%uSdf`3$1o8X)Dw`Gy2?;>Lf(DXw`@KR?UQLEG|l z7{rG|i3!Ri%0cEI)uTPX2#72tnk^4Ov5E{D_G7ecK;e!m=I@c|$4h$3%R T-6?Z*00000NkvXXu0mjfTgj+K literal 0 HcmV?d00001 diff --git a/packages/apps/meta-code-verify/images/icon-badge.svg b/packages/apps/meta-code-verify/images/icon-badge.svg new file mode 100644 index 0000000000..aebf597b22 --- /dev/null +++ b/packages/apps/meta-code-verify/images/icon-badge.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/loading-header.svg b/packages/apps/meta-code-verify/images/loading-header.svg new file mode 100644 index 0000000000..154f304cef --- /dev/null +++ b/packages/apps/meta-code-verify/images/loading-header.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/menu-badge.svg b/packages/apps/meta-code-verify/images/menu-badge.svg new file mode 100644 index 0000000000..c27721774c --- /dev/null +++ b/packages/apps/meta-code-verify/images/menu-badge.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/risk_32.png b/packages/apps/meta-code-verify/images/risk_32.png new file mode 100755 index 0000000000000000000000000000000000000000..4f56b29ae2b80defe1544fd8cbf1dec3e241c7fe GIT binary patch literal 1274 zcmV%;%Xf!b~;tvxw!Agv;#2AS2 zr;mb(Z&81k_yW{uVvK?a#y7W0)LM}iTA@-}?-{1U^fkRB)n9(e&D^;&bIy0qIrpA( z2jC0jp#p^n1Oj?`DWk23wnD$JkMs4~aSSwCqf@O(C$!r_TN7=kRVtMe6o8o!CBo55 z#enmf+0}kZ?|$3>@1EU&!FOFD?!hYTYJ@?K)!0!VVsMH$JO_~eFKej+>c7C-$%=yuT&?*7{K;!F%?VO`=8#9q; z#Bz$)gP~*{QK^%Q<*cQWAyYWm_qN_vSI&7lu0SGyZZs`CO4O;kd6ZNOuo6Pc_`N-i zkN3>rsH-56NEetAxLnIkJx`|llC!7qT|79!K4wmzwAjD?~G*P~>V9c<% z2?JJNxB$|}7SO3BLH~6paciARK!`8T~DewQoG07k@ z#+QO=(Q!Eu5b${cbx~AE$3;TuPhamVv$N%ptRQrgcEay`-~ZkX&ySd)ty0T3?BiIF z6mE=iKwUn!!z_&@sfEg1Z71VeC+p|MV!!jm3SKDA78~|Ek1ZR1_m?HIvQSq~dwnn! zMG%^a!4?nw_ICd2A=jX%tv=$pG@w&+et>xBeRv)(MZtUNDl6!Fc_*#_`vnW%VnOL{ zF6b-_-b*dS4RqUJq>#o9%RVOPe{e${bg|pP-It zXEb%RkI;;GRN zcTe(_o|jgSn7@Ll0<$*mMVJmS>FOrWajH|aR{E$qVLuz95DV78Gik#_#KCZtfU_qs kl$$Qoc1r2*m@kNj503NSSVeHw9smFU07*qoM6N<$f~d4o)&Kwi literal 0 HcmV?d00001 diff --git a/packages/apps/meta-code-verify/images/temporary-extension-icon.svg b/packages/apps/meta-code-verify/images/temporary-extension-icon.svg new file mode 100644 index 0000000000..b2963c0999 --- /dev/null +++ b/packages/apps/meta-code-verify/images/temporary-extension-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/apps/meta-code-verify/images/temporary-extension-icon128.png b/packages/apps/meta-code-verify/images/temporary-extension-icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..2c33b949b6f1d5de064ee3ea4b88ff4013829f7e GIT binary patch literal 2176 zcmV-`2!Hp9P)@~0drDELIAGL9O(c600d`2O+f$vv5yP+#)MW4j%xUutk9x^A@^AS^S!AdY~&nphyy= zb#@eM7g%KS-0WNu6b{kiItIE9V+2LW89ZX#t;V{mm%sw1EihEqZK362Ep%lF?51_& zIxvYT1%`_3_iPio2Y$&VEizN2V^$zjo=fg^I$0YEv#x1Uiu>>LX5wR3Anx!lESRIm$y) zL;ZYRbc-++T|zd41IJDK%>liBvu+WdG&lQZvbDO)vge~*xhxyy{)0zQ9z1dk5&^n4 zt*sNn!v*b%Fl}{{c08{$LDxnU*S0_2hGcY@`}TPXWy#^MPzr+jo&Wpa1C&_{mO}z* zl3Jx%3{1`r{a9E?m^?@A7U$Id;@=l&e=PMY;UFk5C%5c!Q*hy~Qjl zi`A!$Q}ON2C_!ZwlWHAEge<#S-;`dxQ10Ba0VTJ*SQ-Dk8YS)X7z$zj!Tk^ zGH;);SrtZGUryfM0+f4psAHg_=+Zm~f38nH-2-;P>OocqdceUPG7J-G&F8jbf=u@O zc_?3fd6w?^&-N9dth!PIMu^n{`Tynj*|g>@&3XP@H8<)}9yxX#tU`z~UZ8dFP;fAX zq7b)88{bqbbF?Om8;f%NsvO<(Kb$y?(&#rnc+dcpX+xjW9B*k+ThDU;l@8y}?=yB} z8p`kz!Jo6Xz5%7t5}^m1&&}#UH#nF^1dDNxP4B<0{v%Nv9jLxui*noN`ym!)PMxHC zyxe~oWpi^27=hn+xLdVk-Wv1g8`eT3-MxxH5M205UUF z%S%b=r8!;~P)A)FZ{GnU*xe)Q5QSQxqCf*Un1XiYs09M}>9*zJe5*Zx7pLj_e@0th zyL&`NU@Jzc1!56)Fo#c+W!WbR_PK-6dI0NIsm2~26PYnZ-~T&n&;r-3&e7b5W41?R z1h!ULVAB+sD+3NO!6q9q-KnN02a7=xo}3NsiSFw2K3h)zyJ3? zC@)oC2SX^@n9g5!?`fXHzE}t+=wq+k5A=aUOb~(KVs5lRtOtqM1UAk{<#E`h@2p1| zJ~M$6sqQ;hu3i@m2Ehm$ygN}QWM%?IYL-fwL<_`v(6K_pu#^IPird5Hm->VGRM;M1 z=N3@(<0;+qR{cK?xA;i+u@hc=84vry6{iY)tZM=e9l~1QiW7y!d_UX)WL6k;afzLb zOml1Yd7XEz!VgIaA>OvTn$Z~Q818ngFfusNTxcn6drafD-wIrNFeEMgaatjIAVIWB z5>)WsA@$6;OW6322OOCB6;bP3q<1RfkiO)S-gFuiHEWzC zN)fYqL|pEAtM*#cvuWwggup!L$q2%#suM>`Bc1MWy>MfF_4&cW#`YtGOoJW>?Xu-p zo-Ewn(KS({a&(}<3+k|cPs3k%@@UkgLQxgSI?XI8O;2)d*k@&**~qm{+LJKilJE6Xb5-P4*=siQujL8) z*l$*ZJm_K>J}@sez*gEt+YJ`5oWZiOzQ#Xr)TnPsP;hsdES3uRWKnvB4oz8}=iwxw zwTP_>j_kbTc0#jd3O+3gqCA5wO+qY=Jisvh1?V(2o%mLy$HOayR@jf=Gnc+p^`h9zv9% z?B_7p(lcBD8Ri!8!3_3O80;?yf}h4f8xpOsaQ+7+Hf4cM{b>aN0000dZUU0DhKK@MsqA~;dnrf5hvt#a8?C@G3?A`(Kvv9^KZ*09_J)wCF) zq^PNJks4v?W)#cPYQmhK+dX&cG4p10(7x5X-#O>I_nv#sd4vpbI9+y&&32YZIwi1pB5RssTL##zR%@pqDNdO!wKbKv z@4cf$TJ(BHUM>#QRN(o`H=1J``=mj@Db#C~C3AZUcj4yM^9U_0!Z$XqxyFWCSS=Pj zQ-aK~jeXcR8B$WMPziJ-lQ%ARAtz@Wy4`*F8UCfY=0o*ZUipr9?>}gcZS2FoDS1?> z6UYJ~1ey*yF#hT-;&F+r{*qM1C*ex32dk^U(dX_)Uha0(RFuP>zf)hA!5rJzhkZ>5 z3dChFnfbi*6&J7HLTPakT3edXe7FwLSPU;-PiQ-HY-1nxHQjlR8jf{zsgHj1R$LlO z-&Wwg-HRXLFwR|YYo5!dupl1`i(kwkkR&=qG#d4)mRmL(IUo{=Xn}`5qg6GRQA`aB z9u#`o)E{kkk)Q|o5Af+&Q1|lur>W_Zy;TK7)QGJ>;#$CWZ-76IX`@6RmF}xnGXhR* z0upi{@N~qOQYrH=^l{Q(yuWfzRg;6~-G)M(cOlONd?P8fL+b_b&=83}FZ zT&V`IE98tU{3F~zz~MLft6eS4ZdpAk2PYld!)w_E15lwh$U17$6IfGHUda@tnSV(U z41)2HV5+Hf>544R$l#BCh}FTo2g+*sWiRi}g)kWY!4?LUJDF+ub+ErRid-b3OXJMP zU|_51;PQEW#V$v)XLf<2CC#0)WB!~YY?BQVK|~i%c55l-AFEb(&u}oeWLpIf;2PXK z3YMm2j&UbXg$;)_F26b1kMdkuw;Y)35cR!pK+6fH=t2ZLC*CPz3&{4(T5 zteDMav1$b^F{MyeF)1+tr4MbwU3cE0S-xRyZutJ>553|_vZO=0(lAtt3++nygIz|4 zDmwDvLIcuLAE5ZDJr)sBf0zK z=a9K_g}C?m{HQ&6I6_9Ndx_cu4MK+?8)Qog1w{(~Hmjao`IgOi_`%}v^9KhT;5<73 zSqDj$bV86VvZ;rvvTW*NYc!#ptPH%eqaytLb*mjmziNq)Tavs8smtyb_Y)Idbi2;Z zC?_4#4M8@^b~O0BY*C=IGk)WxXZes1u895T&ZB1kCz^5_)~*iUce~DDe0(B8hIGjW zK{m;@4i*IlF|&J5!zdI!ls(Y|-u>{9Zh$XbumE}4S>fl-E^P;A4>Yo^gGW&n7S%zS z0MD~!AwE7hbqu;MV&u~02s^R^Z5D2Y9~WJEQhEV?U%^!TX?3scK#PFk0!=d=kYILz zSM7K@T(&-cD*ie(9ISewLTaEz5P*vYiEaxL6J9S~uYO-FSJO#LU54aE!FBoSUw@;o z|6HUpKgkoMOE$=sBo46#@%4BVk_T~G@C(=Hdf%2Xo``n_#OQ$o{BJtUzDn!jleFZg=#N02P($T}A!;GqA)L7&f8 zhZspqwFb=v0{Fg1Dq5tV%mZCTDrQ%j3mZb0p^I;=fl03D{F+diGkGOt^PT!2oIP!gxwBtt?q>LrZ!07xa6?dG z=XGw>DvFxGTz&tebxdKExN-0`My>B{YpS}QK-B!;$nZeR;^nI@@P@WgJ`cuvHp*?j z)!W`w9ZgO*!#XlF;7U$UKh6S-29FK@AJJ-lpMTrwZ@+Zt3C}HwP6;N;LhytB9P&8o zq*oqZ*?wBJv=WtuI5-_~;17;;I<{K57uIP%L-5T9^DtF)@t-O>__Z(ApCSGO+Q9*@ Tvd*HD00000NkvXXu0mjf#jBw! literal 0 HcmV?d00001 diff --git a/packages/apps/meta-code-verify/images/validated-badge.svg b/packages/apps/meta-code-verify/images/validated-badge.svg new file mode 100644 index 0000000000..eee2144c50 --- /dev/null +++ b/packages/apps/meta-code-verify/images/validated-badge.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/validated-header.svg b/packages/apps/meta-code-verify/images/validated-header.svg new file mode 100644 index 0000000000..c38774c3d3 --- /dev/null +++ b/packages/apps/meta-code-verify/images/validated-header.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/validated_32.png b/packages/apps/meta-code-verify/images/validated_32.png new file mode 100755 index 0000000000000000000000000000000000000000..a8204f5b38bf8a827ba66b09e42feca495486772 GIT binary patch literal 1180 zcmV;N1Y`S&P)+Zi@2J4nniWVa@k+8x!-9e2p?gFlF|kisxCb}J0c z=Au&8bV{SBcBC&#d7g96xjUVEI`?)u`K#ad?%ea9bKmE8f6wzi&+}e@E@;C9?LSx}-LF>f_3zmSCIrf&B(0io|%`gh-Xf=4R`W%yjlhR=V3n)QIhyu@v@& zhI3vX-NLlgGHH-8SJl_1N2Hu)Gr5mo1ZJZf(^hQbe0%sTMN&3!mk=pa{kz^8a$!G< zt^y+wHs!Dl)GZ}{5wD|fd!^sfdl@&uo${7rWzg96mwFx2OC}xaulNz4l z4n6+t9!s{A&sw>RTvb?AUNrjb4&4FlF1$Ux;KQa9wEKq1U8hti{%~e`r;{NxG&KU* zLd3}D9fZiAWi`Cz+WY5V1jY^wfJ@;UgdlDUWa~$5wM8CFa)rWEbF&RmXX=oV@M`@* zSQ8uyk5=z)^F6Y48?!#xOOX?ynN$usipVjOAY*MT^zQC0+*c?{ixQ6t-_s>jjZl!S zjDwDnNr~EmnYo*A|GcCCrd*8E{EleTEZuv`p0UMz1sFvpHSaY<-#Y6u1Vo#xbnj58 zw7QCc|4c>#y45+TsQ|iT*t#ZG2wDjXM+A3>jMBElW&YS);YCv=$uRAl`B#s(n$t^$ zz<$UEoAi(&nC*$vrbZ}Z5ypcSNRb6sj|r}kKpjEUjYQ#@9#E?b_WoOd zqqtJ~#x!0uWmgB2qVXY2ntd9=Nsxk4@l*2JI_-L^_5y%he9+lpqFp*@^MpK zE<~=mk@FJHWk1$UhOlz{G$M0Z-e)WKdSZN7q`*8+A|)x?Sf`#^Yz5vfx^|L%fLpmUKu4oH(c3xv7_2-NIi+Xug|O?(HgocfY!qnC zD-jzxvY~cHQ>_;yBOO&9uG+;dbdd_$11deVrg#kERBdZ5AReEsr(WD=6Ef0t=Nii9 zN9U}7%^~wRuq(s0^{%@|>3D2!x5is1invqpJaTLXxN_(D#WB7cqWb@ uus2symq5Rs1AA@C#Bry+f5&ve75)L6XU;I_9obg^0000 + + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/warning-header.svg b/packages/apps/meta-code-verify/images/warning-header.svg new file mode 100644 index 0000000000..2895a87c24 --- /dev/null +++ b/packages/apps/meta-code-verify/images/warning-header.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/images/x.svg b/packages/apps/meta-code-verify/images/x.svg new file mode 100644 index 0000000000..6b4d85043c --- /dev/null +++ b/packages/apps/meta-code-verify/images/x.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/packages/apps/meta-code-verify/package.json b/packages/apps/meta-code-verify/package.json new file mode 100644 index 0000000000..b3a43866d0 --- /dev/null +++ b/packages/apps/meta-code-verify/package.json @@ -0,0 +1,46 @@ +{ + "name": "@human-protocol/meta-code-verify", + "version": "0.1.0", + "description": "Browser extensions to verify code running in the browser against a published manifest", + "main": "none", + "repository": "https://github.com/humanprotocol/human-protocol", + "license": "MIT", + "type": "module", + "private": true, + "engines": { + "node": "^18.0.0" + }, + "scripts": { + "build-local-dev": "yarn makeBundle", + "watch": "yarn run rollup --config --watch", + "lint": "yarn makePrettier && yarn run eslint src/js/**", + "makeBundle": "yarn run rollup --config rollup.config.ts --configPlugin typescript", + "makePrettier": "yarn run prettier --write \"src/**/*.ts\" \"rollup_scripts/**/*.ts\"", + "test": "yarn lint && vitest -u" + }, + "devDependencies": { + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-eslint": "^9.0.3", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/plugin-typescript": "^11.0.0", + "@types/chrome": "^0.0.213", + "@types/jest": "^29.4.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", + "assert": "^2.0.0", + "eslint": "^7.32.0", + "jest": "^27.1.0", + "jest-environment-jsdom": "^27.5.1", + "prettier": "^2.3.2", + "rollup": "^2.56.3", + "sinon-chrome": "^3.0.1", + "ts-jest": "^27.1.0", + "tslib": "^2.5.0", + "typescript": "^4.9.5", + "vite": "^4.3.0", + "vite-plugin-chrome-extension": "^0.0.7", + "vitest": "^0.30.1" + } +} diff --git a/packages/apps/meta-code-verify/rollup.config.ts b/packages/apps/meta-code-verify/rollup.config.ts new file mode 100644 index 0000000000..b17ca148a5 --- /dev/null +++ b/packages/apps/meta-code-verify/rollup.config.ts @@ -0,0 +1,70 @@ +import cleanOnce from "./rollup_scripts/rollup-plugin-clean-once"; +import eslintPlugin from "@rollup/plugin-eslint"; +import typescript from "@rollup/plugin-typescript"; +import prettierBuildStart from "./rollup_scripts/rollup-plugin-prettier-build-start"; +import staticFiles from "./rollup_scripts/rollup-plugin-static-files"; +import watch from "./rollup_scripts/rollup-plugin-watch-additional"; + +function eslint() { + return eslintPlugin({ throwOnError: true }); +} + +function prettierSrc() { + return prettierBuildStart("'src/**/*.{js,ts}'"); +} + +export default [ + { + input: "src/js/detectKvstoreMeta.ts", + output: [{ + file: "dist/chrome/contentKvstore.js", + format: "iife", + }, { + file: "dist/edge/contentKvstore.js", + format: "iife" + }, { + file: "dist/firefox/contentKvstore.js", + format: "iife" + }], + plugins: [cleanOnce(), typescript(), prettierSrc(), eslint()] + }, + + { + input: "src/js/background.ts", + output: [{ + file: "dist/chrome/background.js", + format: "iife" + }, { + file: "dist/edge/background.js", + format: "iife" + }, { + file: "dist/firefox/background.js", + format: "iife" + }], + plugins: [typescript(), prettierSrc(), eslint()] + }, + { + input: "src/js/popup.ts", + output: [{ + file: "dist/chrome/popup.js", + format: "iife", + plugins: [staticFiles("config/v3/")] + }, { + file: "dist/edge/popup.js", + format: "iife", + plugins: [staticFiles("config/v3/")] + }, { + file: "dist/firefox/popup.js", + format: "iife", + plugins: [staticFiles("config/v2/")] + }], + plugins: [ + typescript(), + prettierSrc(), + eslint(), + staticFiles(["images/", "src/css/", "src/html/"]), + staticFiles("_locales/", { keepDir: true }), + watch(["images/", "src/css/", "src/html/", "_locales/", "config/"]) + ] + } +]; diff --git a/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-clean-once.ts b/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-clean-once.ts new file mode 100644 index 0000000000..19be97eaf1 --- /dev/null +++ b/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-clean-once.ts @@ -0,0 +1,45 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; +import * as process from 'process'; + +async function genHasAccess(path) { + try { + await fs.access(path, fs.constants.R_OK | fs.constants.W_OK); + return true; + } catch (_err) { + return false; + } +} + +const deletedDirs = new Set(); + +/** + * A simple plugin that deletes output directories *once* (so we don't delete + * them over and over again when running `watch`, and to not mess up subsquent + * rollup entries that use the same directory and the same plugin). + */ +export default function rollupPluginCleanOnce() { + return { + name: 'rollup-plugin-clean', + + async generateBundle(options, _bundle, isWrite) { + // No point in cleaning if rollup isn't going to write the output + if (!isWrite) { + return; + } + const rootDir = process.cwd(); + const dirToDelete = options.dir + ? path.resolve(rootDir, options.dir) + : path.dirname(path.resolve(rootDir, options.file)); + // Only delete once. + if (deletedDirs.has(dirToDelete)) { + return; + } + deletedDirs.add(dirToDelete); + if (await genHasAccess(dirToDelete)) { + console.log('Deleting:', dirToDelete); + await fs.rm(dirToDelete, { recursive: true }); + } + }, + }; +} diff --git a/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-prettier-build-start.ts b/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-prettier-build-start.ts new file mode 100644 index 0000000000..5477028556 --- /dev/null +++ b/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-prettier-build-start.ts @@ -0,0 +1,49 @@ +import { exec } from 'child_process'; +class ExecError extends Error { + public stdout: string; + public stderr: string; + + constructor(message: string, stdout: string, stderr: string) { + super(message); + this.stdout = stdout; + this.stderr = stderr; + } +} +function genExec(command) { + return new Promise((resolve, reject) => { + exec(command, (error, stdout, stderr) => { + const customError = new ExecError(error?.message, stdout, stderr); + if (error) { + customError.stdout = stdout; + customError.stderr = stderr; + reject(error); + } else { + resolve({ stdout, stderr }); + } + }); + }); +} + +const filesToFormat = new Set(); + +export default function rollupPrettierBuildStartPlugin(files) { + filesToFormat.add(files); + return { + name: 'rollup-plugin-prettier-src-formatter', + + async buildStart(_options) { + if (filesToFormat.size === 0) { + return; + } + console.log('Running prettier for', Array.from(filesToFormat).join(' ')); + await genExec( + `yarn run prettier ${Array.from(filesToFormat).join(' ')} --write` + ); + filesToFormat.clear(); + }, + + watchChange(_id, _change) { + filesToFormat.add(files); + }, + }; +} diff --git a/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-static-files.ts b/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-static-files.ts new file mode 100644 index 0000000000..041f0a1f58 --- /dev/null +++ b/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-static-files.ts @@ -0,0 +1,52 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; +import * as process from 'process'; + +import { readDirRecursive } from './utils'; + +const DEFAULT_OPTIONS = { + keepDir: false, +}; + +/** + * A simple plugin that copies files from a source directory to output.dir + * + * @param {Array} dirs Directories to recursively copy files from + * @param {Object} options Plugin options + * @param {boolean} option.keepDir Include directory in output directory + * (e.g. if true, and your directory is `locales/`, output directory will + * have: `dist/locales/`, vs. just + * `dist/`) + * @returns Rollup.PluginImpl + */ +export default function rollupPluginStaticFiles( + dirs: Array | string = [], + options?: { keepDir?: boolean } +) { + const { keepDir }: { keepDir?: boolean } = { ...DEFAULT_OPTIONS, ...options }; + if (!Array.isArray(dirs)) { + dirs = [dirs]; + } + return { + name: 'rollup-plugin-static-files', + + async generateBundle(_options, _bundle, _isWrite) { + const rootDir = process.cwd(); + await Promise.all( + (dirs as Array).map(async dir => { + const dirPath = path.resolve(rootDir, dir); + const filePaths = await readDirRecursive(path.resolve(rootDir, dir)); + return await Promise.all( + filePaths.map(async filePath => { + this.emitFile({ + type: 'asset', + fileName: path.relative(keepDir ? rootDir : dirPath, filePath), + source: await fs.readFile(filePath), + }); + }) + ); + }) + ); + }, + }; +} diff --git a/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-watch-additional.ts b/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-watch-additional.ts new file mode 100644 index 0000000000..762945f7ec --- /dev/null +++ b/packages/apps/meta-code-verify/rollup_scripts/rollup-plugin-watch-additional.ts @@ -0,0 +1,24 @@ +import * as path from 'path'; +import * as process from 'process'; + +import { readDirRecursive } from './utils'; + +export default function rollupPluginWatch(dirs) { + return { + name: 'rollup-plugin-watch-additional', + + async buildStart(_options) { + const rootDir = process.cwd(); + await Promise.all( + dirs.map(async dir => { + const watchFilePaths = await readDirRecursive( + path.resolve(rootDir, dir) + ); + for (const filePath of watchFilePaths) { + this.addWatchFile(filePath); + } + }) + ); + }, + }; +} diff --git a/packages/apps/meta-code-verify/rollup_scripts/utils.ts b/packages/apps/meta-code-verify/rollup_scripts/utils.ts new file mode 100644 index 0000000000..7fa9ababe6 --- /dev/null +++ b/packages/apps/meta-code-verify/rollup_scripts/utils.ts @@ -0,0 +1,27 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; + +/** + * Recursively get all files inside a directory + * + * @param {string} dirPath path to directory + * @returns {Array} + */ +export async function readDirRecursive(dirPath) { + const fileNames = await fs.readdir(dirPath); + const files = []; + await Promise.all( + fileNames.map(async fileName => { + const stats = await fs.stat(path.resolve(dirPath, fileName)); + if (stats.isDirectory()) { + files.push( + ...(await readDirRecursive(path.resolve(dirPath, fileName))) + ); + } else { + files.push(path.resolve(dirPath, fileName)); + return Promise.resolve(); + } + }) + ); + return files; +} diff --git a/packages/apps/meta-code-verify/src/css/popup.css b/packages/apps/meta-code-verify/src/css/popup.css new file mode 100644 index 0000000000..cbba8cba4e --- /dev/null +++ b/packages/apps/meta-code-verify/src/css/popup.css @@ -0,0 +1,280 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.action_bar { + flex-direction: row; + justify-content: space-between; + margin: 24px 13px 0 13px; +} + +.badge { + height: 20px; +} + +.content_body { + align-items: center; + display: flex; + justify-content: center; + flex-direction: column; +} + +.anomaly_learn_more_button, .report_issue_button { + border: 1px solid #CBD2D9; + box-sizing: border-box; + border-radius: 4px; + height: 36px; + width: 230px; + background: #1C2B33; + font-family: SF Pro Text; + font-style: normal; + font-weight: 500; + font-size: 15px; + line-height: 20px; + text-align: center; + letter-spacing: -0.23px; + color: #FFFFFF; +} + +.download_button, +.risk_learn_more_button, +.timeout_learn_more_button { + border: 1px solid #CBD2D9; + box-sizing: border-box; + border-radius: 4px; + height: 36px; + width: 111px; + background: #FFFFFF; + font-family: SF Pro Text; + font-style: normal; + font-weight: 500; + font-size: 15px; + line-height: 20px; + text-align: center; + letter-spacing: -0.23px; + color: #1C2B33; +} + +.download_header { + display: flex; +} + +.download_title { + font-family: Optimistic Display; + font-style: normal; + font-weight: bold; + font-size: 17px; + line-height: 22px; + letter-spacing: 0.24px; + color: #000000; + height: 22px; + width: 84px; + margin: 0px 0px 0px 12px; + padding-bottom: 21px; +} + +.error_body { + width: 262px; + height: 288px; + background: #FFFFFF; + margin: 0; +} + +header { + display: flex; + justify-content: space-between; + padding: 16px 16px 0 16px; +} + +.menu { + cursor: pointer; + height: 20px; +} + +.menu_body { + height: 227px; + width: 256px; + margin: 0px; +} + +.menu_right_sidebar { + display: flex; + flex-direction: column; + background: #F1F4F7; + box-shadow: 0px 0px 16px rgba(52, 72, 84, 0.05); + height: 227px; + width: 209px; +} + +.menu_row { + display: flex; + flex-direction: row; + align-items: center; + padding: 8px 16px; +} + +.menu_row > p { + font-family: SF Pro Text; + font-style: normal; + font-weight: 500; + font-size: 15px; + line-height: 20px; + letter-spacing: -0.23px; + color: #1C2B33; + flex: none; + order: 1; + flex-grow: 1; + margin: 0px 12px; + width: 113px; +} + +.menu_title { + display: flex; + flex-direction: row; + justify-content: space-between; + font-family: Optimistic Display; + font-style: normal; + font-weight: bold; + font-size: 17px; + line-height: 22px; + letter-spacing: 0.24px; + color: #000000; + flex: none; + order: 0; + flex-grow: 0; + margin: 0px 16px; +} + +.menu_title > p { + width: 138px; +} + +.menu_title > button { + border: none; + cursor: pointer; + width: 24px; + height: 24px; + margin: 16px 0 0; +} + +.menu_top_level { + display: flex; + flex-direction: row; +} + +.menu_top_level > .badge { + margin: 13px 12px 0 15px; +} + +.loading_body { + width: 257px; + height: 154px; + background: #FFFFFF; + margin: 0; +} + +.loading_body_image { + height: 32px; + margin-top: 24px; + width: 158px; +} + +.retry_button { + border: 1px solid #CBD2D9; + box-sizing: border-box; + border-radius: 4px; + height: 36px; + width: 111px; + background: #1C2B33; + font-family: SF Pro Text; + font-style: normal; + font-weight: 500; + font-size: 15px; + line-height: 20px; + text-align: center; + letter-spacing: -0.23px; + color: #FFFFFF; +} + +.row_image { + flex: none; + order: 0; + flex-grow: 0; +} + +.row_nav { + flex: none; + order: 2; + flex-grow: 0; + margin: 0px 12px; +} + +.state_boundary { + flex-direction: column; +} + +.status_header { + font-family: SF Pro Text; + font-style: normal; + font-weight: 600; + font-size: 13px; + line-height: 18px; + + text-align: center; + letter-spacing: -0.08px; + + color: #1C2B33; + margin-top: 12px; +} + +.status_message { + font-family: SF Pro Text; + font-style: normal; + font-weight: normal; + font-size: 13px; + line-height: 18px; + text-align: center; + letter-spacing: -0.08px; + color: #63788A; + margin: 0 36px; +} + +.status_message_highlight { + color: #1C2B33; +} + +.valid_body { + width: 262px; + height: 164px; + background: #FFFFFF; + margin: 0; +} + +.validated_body_image { + height: 32px; + margin-top: 24px; + width: 158px; +} + +.warning_risk_body { + width: 262px; + height: 270px; + background: #FFFFFF; + margin: 0; +} + +.warning_timeout_body { + width: 262px; + height: 216px; + background: #FFFFFF; + margin: 0; +} + +.warning_body_image { + height: 32px; + margin-top: 24px; + width: 158px; +} diff --git a/packages/apps/meta-code-verify/src/html/popup.html b/packages/apps/meta-code-verify/src/html/popup.html new file mode 100644 index 0000000000..75bc63e1ee --- /dev/null +++ b/packages/apps/meta-code-verify/src/html/popup.html @@ -0,0 +1,147 @@ + + + + + + +
+
+ + +
+
+ +
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+ + +
+
+ +
+
+
+ + +
+
+
+
+
+ + +
+
+ +
+
+
+ + +
+
+
+
+
+ + +
+
+ +
+
+ + + +
+
+ +
+
+
+ +
+
+ + +
+
+
Allowlist
+
+
Disallow
+
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
+
+ + +

+
+ +
+
+
+
+ +
+
+
+ + + diff --git a/packages/apps/meta-code-verify/src/js/__tests__/background.test.ts b/packages/apps/meta-code-verify/src/js/__tests__/background.test.ts new file mode 100644 index 0000000000..372be7a101 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/__tests__/background.test.ts @@ -0,0 +1,299 @@ +import { MESSAGE_TYPE, ORIGIN_TYPE } from '../config'; +import { handleMessages } from '../background'; +import { vi, Mock } from 'vitest'; + +describe('background', () => { + describe('LOAD_MANIFEST', () => { + it('should load manifest when origin is missing', async () => { + window.fetch = vi.fn(); + (window.fetch as Mock).mockReturnValueOnce( + Promise.resolve({ + clone: () => { + return { + json: () => { + return { + 1: { '/somepath': 'somehash' }, + root_hash: '0x7', + }; + }, + }; + }, + json: () => + Promise.resolve({ + 1: { '/somepath': 'somehash' }, + root_hash: '0x7', + }), + }) + ); + (window.Uint8Array as unknown) = function () { + return { + reduce: () => '7', + }; + }; + const mockSendResponse = vi.fn(); + const handleMessagesReturnValue = handleMessages( + { + origin: ORIGIN_TYPE.WHATSAPP, + type: MESSAGE_TYPE.LOAD_MANIFEST, + version: '1', + rootHash: '0x7', + leaves: ['0x7'], + }, + { tab: { id: '' } }, + mockSendResponse + ); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect((window.fetch as Mock).mock.calls.length).toBe(1); + expect(handleMessagesReturnValue).toBe(true); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(true); + }); + it('should load manifest when manifest is missing', async () => { + (window.fetch as Mock) = vi.fn(); + (window.fetch as Mock).mockReturnValueOnce( + Promise.resolve({ + clone: () => { + return { + json: () => { + return { + 1: { '/somepath': 'somehash' }, + root_hash: '0x7', + }; + }, + }; + }, + json: () => + Promise.resolve({ + 1: { '/somepath': 'somehash' }, + root_hash: '0x7', + }), + }) + ); + const mockSendResponse = vi.fn(); + const handleMessagesReturnValue = handleMessages( + { + origin: ORIGIN_TYPE.WHATSAPP, + type: MESSAGE_TYPE.LOAD_MANIFEST, + version: '2', + rootHash: '0x7', + leaves: ['0xsomeotherhash'], + }, + { tab: { id: null } }, + mockSendResponse + ); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect((window.fetch as Mock).mock.calls.length).toBe(1); + expect(handleMessagesReturnValue).toBe(true); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(true); + }); + it('return valid when manifest and origin are found in cache', async () => { + const encodeMock: Mock = vi.fn(); + (window.TextEncoder as unknown) = function () { + return { + encode: encodeMock, + }; + }; + (window.Uint8Array as unknown) = function () { + return { + reduce: () => '7', + }; + }; + (window.fetch as Mock) = vi.fn(); + (window.fetch as Mock).mockReturnValueOnce( + Promise.resolve({ + clone: () => { + return { + json: () => { + return { + 1: { '/somepath': 'somehash' }, + root_hash: '0x7', + }; + }, + }; + }, + json: () => + Promise.resolve({ + 1: { '/somepath': 'somehash' }, + root_hash: '0x7', + }), + }) + ); + const mockSendResponse = vi.fn(); + const handleMessagesReturnValue = handleMessages( + { + origin: ORIGIN_TYPE.WHATSAPP, + type: MESSAGE_TYPE.LOAD_MANIFEST, + version: '1', + rootHash: '0x7', + leaves: ['0xsomeotherhash'], + }, + { tab: { id: null } }, + mockSendResponse + ); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect((fetch as Mock).mock.calls.length).toBe(1); + expect(handleMessagesReturnValue).toBe(true); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(true); + }); + }); + + describe('RAW_JS', () => { + it('should return false when no matching origin', () => { + const mockSendResponse = vi.fn(); + handleMessages( + { + origin: 'NOT_AN_ORIGIN', + type: MESSAGE_TYPE.RAW_JS, + version: '1', + leaves: ['someotherhash'], + }, + { tab: { id: '' } }, + mockSendResponse + ); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(false); + expect(mockSendResponse.mock.calls[0][0].reason).toBe( + 'no matching origin' + ); + }); + it('should return false when no matching manifest', () => { + const mockSendResponse = vi.fn(); + handleMessages( + { + origin: ORIGIN_TYPE.WHATSAPP, + type: MESSAGE_TYPE.RAW_JS, + version: 'NOT_A_VALID_VERSION', + leaves: ['someotherhash'], + }, + { tab: { id: '' } }, + mockSendResponse + ); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(false); + expect(mockSendResponse.mock.calls[0][0].reason).toBe( + 'no matching manifest' + ); + }); + it('should return false when no matching hash', async () => { + const mockSendResponse = vi.fn(); + const encodeMock: Mock = vi.fn(); + (window.TextEncoder as unknown) = function () { + return { + encode: encodeMock, + }; + }; + encodeMock.mockReturnValueOnce('abc'); + window.crypto.subtle.digest = vi + .fn() + .mockReturnValueOnce(Promise.resolve('def')); + (window.Uint8Array as unknown as Mock) = vi + .fn() + .mockReturnValueOnce(['somefakehash']); + handleMessages( + { + origin: ORIGIN_TYPE.WHATSAPP, + type: MESSAGE_TYPE.RAW_JS, + src: 'https://www.notavalidurl.com/nottherightpath', + version: '1', + rawjs: '', + }, + { tab: { id: null } }, + mockSendResponse + ); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(false); + }); + it('should return false if the hashes do not match', async () => { + const encodeMock: Mock = vi.fn(); + (window.TextEncoder as unknown) = function () { + return { + encode: encodeMock, + }; + }; + encodeMock.mockReturnValueOnce('abc'); + window.crypto.subtle.digest = vi + .fn() + .mockReturnValueOnce(Promise.resolve('def')); + (window.Uint8Array as unknown as Mock) = vi + .fn() + .mockReturnValueOnce(['somefakehash']); + const mockSendResponse = vi.fn(); + handleMessages( + { + origin: ORIGIN_TYPE.WHATSAPP, + type: MESSAGE_TYPE.RAW_JS, + rawjs: 'console.log("all the JavaScript goes here");', + version: '2', + }, + { tab: { id: null } }, + mockSendResponse + ); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(false); + }); + it('should return false if the hashes do not match', async () => { + const encodeMock: Mock = vi.fn(); + (window.TextEncoder as unknown) = function () { + return { + encode: encodeMock, + }; + }; + encodeMock.mockReturnValueOnce('abc'); + window.crypto.subtle.digest = vi + .fn() + .mockReturnValueOnce(Promise.resolve('def')); + (window.Uint8Array as unknown as Mock) = vi + .fn() + .mockReturnValueOnce(['somefakehash']); + const mockSendResponse = vi.fn(); + handleMessages( + { + origin: ORIGIN_TYPE.WHATSAPP, + type: MESSAGE_TYPE.RAW_JS, + rawjs: 'console.log("all the JavaScript goes here");', + version: '2', + leaves: ['someotherhash'], + }, + { tab: { id: '' } }, + mockSendResponse + ); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(false); + }); + it('should return true if the hashes match', async () => { + const encodeMock: Mock = vi.fn(); + (window.TextEncoder as unknown) = function () { + return { + encode: encodeMock, + }; + }; + encodeMock.mockReturnValueOnce('abc'); + window.crypto.subtle.digest = vi + .fn() + .mockReturnValueOnce(Promise.resolve('def')); + (window.Uint8Array as unknown as Mock) = vi + .fn() + .mockReturnValueOnce(['someotherhash']); + const mockSendResponse = vi.fn(); + handleMessages( + { + origin: ORIGIN_TYPE.WHATSAPP, + lookupKey: '/someotherpath', + type: MESSAGE_TYPE.RAW_JS, + rawjs: 'console.log("all the JavaScript goes here");', + version: '2', + }, + { tab: { id: '' } }, + mockSendResponse + ); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect(mockSendResponse.mock.calls.length).toBe(1); + expect(mockSendResponse.mock.calls[0][0].valid).toBe(true); + }); + }); +}); diff --git a/packages/apps/meta-code-verify/src/js/__tests__/contentUtils.test.ts b/packages/apps/meta-code-verify/src/js/__tests__/contentUtils.test.ts new file mode 100644 index 0000000000..160c001763 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/__tests__/contentUtils.test.ts @@ -0,0 +1,412 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +import { describe, vi, Mock } from 'vitest'; +import { MESSAGE_TYPE, ORIGIN_TYPE, STATES } from '../config'; +import { + hasInvalidAttributes, + hasInvalidScripts, + processFoundJS, + scanForScripts, + storeFoundJS, +} from '../contentUtils'; + +describe('contentUtils', () => { + beforeEach(() => { + (window.chrome.runtime.sendMessage as unknown as Mock) = vi.fn(() => {}); + }); + describe('storeFoundJS', () => { + it('should handle scripts with src correctly', () => { + const scriptMap = new Map([['version', []]]); + const fakeUrl = 'https://fancytestingyouhere.com/'; + const fakeScriptNode = { + src: fakeUrl, + getAttribute: () => {}, + }; + storeFoundJS(fakeScriptNode, scriptMap); + expect(scriptMap.get('version').length).toEqual(1); + expect(scriptMap.get('version')[0].src).toEqual(fakeUrl); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(1); + }); + it('should handle inline scripts correctly', () => { + const scriptMap = new Map([['version', []]]); + const fakeInnerHtml = 'console.log'; + const fakeLookupKey = 'somelonghashkey'; + const fakeScriptNode = { + attributes: { + 'data-binary-transparency-hash-key': { value: fakeLookupKey }, + }, + getAttribute: () => {}, + innerHTML: fakeInnerHtml, + }; + storeFoundJS(fakeScriptNode, scriptMap); + expect(scriptMap.get('version').length).toEqual(1); + expect(scriptMap.get('version')[0].rawjs).toEqual(fakeInnerHtml); + expect(scriptMap.get('version')[0].lookupKey).toEqual(fakeLookupKey); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(1); + }); + it('should send update icon message if valid', () => { + const scriptMap = new Map([['version', []]]); + const fakeUrl = 'https://fancytestingyouhere.com/'; + const fakeScriptNode = { + src: fakeUrl, + getAttribute: () => {}, + }; + storeFoundJS(fakeScriptNode, scriptMap); + const sentMessage = (window.chrome.runtime.sendMessage as unknown as Mock) + .mock.calls[0][0]; + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(1); + expect(sentMessage.type).toEqual(MESSAGE_TYPE.UPDATE_STATE); + }); + it.skip('storeFoundJS keeps existing icon if not valid', () => { + // TODO: come back to this after testing processFoundJS + }); + }); + describe('hasInvalidAttributes', () => { + it('should not execute if element has no attributes', () => { + // no hasAttribute function + let fakeElement = { + childNodes: [], + }; + hasInvalidAttributes(fakeElement); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(0); + + // hasAttribute is a function, but has no attributes + fakeElement = { + hasAttribute: () => { + return false; + }, + childNodes: [], + } as { + hasAttribute: () => boolean; + childNodes: []; + }; + hasInvalidAttributes(fakeElement); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(0); + }); + it('should not update the icon if no violating attributes are found', () => { + const fakeElement = { + attributes: [ + { localName: 'background' }, + { localName: 'height' }, + { localName: 'width' }, + ], + hasAttribute: () => { + return true; + }, + childNodes: [], + }; + hasInvalidAttributes(fakeElement); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(0); + }); + it('should update the icon if violating attributes are found', () => { + const fakeElement = { + attributes: [ + { localName: 'onclick' }, + { localName: 'height' }, + { localName: 'width' }, + ], + hasAttributes: () => { + return true; + }, + childNodes: [], + }; + hasInvalidAttributes(fakeElement); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(2); + }); + }); + describe('hasInvalidScripts', () => { + it('should not check for non-HTMLElements', () => { + const fakeElement = { + attributes: [ + { localName: 'onclick' }, + { localName: 'height' }, + { localName: 'width' }, + ], + hasAttribute: () => { + return true; + }, + nodeType: 2, + }; + hasInvalidScripts(fakeElement, []); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(0); + }); + it('should store any script elements we find', () => { + const fakeElement = { + attributes: { 'data-binary-transparency-hash-key': { value: 'green' } }, + getAttribute: () => {}, + hasAttribute: () => { + return false; + }, + childNodes: [], + nodeName: 'SCRIPT', + nodeType: 1, + }; + const scriptMap = new Map([['version', []]]); + hasInvalidScripts(fakeElement, scriptMap); + expect(scriptMap.get('version').length).toBe(1); + expect(scriptMap.get('version')[0].type).toBe(MESSAGE_TYPE.RAW_JS); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(1); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls[0][0] + .type + ).toBe(MESSAGE_TYPE.UPDATE_STATE); + }); + it('should check all child nodes for non script elements', () => { + const fakeElement = { + childNodes: [ + { + attributes: [ + { localName: 'onclick' }, + { localName: 'height' }, + { localName: 'width' }, + ], + hasAttribute: () => { + return true; + }, + nodeType: 2, + nodeName: 'nodename', + }, + { + attributes: [ + { localName: 'onclick' }, + { localName: 'height' }, + { localName: 'width' }, + ], + hasAttribute: () => { + return true; + }, + nodeType: 3, + nodeName: 'nodename', + }, + ], + hasAttribute: () => { + return false; + }, + nodeType: 1, + nodeName: 'nodename', + tagName: 'tagName', + }; + const foundScripts = []; + hasInvalidScripts(fakeElement, foundScripts); + expect(foundScripts.length).toBe(0); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(0); + }); + it('should store any script element direct children', () => { + const fakeElement = { + childNodes: [ + { + attributes: [ + { localName: 'onclick' }, + { localName: 'height' }, + { localName: 'width' }, + ], + hasAttribute: () => { + return true; + }, + nodeType: 2, + nodeName: 'nodename', + childNodes: [], + }, + { + attributes: { + 'data-binary-transparency-hash-key': { value: 'green' }, + }, + getAttribute: () => {}, + hasAttribute: () => { + return false; + }, + nodeName: 'SCRIPT', + nodeType: 1, + childNodes: [], + }, + ], + hasAttribute: () => { + return false; + }, + nodeType: 1, + nodeName: 'nodename', + tagName: 'tagName', + }; + const scriptMap = new Map([['version', []]]); + hasInvalidScripts(fakeElement, scriptMap); + expect(scriptMap.get('version').length).toBe(1); + expect(scriptMap.get('version')[0].type).toBe(MESSAGE_TYPE.RAW_JS); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(1); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls[0][0] + .type + ).toBe(MESSAGE_TYPE.UPDATE_STATE); + }); + it('should check for any grandchildren script elements', () => { + const fakeElement = { + childNodes: [ + { + attributes: [ + { localName: 'onclick' }, + { localName: 'height' }, + { localName: 'width' }, + ], + hasAttribute: () => { + return true; + }, + nodeType: 2, + nodeName: 'nodename', + childNodes: [], + }, + { + attributes: { + 'data-binary-transparency-hash-key': { value: 'green' }, + getAttribute: () => {}, + }, + getElementsByTagName: () => { + return [ + { + attributes: { + 'data-binary-transparency-hash-key': { value: 'green1' }, + }, + getAttribute: () => {}, + }, + { + attributes: { + 'data-binary-transparency-hash-key': { value: 'green2' }, + }, + getAttribute: () => {}, + }, + ]; + }, + hasAttribute: () => { + return false; + }, + nodeType: 1, + nodeName: 'nodename', + childNodes: [], + }, + ], + hasAttribute: () => { + return false; + }, + nodeType: 1, + nodeName: 'nodename', + tagName: 'tagName', + }; + const scriptMap = new Map([['version', []]]); + hasInvalidScripts(fakeElement, scriptMap); + expect(scriptMap.get('version').length).toBe(2); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(2); + }); + }); + describe('scanForScripts', () => { + it('should find existing script tags in the DOM and check them', () => { + vi.resetModules(); + document.body.innerHTML = + '
' + + ' ' + + ' ' + + '
'; + scanForScripts(); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(2); + }); + }); + describe('processFoundJS', () => { + // these are flaky because vi.resestModules doesn't work for esm + // while the above may be true, redo these as async and flush promises and they should work. + it('should send valid icon update when no src based scripts are invalid', async () => { + document.body.innerHTML = + '
' + + ' ' + + ' ' + + '
'; + scanForScripts(); + (window.chrome.runtime.sendMessage as unknown as Mock).mockImplementation( + (message, response) => { + response && response({ valid: true }); + } + ); + processFoundJS(ORIGIN_TYPE.WHATSAPP, ''); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(6); + }); + it('should send valid icon update when no inline based scripts are invalid', async () => { + document.body.innerHTML = + '
' + + ' ' + + ' ' + + '
'; + scanForScripts(); + (window.chrome.runtime.sendMessage as unknown as Mock).mockImplementation( + (message, response) => { + response && response({ valid: true }); + } + ); + processFoundJS(ORIGIN_TYPE.WHATSAPP, ''); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(6); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls[4][0] + .state + ).toEqual(STATES.PROCESSING); + }); + it('should send invalid icon update when invalid response received with src', async () => { + document.body.innerHTML = + '
' + + ' ' + + ' ' + + '
'; + scanForScripts(); + (window.chrome.runtime.sendMessage as unknown as Mock).mockImplementation( + (message, response) => { + response && response({ valid: false }); + } + ); + processFoundJS(ORIGIN_TYPE.WHATSAPP, ''); + await (() => new Promise(res => setTimeout(res, 10)))(); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls.length + ).toBe(11); + expect( + (window.chrome.runtime.sendMessage as unknown as Mock).mock.calls[9][0] + .state + ).toEqual(STATES.INVALID); + }); + it.todo( + 'should send invalid icon update when invalid inline response received' + ); + }); +}); diff --git a/packages/apps/meta-code-verify/src/js/__tests__/detectKvstoreMeta.test.ts b/packages/apps/meta-code-verify/src/js/__tests__/detectKvstoreMeta.test.ts new file mode 100644 index 0000000000..f74d323df9 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/__tests__/detectKvstoreMeta.test.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; +import { describe, it } from 'vitest'; +describe('detectKVstoreMeta', () => { + it.todo('test extractMetaAndLoad'); + it.todo('ensure extraMetaAndLoad is called statically'); + it.todo('ensure extractMetaAndLoad is called after DOMContentReady'); +}); diff --git a/packages/apps/meta-code-verify/src/js/background.ts b/packages/apps/meta-code-verify/src/js/background.ts new file mode 100644 index 0000000000..9dd46a7f32 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/background.ts @@ -0,0 +1,434 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { + MESSAGE_TYPE, + ORIGIN_HOST, + ORIGIN_TIMEOUT, + ORIGIN_TYPE, +} from './config'; + +import { + recordContentScriptStart, + updateContentScriptState, +} from './tab_state_tracker/tabStateTracker'; + +const manifestCache = new Map(); +const debugCache = new Map(); +const cspHeaders = new Map(); +const cspReportHeaders = new Map(); + +// Emulate PageActions +chrome.runtime.onInstalled.addListener(() => { + if (chrome.runtime.getManifest().manifest_version >= 3) { + chrome.action.disable(); + } +}); + +function addDebugLog(tabId, debugMessage) { + let tabDebugList = debugCache.get(tabId); + if (tabDebugList == null) { + tabDebugList = []; + debugCache.set(tabId, tabDebugList); + } + + tabDebugList.push(debugMessage); +} + +const fromHexString = hexString => + new Uint8Array(hexString.match(/.{1,2}/g).map(byte => parseInt(byte, 16))); +const toHexString = bytes => + bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), ''); + +function getCFHashWorkaroundFunction(host, version): Promise { + return new Promise((resolve, reject) => { + fetch('https://nftstorage.link/ipfs/' + encodeURIComponent(version), { + method: 'GET', + }) + .then(response => response.clone()) + .then(response => response.json()) + .then(responseData => resolve(responseData)) + .catch(error => reject(error)); + }); +} + +async function validateManifest(rootHash, leaves, host, version, workaround) { + // does rootHash match what was published? + + const cfResponse = await getCFHashWorkaroundFunction(host, version).catch( + cfError => { + console.log('error fetching hash from CF', cfError); + return { + valid: false, + reason: 'ENDPOINT_FAILURE', + error: cfError, + }; + } + ); + + if (cfResponse == null) { + return { + valid: false, + reason: 'UNKNOWN_ENDPOINT_ISSUE', + }; + } + + const cfPayload = cfResponse as { root_hash?: string }; + let cfRootHash = cfPayload.root_hash; + if (cfPayload.root_hash.startsWith('0x')) { + cfRootHash = cfPayload.root_hash.slice(2); + } + // validate + if (rootHash !== cfRootHash) { + console.log('hash mismatch with CF ', rootHash, cfRootHash); + + // secondary hash to mitigate accidental build issue. + const encoder = new TextEncoder(); + const backupHashEncoded = encoder.encode(workaround); + const backupHashArray = Array.from( + new Uint8Array(await crypto.subtle.digest('SHA-256', backupHashEncoded)) + ); + const backupHash = backupHashArray + .map(b => b.toString(16).padStart(2, '0')) + .join(''); + console.log( + 'secondary hashing of CF value fails too ', + rootHash, + backupHash + ); + if (backupHash !== cfRootHash) { + return { + valid: false, + reason: 'ROOT_HASH_VERFIY_FAIL_3RD_PARTY', + }; + } + } + + let oldhashes = leaves.map( + leaf => fromHexString(leaf.replace('0x', '')).buffer + ); + let newhashes = []; + let bonus = ''; + + while (oldhashes.length > 1) { + for (let index = 0; index < oldhashes.length; index += 2) { + const validSecondValue = index + 1 < oldhashes.length; + if (validSecondValue) { + const hashValue = new Uint8Array( + oldhashes[index].byteLength + oldhashes[index + 1].byteLength + ); + hashValue.set(new Uint8Array(oldhashes[index]), 0); + hashValue.set( + new Uint8Array(oldhashes[index + 1]), + oldhashes[index].byteLength + ); + newhashes.push(await crypto.subtle.digest('SHA-256', hashValue.buffer)); + } else { + bonus = oldhashes[index]; + } + } + oldhashes = newhashes; + if (bonus !== '') { + oldhashes.push(bonus); + } + console.log( + 'layer hex is ', + oldhashes.map(hash => { + return Array.from(new Uint8Array(hash)) + .map(b => b.toString(16).padStart(2, '')) + .join(''); + }) + ); + newhashes = []; + bonus = ''; + console.log( + 'in loop hashes.length is', + oldhashes.length, + rootHash, + oldhashes + ); + } + const lastHash = toHexString(new Uint8Array(oldhashes[0])); + console.log('before return comparison', rootHash, lastHash); + if (lastHash === rootHash) { + return { + valid: true, + }; + } + return { + valid: false, + reason: 'ROOT_HASH_VERFIY_FAIL_IN_PAGE', + }; +} + +async function validateMetaCompanyManifest(rootHash, otherHashes, leaves) { + // merge all the hashes into one + const megaHash = JSON.stringify(leaves); + // hash it + const encoder = new TextEncoder(); + const encodedMegaHash = encoder.encode(megaHash); + const jsHashArray = Array.from( + new Uint8Array(await crypto.subtle.digest('SHA-256', encodedMegaHash)) + ); + const jsHash = jsHashArray.map(b => b.toString(16).padStart(2, '0')).join(''); + // compare to main and long tail, it should match one + // then hash it with the other + let combinedHash = ''; + if (jsHash === otherHashes.main || jsHash === otherHashes.longtail) { + const combinedHashArray = Array.from( + new Uint8Array( + await crypto.subtle.digest( + 'SHA-256', + encoder.encode(otherHashes.longtail + otherHashes.main) + ) + ) + ); + combinedHash = combinedHashArray + .map(b => b.toString(16).padStart(2, '0')) + .join(''); + } else { + return false; + } + + // ensure result matches root, return. + console.log('combined hash is ', combinedHash, rootHash); + return combinedHash === rootHash; +} + +function getDebugLog(tabId) { + const tabDebugList = debugCache.get(tabId); + return tabDebugList == null ? [] : tabDebugList; +} + +export function handleMessages(message, sender, sendResponse) { + console.log('in handle messages ', message); + + if (message.type == MESSAGE_TYPE.LOAD_MANIFEST) { + // validate manifest + if ( + [ORIGIN_TYPE.FACEBOOK, ORIGIN_TYPE.MESSENGER].includes(message.origin) + ) { + validateMetaCompanyManifest( + message.rootHash, + message.otherHashes, + message.leaves + ).then(valid => { + console.log('result is ', valid); + if (valid) { + let origin = manifestCache.get(message.origin); + if (origin == null) { + origin = new Map(); + manifestCache.set(message.origin, origin); + } + // roll through the existing manifests and remove expired ones + if (ORIGIN_TIMEOUT[message.origin] > 0) { + for (const [key, manif] of origin.entries()) { + if (manif.start + ORIGIN_TIMEOUT[message.origin] < Date.now()) { + origin.delete(key); + } + } + } + + let manifest = origin.get(message.version); + if (!manifest) { + manifest = { + leaves: [], + root: message.rootHash, + start: Date.now(), + }; + origin.set(message.version, manifest); + } + message.leaves.forEach(leaf => { + if (!manifest.leaves.includes(leaf)) { + manifest.leaves.push(leaf); + } + }); + sendResponse({ valid: true }); + } else { + sendResponse({ valid: false }); + } + }); + } else { + const slicedHash = message.rootHash.slice(2); + const slicedLeaves = message.leaves.map(leaf => { + return leaf.slice(2); + }); + validateManifest( + slicedHash, + slicedLeaves, + ORIGIN_HOST[message.origin], + message.version, + message.workaround + ).then(validationResult => { + if (validationResult.valid) { + // store manifest to subsequently validate JS + let origin = manifestCache.get(message.origin); + if (origin == null) { + origin = new Map(); + manifestCache.set(message.origin, origin); + } + // roll through the existing manifests and remove expired ones + if (ORIGIN_TIMEOUT[message.origin] > 0) { + for (const [key, manif] of origin.entries()) { + if (manif.start + ORIGIN_TIMEOUT[message.origin] < Date.now()) { + origin.delete(key); + } + } + } + console.log('result is ', validationResult.valid); + origin.set(message.version, { + leaves: slicedLeaves, + root: slicedHash, + start: Date.now(), + }); + sendResponse({ valid: true }); + } else { + sendResponse(validationResult); + } + }); + } + return true; + } + + if (message.type == MESSAGE_TYPE.RAW_JS) { + const origin = manifestCache.get(message.origin); + if (!origin) { + addDebugLog( + sender.tab.id, + 'Error: RAW_JS had no matching origin ' + message.origin + ); + sendResponse({ valid: false, reason: 'no matching origin' }); + return; + } + const manifestObj = origin.get(message.version); + const manifest = manifestObj && manifestObj.leaves; + if (!manifest) { + addDebugLog( + sender.tab.id, + 'Error: JS with SRC had no matching manifest. origin: ' + + message.origin + + ' version: ' + + message.version + ); + sendResponse({ valid: false, reason: 'no matching manifest' }); + return; + } + + // fetch the src + const encoder = new TextEncoder(); + const encodedJS = encoder.encode(message.rawjs); + // hash the src + crypto.subtle.digest('SHA-256', encodedJS).then(jsHashBuffer => { + const jsHashArray = Array.from(new Uint8Array(jsHashBuffer)); + const jsHash = jsHashArray + .map(b => b.toString(16).padStart(2, '0')) + .join(''); + + if (manifestObj.leaves.includes(jsHash)) { + sendResponse({ valid: true }); + } else { + console.log('generate hash is ', jsHash); + addDebugLog( + sender.tab.id, + 'Error: hash does not match ' + + message.origin + + ', ' + + message.version + + ', unmatched JS is ' + + message.rawjs.substring(0, 500) + ); + sendResponse({ + valid: false, + hash: jsHash, + reason: + 'Error: hash does not match ' + + message.origin + + ', ' + + message.version + + ', unmatched JS is ' + + message.rawjs, + }); + } + }); + return true; + } + + if (message.type == MESSAGE_TYPE.DEBUG) { + addDebugLog(sender.tab.id, message.log); + return; + } + + if (message.type == MESSAGE_TYPE.GET_DEBUG) { + const debuglist = getDebugLog(message.tabId); + console.log('debug list is ', message.tabId, debuglist); + sendResponse({ valid: true, debugList: debuglist }); + return; + } + + if (message.type === MESSAGE_TYPE.UPDATE_STATE) { + updateContentScriptState(sender, message.state, message.origin); + sendResponse({ success: true }); + return; + } + + if (message.type === MESSAGE_TYPE.CONTENT_SCRIPT_START) { + recordContentScriptStart(sender, message.origin); + sendResponse({ + success: true, + cspHeader: cspHeaders.get(sender.tab.id), + cspReportHeader: cspReportHeaders.get(sender.tab.id), + }); + return; + } +} + +chrome.runtime.onMessage.addListener(handleMessages); + +chrome.webRequest.onResponseStarted.addListener( + src => { + if ( + src.type === 'script' && + !src.fromCache && + src.url.indexOf('chrome-extension://') === 0 && + src.url.indexOf('moz-extension://') === 0 + ) { + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + greeting: 'nocacheHeaderFound', + }); + }); + } + }, + { urls: [''] }, + [] +); + +chrome.webRequest.onHeadersReceived.addListener( + details => { + if (details.frameId === 0 && details.responseHeaders) { + const cspHeader = details.responseHeaders.find( + header => header.name === 'content-security-policy' + ); + const cspReportHeader = details.responseHeaders.find( + header => header.name === 'content-security-policy-report-only' + ); + cspHeaders.set(details.tabId, cspHeader?.value); + cspReportHeaders.set(details.tabId, cspReportHeader?.value); + } + }, + { + types: ['main_frame'], + urls: ['*://*.facebook.com/*', '*://*.messenger.com/*'], + }, + ['responseHeaders'] +); + +chrome.tabs.onRemoved.addListener(tabId => { + if (debugCache.has(tabId)) { + debugCache.delete(tabId); + } +}); diff --git a/packages/apps/meta-code-verify/src/js/config.ts b/packages/apps/meta-code-verify/src/js/config.ts new file mode 100644 index 0000000000..268e561815 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/config.ts @@ -0,0 +1,148 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +export const STATES = Object.freeze({ + // Starting state for all frames/tabs + START: 'START', + // Tab is processing scripts + PROCESSING: 'PROCESSING', + // Disable the extension (it shouldn't be running on this tab) + IGNORE: 'IGNORE', + // Script verification against the manifest failed. + INVALID: 'INVALID', + // Unknown inline script from an extension was found + RISK: 'RISK', + // All script verifications succeeded + VALID: 'VALID', + // Timed out waiting for the manifest to be available on the page + TIMEOUT: 'TIMEOUT', +}); + +export type State = keyof typeof STATES; + +const ICONS = { + DEFAULT: { + 32: 'default_32.png', + 64: 'default_64.png', + 128: 'default_64@2x.png', + }, + FAILURE: { + 32: 'failure_32.png', + }, + RISK: { + 32: 'risk_32.png', + }, + VALID: { + 32: 'validated_32.png', + }, +}; + +export const STATES_TO_ICONS = { + [STATES.START]: ICONS.DEFAULT, + [STATES.PROCESSING]: ICONS.DEFAULT, + [STATES.IGNORE]: ICONS.DEFAULT, + [STATES.INVALID]: ICONS.FAILURE, + [STATES.RISK]: ICONS.RISK, + [STATES.VALID]: ICONS.VALID, + [STATES.TIMEOUT]: ICONS.RISK, +}; + +export const KNOWN_EXTENSION_HASHES = [ + '', // Chrome - Dynamic: StopAll Ads + '727bfede71f473991faeb7f4b65632c93e7f7d17189f1b3d952cd990cd150808', // Chrome and Edge: Avast Online Security & Privacy v21.0.101 + 'c09a2e7b2fa97705c9afe890498e1f620ede4bd2968cfef7421080a8f9f0d8f9', // Chrome: Privacy Badger v2021.11.23.1 + '04c354b90b330f4cac2678ccd311e5d2a6e8b57815510b176ddbed8d52595726', // Chrome: LastPass v4.88.0 + 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Chrome: AdLock - adblocker & privacy protection v0.1.30 + '', // Chrome - Dynamic: AdBlocker Ultimate v3.7.15 + '', // Chrome - Dynamic: DuckDuckGo Privacy Essentials v2022.2.22 + '', // Chrome - Dynamic: Crystal Ad block v1.3.9 + '', // Chrome - Dynamic: AdBlock — best ad blocker v4.43.0 + '4ae6b4dcefb37952cef704c39fe3e8d675bd32c54302984e747ba6768541862a', // Chrome: Vue.js devtools v6.0.12 + '91fecf0ca4c2260f8a18d1c371d717e656e98a0015f0206379afe662746d6009', // Chrome: Vue.js devtools v6.0.12 + 'e64b3a9472f559611158a628da06e770ce8cc3d0f8395849072a0199bae705f9', // FF: Total Adblock-Ad Blocker v2.10.0 *and* FF/Edge BitGuard v1.0 + 'c924b9ed122066e5420b125a1accb787c3856c4a422fe9bde47d1f40660271a6', // FF: Smart Blocker v1.0.2 + '', // FF: Popup Blocker(strict) + '', // FF - Dynamic: Privacy Tweaks + '', // FF: Privacy Possum + '', // FF - Dynamic: Adblocker X v2.0.5 + '', // FF - Dynamic: AdBlocker Ultimate v3.7.15 + '', // FF - Dynamic: Cloudopt AdBlocker v2.3.0 + '', // Edge - Dynamic: Epsilon Ad blocker v1.4.6 + '7a69d1fb29471a9962307f7882adade784141d02617e233eb366ae5f63fd9dd8', // Edge and FF: Minimal Consent v1.0.9 + 'd768396bbfda57a3defb0aeba5d9b9aefef562d8204520668f9e275c68455a0c', // Edge: Writer from Writer.com v1.63.2 + '', // Edge - Dynamic: AdBlock --- best ad blocker v4.43.0 + '855e2fd1368fc12a14159e26ed3132e6567e8443f8b75081265b93845b865103', // Edge and FF: AdGuard AdBlocker v3.6.17 + 'deda33bced5f2014562e03f8c82a2a16df074a2bc6be6eceba78274056e41372', // Edge: Netcraft Extension v1.16.8 + '', // Edge - Dynamic: Hola ad remover v1.194.444 + '', // Edge - Dynamic: Tau adblock v1.4.1 +]; + +export const KNOWN_EXTENSION_HASHES_MAP = new Map( + Object.entries({ + '727bfede71f473991faeb7f4b65632c93e7f7d17189f1b3d952cd990cd150808': + 'Avast Online Security & Privacy v21.0.101', + c09a2e7b2fa97705c9afe890498e1f620ede4bd2968cfef7421080a8f9f0d8f9: + 'Privacy Badger v2021.11.23.1', + '04c354b90b330f4cac2678ccd311e5d2a6e8b57815510b176ddbed8d52595726': + 'LastPass v4.88.0', + e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855: + 'AdLock - adblocker & privacy protection v0.1.30', + '4ae6b4dcefb37952cef704c39fe3e8d675bd32c54302984e747ba6768541862a': + 'Vue.js devtools v6.0.12', + '91fecf0ca4c2260f8a18d1c371d717e656e98a0015f0206379afe662746d6009': + 'Vue.js devtools v6.0.12', + e64b3a9472f559611158a628da06e770ce8cc3d0f8395849072a0199bae705f9: + 'Total Adblock-Ad Blocker v2.10.0 *and* FF/Edge BitGuard v1.0', + c924b9ed122066e5420b125a1accb787c3856c4a422fe9bde47d1f40660271a6: + 'Smart Blocker v1.0.2', + '7a69d1fb29471a9962307f7882adade784141d02617e233eb366ae5f63fd9dd8': + 'Minimal Consent v1.0.9', + d768396bbfda57a3defb0aeba5d9b9aefef562d8204520668f9e275c68455a0c: + 'Writer from Writer.com v1.63.2', + '855e2fd1368fc12a14159e26ed3132e6567e8443f8b75081265b93845b865103': + 'AdGuard AdBlocker v3.6.17', + deda33bced5f2014562e03f8c82a2a16df074a2bc6be6eceba78274056e41372: + 'Netcraft Extension v1.16.8', + }) +); + +export const MESSAGE_TYPE = { + DEBUG: 'DEBUG', + GET_DEBUG: 'GET_DEBUG', + LOAD_MANIFEST: 'LOAD_MANIFEST', + POPUP_STATE: 'POPUP_STATE', + RAW_JS: 'RAW_JS', + UPDATE_STATE: 'UPDATE_STATE', + STATE_UPDATED: 'STATE_UPDATED', + CONTENT_SCRIPT_START: 'CONTENT_SCRIPT_START', +}; + +export const ORIGIN_HOST = { + FACEBOOK: 'facebook.com', + WHATSAPP: 'whatsapp.com', + MESSENGER: 'messenger.com', + KVSTORE: 'dashboard.humanprotocol.org', +}; + +export const ORIGIN_TIMEOUT = { + FACEBOOK: 176400000, + WHATSAPP: 0, + MESSENGER: 0, +}; + +export const ORIGIN_TYPE = Object.freeze({ + FACEBOOK: 'FACEBOOK', + WHATSAPP: 'WHATSAPP', + MESSENGER: 'MESSENGER', + KVSTORE: 'KVSTORE', +}); + +export type Origin = keyof typeof ORIGIN_TYPE; + +// Firefox and Safari currently do not support CompressionStream +export const DOWNLOAD_JS_ENABLED = + typeof window !== 'undefined' && 'CompressionStream' in window; diff --git a/packages/apps/meta-code-verify/src/js/contentUtils.ts b/packages/apps/meta-code-verify/src/js/contentUtils.ts new file mode 100644 index 0000000000..b8a71bd2b5 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/contentUtils.ts @@ -0,0 +1,1115 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { + KNOWN_EXTENSION_HASHES, + MESSAGE_TYPE, + ORIGIN_TYPE, + DOWNLOAD_JS_ENABLED, + STATES, +} from './config'; + +const DOM_EVENTS = [ + 'onabort', + 'onactivate', + 'onattribute', + 'onafterprint', + 'onafterscriptexecute', + 'onafterupdate', + 'onanimationcancel', + 'onanimationend', + 'onanimationiteration', + 'onanimationstart', + 'onappinstalled', + 'onariarequest', + 'onautocomplete', + 'onautocompleteerror', + 'onauxclick', + 'onbeforeactivate', + 'onbeforecopy', + 'onbeforecut', + 'onbeforedeactivate', + 'onbeforeeditfocus', + 'onbeforeinstallprompt', + 'onbeforepaste', + 'onbeforeprint', + 'onbeforescriptexecute', + 'onbeforeunload', + 'onbeforeupdate', + 'onbeforexrselect', + 'onbegin', + 'onblur', + 'onbounce', + 'oncancel', + 'oncanplay', + 'oncanplaythrough', + 'oncellchange', + 'onchange', + 'onclick', + 'onclose', + 'oncommand', + 'oncompassneedscalibration', + 'oncontextmenu', + 'oncontrolselect', + 'oncopy', + 'oncuechange', + 'oncut', + 'ondataavailable', + 'ondatasetchanged', + 'ondatasetcomplete', + 'ondblclick', + 'ondeactivate', + 'ondevicelight', + 'ondevicemotion', + 'ondeviceorientation', + 'ondeviceorientationabsolute', + 'ondeviceproximity', + 'ondrag', + 'ondragdrop', + 'ondragend', + 'ondragenter', + 'ondragleave', + 'ondragover', + 'ondragstart', + 'ondrop', + 'ondurationchange', + 'onemptied', + 'onend', + 'onended', + 'onerror', + 'onerrorupdate', + 'onexit', + 'onfilterchange', + 'onfinish', + 'onfocus', + 'onfocusin', + 'onfocusout', + 'onformchange', + 'onformdata', + 'onforminput', + 'onfullscreenchange', + 'onfullscreenerror', + 'ongotpointercapture', + 'onhashchange', + 'onhelp', + 'oninput', + 'oninvalid', + 'onkeydown', + 'onkeypress', + 'onkeyup', + 'onlanguagechange', + 'onlayoutcomplete', + 'onload', + 'onloadeddata', + 'onloadedmetadata', + 'onloadend', + 'onloadstart', + 'onlosecapture', + 'onlostpointercapture', + 'onmediacomplete', + 'onmediaerror', + 'onmessage', + 'onmessageerror', + 'onmousedown', + 'onmouseenter', + 'onmouseleave', + 'onmousemove', + 'onmouseout', + 'onmouseover', + 'onmouseup', + 'onmousewheel', + 'onmove', + 'onmoveend', + 'onmovestart', + 'onmozfullscreenchange', + 'onmozfullscreenerror', + 'onmozpointerlockchange', + 'onmozpointerlockerror', + 'onmscontentzoom', + 'onmsfullscreenchange', + 'onmsfullscreenerror', + 'onmsgesturechange', + 'onmsgesturedoubletap', + 'onmsgestureend', + 'onmsgesturehold', + 'onmsgesturestart', + 'onmsgesturetap', + 'onmsgotpointercapture', + 'onmsinertiastart', + 'onmslostpointercapture', + 'onmsmanipulationstatechanged', + 'onmspointercancel', + 'onmspointerdown', + 'onmspointerenter', + 'onmspointerleave', + 'onmspointermove', + 'onmspointerout', + 'onmspointerover', + 'onmspointerup', + 'onmssitemodejumplistitemremoved', + 'onmsthumbnailclick', + 'onoffline', + 'ononline', + 'onoutofsync', + 'onpage', + 'onpagehide', + 'onpageshow', + 'onpaste', + 'onpause', + 'onplay', + 'onplaying', + 'onpointercancel', + 'onpointerdown', + 'onpointerenter', + 'onpointerleave', + 'onpointerlockchange', + 'onpointerlockerror', + 'onpointermove', + 'onpointerout', + 'onpointerover', + 'onpointerrawupdate', + 'onpointerup', + 'onpopstate', + 'onprogress', + 'onpropertychange', + 'onratechange', + 'onreadystatechange', + 'onreceived', + 'onrejectionhandled', + 'onrepeat', + 'onreset', + 'onresize', + 'onresizeend', + 'onresizestart', + 'onresume', + 'onreverse', + 'onrowdelete', + 'onrowenter', + 'onrowexit', + 'onrowinserted', + 'onrowsdelete', + 'onrowsenter', + 'onrowsexit', + 'onrowsinserted', + 'onscroll', + 'onsearch', + 'onsecuritypolicyviolation', + 'onseek', + 'onseeked', + 'onseeking', + 'onselect', + 'onselectionchange', + 'onselectstart', + 'onslotchange', + 'onstalled', + 'onstorage', + 'onstoragecommit', + 'onstart', + 'onstop', + 'onshow', + 'onsyncrestored', + 'onsubmit', + 'onsuspend', + 'onsynchrestored', + 'ontimeerror', + 'ontimeupdate', + 'ontoggle', + 'ontouchend', + 'ontouchmove', + 'ontouchstart', + 'ontrackchange', + 'ontransitioncancel', + 'ontransitionend', + 'ontransitionrun', + 'ontransitionstart', + 'onunhandledrejection', + 'onunload', + 'onurlflip', + 'onuserproximity', + 'onvolumechange', + 'onwaiting', + 'onwebkitanimationend', + 'onwebkitanimationiteration', + 'onwebkitanimationstart', + 'onwebkitfullscreenchange', + 'onwebkitfullscreenerror', + 'onwebkittransitionend', + 'onwheel', +]; + +const sourceScripts = new Map(); +const inlineScripts = []; +const foundScripts = new Map(); +foundScripts.set('', []); +let currentOrigin = ''; +let currentFilterType = ''; +let manifestTimeoutID = ''; + +function updateCurrentState(state) { + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.UPDATE_STATE, + state, + origin: currentOrigin, + }); +} + +export function storeFoundJS(scriptNodeMaybe, scriptList) { + if (window != window.top) { + // this means that content utils is running in an iframe - disable timer and call processFoundJS on manifest processed in top level frame + clearTimeout(manifestTimeoutID); + manifestTimeoutID = ''; + window.setTimeout( + () => processFoundJS(currentOrigin, foundScripts.keys().next().value), + 0 + ); + } + // check if it's the manifest node + if ( + window == window.top && + (scriptNodeMaybe.id === 'binary-transparency-manifest' || + scriptNodeMaybe.getAttribute('name') === 'binary-transparency-manifest') + ) { + let rawManifest: { + leaves?: Array; + root?: string; + version?: string; + manifest?: Array; + manifest_hashes?: string & { combined_hash?: string }; + } = {}; + try { + rawManifest = JSON.parse(scriptNodeMaybe.textContent); + } catch (manifestParseError) { + setTimeout( + () => parseFailedJson({ node: scriptNodeMaybe, retry: 5000 }), + 20 + ); + return; + } + + let leaves = rawManifest.leaves; + let otherHashes = ''; + let otherType = ''; + let roothash = rawManifest.root; + let version = rawManifest.version; + + if ( + [ORIGIN_TYPE.FACEBOOK, ORIGIN_TYPE.MESSENGER].includes( + currentOrigin as 'FACEBOOK' | 'MESSENGER' + ) + ) { + leaves = rawManifest.manifest; + otherHashes = rawManifest.manifest_hashes; + otherType = scriptNodeMaybe.getAttribute('data-manifest-type'); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + roothash = otherHashes.combined_hash; + version = scriptNodeMaybe.getAttribute('data-manifest-rev'); + + if (currentFilterType != '') { + currentFilterType = 'BOTH'; + } + if (currentFilterType === '') { + currentFilterType = otherType; + } + } + // for whatsapp + else { + currentFilterType = 'BOTH'; + } + // now that we know the actual version of the scripts, transfer the ones we know about. + if (foundScripts.has('')) { + foundScripts.set(version, foundScripts.get('')); + foundScripts.delete(''); + } + + chrome.runtime.sendMessage( + { + type: MESSAGE_TYPE.LOAD_MANIFEST, + leaves: leaves, + origin: currentOrigin, + otherHashes: otherHashes, + otherType: otherType, + rootHash: roothash, + workaround: scriptNodeMaybe.innerHTML, + version: version, + }, + response => { + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: + 'manifest load response is ' + response + ? JSON.stringify(response).substring(0, 500) + : '', + }); + // then start processing of it's JS + if (response.valid) { + if (manifestTimeoutID !== '') { + clearTimeout(manifestTimeoutID); + manifestTimeoutID = ''; + } + window.setTimeout(() => processFoundJS(currentOrigin, version), 0); + } else { + if ( + ['ENDPOINT_FAILURE', 'UNKNOWN_ENDPOINT_ISSUE'].includes( + response.reason + ) + ) { + updateCurrentState(STATES.TIMEOUT); + return; + } + updateCurrentState(STATES.INVALID); + } + } + ); + } + + if (scriptNodeMaybe.getAttribute('type') === 'application/json') { + try { + JSON.parse(scriptNodeMaybe.textContent); + } catch (parseError) { + setTimeout( + () => parseFailedJson({ node: scriptNodeMaybe, retry: 1500 }), + 20 + ); + } + return; + } + if ( + scriptNodeMaybe.src != null && + scriptNodeMaybe.src !== '' && + scriptNodeMaybe.src.indexOf('blob:') === 0 + ) { + // TODO: try to process the blob. For now, flag as warning. + updateCurrentState(STATES.INVALID); + return; + } + + const dataBtManifest = scriptNodeMaybe.getAttribute('data-btmanifest'); + const otherType = dataBtManifest == null ? '' : dataBtManifest.split('_')[1]; + // need to get the src of the JS + if (scriptNodeMaybe.src != null && scriptNodeMaybe.src !== '') { + if (scriptList.size === 1) { + scriptList.get(scriptList.keys().next().value).push({ + src: scriptNodeMaybe.src, + otherType: otherType, // TODO: read from DOM when available + }); + } + } else { + // no src, access innerHTML for the code + const hashLookupAttribute = + scriptNodeMaybe.attributes['data-binary-transparency-hash-key']; + const hashLookupKey = hashLookupAttribute && hashLookupAttribute.value; + if (scriptList.size === 1) { + scriptList.get(scriptList.keys().next().value).push({ + type: MESSAGE_TYPE.RAW_JS, + rawjs: scriptNodeMaybe.innerHTML, + lookupKey: hashLookupKey, + otherType: otherType, // TODO: read from DOM when available + }); + } + } + updateCurrentState(STATES.PROCESSING); +} + +function getAttributeValue( + nodeName, + checkNode, + htmlElement, + attributeName, + currentAttributeValue +) { + if ( + nodeName.toLowerCase() === checkNode && + htmlElement.hasAttribute(attributeName) + ) { + return htmlElement.getAttribute(attributeName).toLowerCase(); + } + return currentAttributeValue; +} + +const AttributeCheckPairs = [ + { nodeName: 'a', attributeName: 'href' }, + { nodeName: 'iframe', attributeName: 'src' }, + { nodeName: 'iframe', attributeName: 'srcdoc' }, + { nodeName: 'form', attributeName: 'action' }, + { nodeName: 'input', attributeName: 'formaction' }, + { nodeName: 'button', attributeName: 'formaction' }, + { nodeName: 'a', attributeName: 'xlink:href' }, + { nodeName: 'ncc', attributeName: 'href' }, + { nodeName: 'embed', attributeName: 'src' }, + { nodeName: 'object', attributeName: 'data' }, + { nodeName: 'animate', attributeName: 'xlink:href' }, + { nodeName: 'script', attributeName: 'xlink:href' }, + { nodeName: 'use', attributeName: 'href' }, + { nodeName: 'use', attributeName: 'xlink:href' }, + { nodeName: 'x', attributeName: 'href' }, + { nodeName: 'x', attributeName: 'xlink:href' }, +]; + +export function hasViolatingJavaScriptURI(htmlElement) { + let checkURL = ''; + const lowerCaseNodeName = htmlElement.nodeName.toLowerCase(); + AttributeCheckPairs.forEach(checkPair => { + checkURL = getAttributeValue( + lowerCaseNodeName, + checkPair.nodeName, + htmlElement, + checkPair.attributeName, + checkURL + ); + }); + if (checkURL !== '') { + // make sure anchor tags and object tags don't have javascript urls + if (checkURL.indexOf('javascript') >= 0) { + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: 'violating attribute: javascript url', + }); + updateCurrentState(STATES.INVALID); + } + } + + if (typeof htmlElement.childNodes !== 'undefined') { + htmlElement.childNodes.forEach(element => { + hasViolatingJavaScriptURI(element); + }); + } +} + +export function hasInvalidAttributes(htmlElement) { + if ( + typeof htmlElement.attributes === 'object' && + Object.keys(htmlElement.attributes).length >= 1 + ) { + Array.from(htmlElement.attributes).forEach(elementAttribute => { + // check first for violating attributes + if (DOM_EVENTS.indexOf((elementAttribute as Attr).localName) >= 0) { + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: + 'violating attribute ' + + (elementAttribute as Attr).localName + + ' from element ' + + htmlElement.outerHTML, + }); + updateCurrentState(STATES.INVALID); + } + }); + } + // check child nodes as well, since a malicious attacker could try to inject an invalid attribute via an image node in a svg tag using a use element + if (htmlElement.childNodes.length > 0) { + htmlElement.childNodes.forEach(childNode => { + if (childNode.nodeType === 1) { + hasInvalidAttributes(childNode); + } + // if the element is a math element, check all the attributes of the child node to ensure that there are on href or xlink:href attributes with javascript urls + if ( + htmlElement.tagName.toLowerCase() === 'math' && + Object.keys(childNode.attributes).length >= 1 + ) { + Array.from(childNode.attributes).forEach(elementAttribute => { + if ( + ((elementAttribute as Attr).localName === 'href' || + (elementAttribute as Attr).localName === 'xlink:href') && + childNode + .getAttribute((elementAttribute as Attr).localName) + .toLowerCase() + .startsWith('javascript') + ) { + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: + 'violating attribute ' + + (elementAttribute as Attr).localName + + ' from element ' + + htmlElement.outerHTML, + }); + updateCurrentState(STATES.INVALID); + } + }); + } + }); + } +} + +function checkNodesForViolations(element) { + hasViolatingJavaScriptURI(element); + hasInvalidAttributes(element); +} + +export function hasInvalidScripts(scriptNodeMaybe, scriptList) { + // if not an HTMLElement ignore it! + if (scriptNodeMaybe.nodeType !== 1) { + return false; + } + checkNodesForViolations(scriptNodeMaybe); + + if (scriptNodeMaybe.nodeName.toLowerCase() === 'script') { + return storeFoundJS(scriptNodeMaybe, scriptList); + } else if (scriptNodeMaybe.childNodes.length > 0) { + scriptNodeMaybe.childNodes.forEach(childNode => { + // if not an HTMLElement ignore it! + if (childNode.nodeType !== 1) { + return; + } + checkNodesForViolations(childNode); + if (childNode.nodeName.toLowerCase() === 'script') { + storeFoundJS(childNode, scriptList); + return; + } + + Array.from(childNode.getElementsByTagName('script')).forEach( + childScript => { + storeFoundJS(childScript, scriptList); + } + ); + }); + } + + return; +} + +const parseCSPString = csp => { + const directiveStrings = csp.split(';'); + return directiveStrings.reduce((map, directiveString) => { + const [directive, ...values] = directiveString.split(' '); + return map.set(directive, new Set(values)); + }, new Map()); +}; + +const checkCSPHeaders = (cspHeader, cspReportHeader) => { + // If CSP is enforcing on evals we don't need to do extra checks + if (cspHeader != null) { + const cspMap = parseCSPString(cspHeader); + if (cspMap.has('script-src')) { + if (!cspMap.get('script-src').has("'unsafe-eval'")) { + return; + } + } + if (!cspMap.has('script-src') && cspMap.has('default-src')) { + if (!cspMap.get('default-src').has("'unsafe-eval'")) { + return; + } + } + } + + // If CSP is not reporting on evals we cannot catch them + if (cspReportHeader != null) { + const cspReportMap = parseCSPString(cspReportHeader); + if (cspReportMap.has('script-src')) { + if (cspReportMap.get('script-src').has("'unsafe-eval'")) { + updateCurrentState(STATES.INVALID); + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: 'Missing unsafe-eval from CSP report-only header', + }); + return; + } + } + if (!cspReportMap.has('script-src') && cspReportMap.has('default-src')) { + if (cspReportMap.get('default-src').has("'unsafe-eval'")) { + updateCurrentState(STATES.INVALID); + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: 'Missing unsafe-eval from CSP report-only header', + }); + return; + } + } + } else { + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: 'Missing CSP report-only header', + }); + updateCurrentState(STATES.INVALID); + return; + } + + // Check for evals + scanForCSPEvalReportViolations(); +}; + +const scanForCSPEvalReportViolations = () => { + document.addEventListener('securitypolicyviolation', e => { + if (e.blockedURI !== 'eval') { + return; + } + + if (e.disposition === 'enforce') { + return; + } + + fetch(e.sourceFile, { cache: 'only-if-cached', mode: 'same-origin' }) + .then(response => { + if (response.status === 504) { + updateCurrentState(STATES.INVALID); + } + + return response.text(); + }) + .then(code => { + const violatingLine = code.split(/\r?\n/)[e.lineNumber - 1]; + if ( + violatingLine.includes('WebAssembly') && + !violatingLine.includes('eval(') && + !violatingLine.includes('Function(') && + !violatingLine.includes("setTimeout('") && + !violatingLine.includes("setInterval('") && + !violatingLine.includes('setTimeout("') && + !violatingLine.includes('setInterval("') + ) { + return; + } + updateCurrentState(STATES.INVALID); + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: `Caught eval in ${e.sourceFile}`, + }); + }); + }); +}; + +export const scanForScripts = () => { + const allElements = document.getElementsByTagName('*'); + + Array.from(allElements).forEach(allElement => { + checkNodesForViolations(allElement); + // next check for existing script elements and if they're violating + if (allElement.nodeName.toLowerCase() === 'script') { + storeFoundJS(allElement, foundScripts); + } + }); + + try { + // track any new scripts that get loaded in + const scriptMutationObserver = new MutationObserver(mutationsList => { + mutationsList.forEach(mutation => { + if (mutation.type === 'childList') { + Array.from(mutation.addedNodes).forEach(checkScript => { + hasInvalidScripts(checkScript, foundScripts); + }); + } else if (mutation.type === 'attributes') { + updateCurrentState(STATES.INVALID); + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: + 'Processed DOM mutation and invalid attribute added or changed ' + + mutation.target, + }); + } + }); + }); + + scriptMutationObserver.observe(document, { + attributeFilter: DOM_EVENTS, + childList: true, + subtree: true, + }); + } catch (_UnknownError) { + updateCurrentState(STATES.INVALID); + } +}; + +/** + * Return text from the response object. The main purpose of this method is to + * extract and parse sourceURL and sourceMappingURL comments from inlined data + * scripts. + * Note that this function consumes the response body! + * + * @param {Response} response Response will be consumed! + * @returns string Response text if the sourceURL is valid + */ +async function genSourceText(response) { + const sourceText = await response.text(); + // Just a normal script tag with a source url + if (!response.url.startsWith('data:application/x-javascript')) { + return sourceText; + } + + // Inlined data-script. We need to extract with optional `//# sourceURL=` and + // `//# sourceMappingURL=` comments before sending it over to be hashed... + const sourceTextParts = sourceText.trimEnd().split('\n'); + + // NOTE: For security reasons, we expect inlined data scripts to *end* with + // sourceURL comments. This is because a man-in-the-middle can insert code + // after the sourceURL comment, which would execute on the browser but get + // stripped away by the extension before getting hashed + verified. + // As a result, we're always starting our search from the bottom. + if ( + sourceTextParts[sourceTextParts.length - 1].startsWith('//# sourceURL=') + ) { + const sourceURL = sourceTextParts.pop().split('//# sourceURL=')[1] ?? ''; + if (!sourceURL.startsWith('http')) { + throw new Error(`Invalid sourceUrl in inlined data script: ${sourceURL}`); + } + } + while ( + sourceTextParts[sourceTextParts.length - 1] === '\n' || + sourceTextParts[sourceTextParts.length - 1].startsWith( + '//# sourceMappingURL=' + ) + ) { + sourceTextParts.pop(); + } + return sourceTextParts.join('\n').trim(); +} + +async function processJSWithSrc(script, origin, version) { + // fetch the script from page context, not the extension context. + try { + const sourceResponse = await fetch(script.src, { method: 'GET' }); + if (DOWNLOAD_JS_ENABLED) { + const fileNameArr = script.src.split('/'); + const fileName = fileNameArr[fileNameArr.length - 1].split('?')[0]; + + sourceScripts.set( + fileName, + sourceResponse + .clone() + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + .body.pipeThrough(new window.CompressionStream('gzip')) + ); + } + const sourceText = await genSourceText(sourceResponse.clone()); + // split package up if necessary + const packages = sourceText.split('/*FB_PKG_DELIM*/\n'); + const packagePromises = packages.map(jsPackage => { + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage( + { + type: MESSAGE_TYPE.RAW_JS, + rawjs: jsPackage.trimStart(), + origin: origin, + version: version, + }, + response => { + if (response.valid) { + resolve(response.valid); + } else { + reject(response.type); + } + } + ); + }); + }); + await Promise.all(packagePromises); + return { valid: true }; + } catch (scriptProcessingError) { + return { + valid: false, + type: scriptProcessingError, + }; + } +} +async function allowDisallow(scriptOrHash, script) { + const disallowList = await chrome.storage.local.get(['disallow']); + const allowList = await chrome.storage.local.get(['allowlist']); + + const disallowMap = new Map(Object.entries(disallowList?.disallow || {})); + const allowMap = new Map(Object.entries(allowList?.allowlist || {})); + if ( + !disallowMap.size && + !allowMap.has(scriptOrHash?.src) && + !allowMap.has(scriptOrHash) + ) { + if (scriptOrHash?.src) { + disallowMap.set(scriptOrHash.src, script); + await chrome.storage.local.set({ + disallow: Object.fromEntries(disallowMap), + }); + } else { + disallowMap.set(scriptOrHash, script); + await chrome.storage.local.set({ + disallow: Object.fromEntries(disallowMap), + }); + } + } else { + if (scriptOrHash.src) { + if ( + !disallowMap.has(scriptOrHash.src) && + !allowMap.has(scriptOrHash.src) + ) { + const map2 = disallowMap.set(scriptOrHash.src, script); + await chrome.storage.local.set({ disallow: Object.fromEntries(map2) }); + } + } else { + if (!disallowMap.has(scriptOrHash) && !allowMap.has(scriptOrHash)) { + const map2 = disallowMap.set(scriptOrHash, script); + await chrome.storage.local.set({ disallow: Object.fromEntries(map2) }); + } + } + } +} + +export const processFoundJS = async (origin, version) => { + // foundScripts + const fullscripts = foundScripts.get(version).splice(0); + const scripts = fullscripts.filter(script => { + if ( + script.otherType === currentFilterType || + ['BOTH', ''].includes(currentFilterType) + ) { + return true; + } else { + foundScripts.get(version).push(script); + } + }); + const allowList = await chrome.storage.local.get(['allowlist']); + const allowMap = new Map(Object.entries(allowList?.allowlist || {})); + const disallowList = await chrome.storage.local.get(['disallow']); + const disallowMap = new Map(Object.entries(disallowList?.disallow || {})); + let pendingScriptCount = scripts.length; + for (const script of scripts) { + if (script.src) { + await processJSWithSrc(script, origin, version).then(response => { + pendingScriptCount--; + if (response.valid) { + if (pendingScriptCount == 0) { + updateCurrentState(STATES.VALID); + } + } else { + allowDisallow(script, script); + + if (response.type === 'EXTENSION') { + updateCurrentState(STATES.RISK); + } else if (allowMap.has(script.src)) { + if (disallowMap.size === 0) { + updateCurrentState(STATES.VALID); + } else { + updateCurrentState(STATES.RISK); + } + } else { + updateCurrentState(STATES.INVALID); + } + } + + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: + 'processed JS with SRC, ' + + script.src + + ',response is ' + + JSON.stringify(response).substring(0, 500), + }); + }); + } else { + chrome.runtime.sendMessage( + { + type: script.type, + rawjs: script.rawjs.trimStart(), + lookupKey: script.lookupKey, + origin: origin, + version: version, + }, + async response => { + pendingScriptCount--; + const inlineScriptMap = new Map(); + if (response.valid) { + inlineScriptMap.set(response.hash, script.rawjs); + inlineScripts.push(inlineScriptMap); + if (pendingScriptCount == 0) { + updateCurrentState(STATES.VALID); + } + } else { + allowDisallow(response.hash, script); + // using an array of maps, as we're using the same key for inline scripts - this will eventually be removed, once inline scripts are removed from the page load + inlineScriptMap.set('hash not in manifest', script.rawjs); + inlineScripts.push(inlineScriptMap); + + if ( + KNOWN_EXTENSION_HASHES.includes(response.hash) && + !allowMap.has(response.hash) + ) { + updateCurrentState(STATES.RISK); + } else if (allowMap.has(response.hash)) { + if (disallowMap.size === 0) { + updateCurrentState(STATES.VALID); + } else { + updateCurrentState(STATES.RISK); + } + } else { + updateCurrentState(STATES.INVALID); + } + } + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.DEBUG, + log: + 'processed the RAW_JS, response is ' + + response.hash + + ' ' + + JSON.stringify(response).substring(0, 500), + }); + } + ); + } + } + window.setTimeout(() => processFoundJS(origin, version), 3000); +}; + +async function downloadJSToZip(downloadType) { + try { + if (downloadType === 'downloadSource') { + const chunks = []; + const delimPrefix = '\n********** new file: '; + const delimSuffix = ' **********\n'; + const enc = new TextEncoder(); + + for (const [fileName, compressedStream] of sourceScripts.entries()) { + try { + const delim = delimPrefix + fileName + delimSuffix; + const encodedDelim = enc.encode(delim); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const delimStream = new window.CompressionStream('gzip'); + const writer = delimStream.writable.getWriter(); + writer.write(encodedDelim); + writer.close(); + const delimBuffer = await new Response( + delimStream.readable + ).arrayBuffer(); + chunks.push(delimBuffer); + + const fileBuffer = await new Response(compressedStream).arrayBuffer(); + chunks.push(fileBuffer); + } catch (err) { + console.error(`Error processing file ${fileName}: `, err); + } + } + + for (const inlineSrcMap of inlineScripts) { + try { + const inlineHash = inlineSrcMap.keys().next().value; + const inlineSrc = inlineSrcMap.values().next().value; + const delim = + delimPrefix + 'Inline Script ' + inlineHash + delimSuffix; + const encodedDelim = enc.encode(delim); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const delimStream = new window.CompressionStream('gzip'); + const delimWriter = delimStream.writable.getWriter(); + delimWriter.write(encodedDelim); + delimWriter.close(); + const delimBuffer = await new Response( + delimStream.readable + ).arrayBuffer(); + chunks.push(delimBuffer); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const inlineStream = new window.CompressionStream('gzip'); + const writer = inlineStream.writable.getWriter(); + writer.write(enc.encode(inlineSrc)); + writer.close(); + const inlineBuffer = await new Response( + inlineStream.readable + ).arrayBuffer(); + chunks.push(inlineBuffer); + } catch (err) { + console.error(`Error processing inline script: `, err); + } + } + + const combinedBuffer = new Blob(chunks, { type: 'application/gzip' }); + + const url = URL.createObjectURL(combinedBuffer); + const link = document.createElement('a'); + link.href = url; + link.download = 'meta_source_files.gz'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + } + } catch (err) { + console.error('Error in downloadJSToZip: ', err); + } +} + +chrome.runtime.onMessage.addListener(function (request) { + if (request.greeting === 'downloadSource' && DOWNLOAD_JS_ENABLED) { + downloadJSToZip(request.greeting); + } else if (request.greeting === 'nocacheHeaderFound') { + updateCurrentState(STATES.INVALID); + } +}); + +function parseFailedJson(queuedJsonToParse) { + try { + JSON.parse(queuedJsonToParse.node.textContent); + } catch (parseError) { + if (queuedJsonToParse.retry > 0) { + queuedJsonToParse.retry--; + setTimeout(() => parseFailedJson(queuedJsonToParse), 20); + } else { + updateCurrentState(STATES.INVALID); + } + } +} + +function isPathnameExcluded(excludedPathnames) { + let pathname = location.pathname; + if (!pathname.endsWith('/')) { + pathname = pathname + '/'; + } + return excludedPathnames.some(rule => { + if (typeof rule === 'string') { + return pathname === rule; + } else { + const match = pathname.match(rule); + return match != null && match[0] === pathname; + } + }); +} + +export function startFor(origin, excludedPathnames = []) { + chrome.runtime + .sendMessage({ + type: MESSAGE_TYPE.CONTENT_SCRIPT_START, + origin, + }) + .then(resp => { + if ( + [ORIGIN_TYPE.FACEBOOK, ORIGIN_TYPE.MESSENGER].includes( + currentOrigin as 'FACEBOOK' | 'MESSENGER' + ) + ) { + checkCSPHeaders(resp.cspHeader, resp.cspReportHeader); + } + }); + if (isPathnameExcluded(excludedPathnames)) { + updateCurrentState(STATES.IGNORE); + return; + } + let isUserLoggedIn = false; + if ([ORIGIN_TYPE.FACEBOOK, ORIGIN_TYPE.MESSENGER].includes(origin)) { + const cookies = document.cookie.split(';'); + cookies.forEach(cookie => { + const pair = cookie.split('='); + // c_user contains the user id of the user logged in + if (pair[0].indexOf('c_user') >= 0) { + isUserLoggedIn = true; + } + }); + } else { + // only doing this check for FB and MSGR + isUserLoggedIn = true; + } + if (isUserLoggedIn) { + updateCurrentState(STATES.PROCESSING); + currentOrigin = origin; + scanForScripts(); + // set the timeout once, in case there's an iframe and contentUtils sets another manifest timer + if (manifestTimeoutID === '') { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + manifestTimeoutID = setTimeout(() => { + // Manifest failed to load, flag a warning to the user. + updateCurrentState(STATES.TIMEOUT); + }, 45000); + } + } +} diff --git a/packages/apps/meta-code-verify/src/js/detectKvstoreMeta.ts b/packages/apps/meta-code-verify/src/js/detectKvstoreMeta.ts new file mode 100644 index 0000000000..8e6e5b0b41 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/detectKvstoreMeta.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { ORIGIN_TYPE } from './config'; +import { startFor } from './contentUtils.js'; + +startFor(ORIGIN_TYPE.KVSTORE); diff --git a/packages/apps/meta-code-verify/src/js/popup.ts b/packages/apps/meta-code-verify/src/js/popup.ts new file mode 100644 index 0000000000..fc57b75d25 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/popup.ts @@ -0,0 +1,355 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { + DOWNLOAD_JS_ENABLED, + MESSAGE_TYPE, + ORIGIN_TYPE, + STATES, + KNOWN_EXTENSION_HASHES_MAP, +} from './config.js'; + +const STATE_TO_POPUP_STATE = { + [STATES.START]: 'loading', + [STATES.PROCESSING]: 'loading', + [STATES.IGNORE]: 'loading', + [STATES.INVALID]: 'error', + [STATES.RISK]: 'warning_risk', + [STATES.VALID]: 'valid', + [STATES.TIMEOUT]: 'warning_timeout', +}; + +const ORIGIN_TO_LEARN_MORE_PAGES = { + [ORIGIN_TYPE.FACEBOOK]: { + about: chrome.i18n.getMessage('about_code_verify_faq_url_fb'), + failure: chrome.i18n.getMessage('validation_failure_faq_url_fb'), + risk: chrome.i18n.getMessage('possible_risk_detected_faq_url_fb'), + timeout: chrome.i18n.getMessage('network_timeout_faq_url_fb'), + }, + [ORIGIN_TYPE.MESSENGER]: { + about: chrome.i18n.getMessage('about_code_verify_faq_url_msgr'), + failure: chrome.i18n.getMessage('validation_failure_faq_url_msgr'), + risk: chrome.i18n.getMessage('possible_risk_detected_faq_url_msgr'), + timeout: chrome.i18n.getMessage('network_timeout_faq_url_msgr'), + }, + [ORIGIN_TYPE.WHATSAPP]: { + about: chrome.i18n.getMessage('about_code_verify_faq_url_wa'), + failure: chrome.i18n.getMessage('validation_failure_faq_url_wa'), + risk: chrome.i18n.getMessage('possible_risk_detected_faq_url_wa'), + timeout: chrome.i18n.getMessage('network_timeout_faq_url_wa'), + }, + [ORIGIN_TYPE.KVSTORE]: { + about: chrome.i18n.getMessage('about_code_verify_faq_url_wa'), + failure: chrome.i18n.getMessage('validation_failure_faq_url_wa'), + risk: chrome.i18n.getMessage('possible_risk_detected_faq_url_wa'), + timeout: chrome.i18n.getMessage('network_timeout_faq_url_wa'), + }, +}; + +// doing this so we can add support for i18n using messages.json +function attachTextToHtml() { + const i18nElements = document.querySelectorAll(`[id^="i18n"]`); + Array.from(i18nElements).forEach(element => { + element.innerHTML = chrome.i18n.getMessage(element.id); + }); +} +function shortenString(str, startLength, endLength) { + return str.substr(0, startLength) + '...' + str.substr(-endLength); +} +async function handleBoth(what, key) { + const { disallow } = await chrome.storage.local.get('disallow'); + const { allowlist } = await chrome.storage.local.get('allowlist'); + const disallowMap = new Map(Object.entries(disallow || {})); + const allowMap = new Map(Object.entries(allowlist || {})); + if (what === 'disallow') { + allowMap.set(key, disallowMap.get(key)); + disallowMap.delete(key); + await chrome.storage.local.set({ + disallow: Object.fromEntries(disallowMap), + }); + await chrome.storage.local.set({ + allowlist: Object.fromEntries(allowMap), + }); + chrome.tabs.query({ active: true, currentWindow: true }, tabs => { + const activeTab = tabs[0]; + chrome.tabs.reload(activeTab.id); + }); + } else { + console.log(disallowMap.entries()); + disallowMap.set(key, allowMap.get(key)); + allowMap.delete(key); + await chrome.storage.local.set({ + disallow: Object.fromEntries(disallowMap), + }); + await chrome.storage.local.set({ + allowlist: Object.fromEntries(allowMap), + }); + chrome.tabs.query({ active: true, currentWindow: true }, tabs => { + const activeTab = tabs[0]; + chrome.tabs.reload(activeTab.id); + }); + } + + await whatTable(); +} +function getExtensionName(extensionId) { + return new Promise((resolve, reject) => { + chrome.management.get(extensionId, extensionInfo => { + if (chrome.runtime.lastError) { + reject(chrome.runtime.lastError.message); + } else { + resolve(extensionInfo.name); + } + }); + }); +} +async function attachTable(data, what) { + // Create the table element + const table = document.createElement('table'); + table.style.border = '1px solid black'; + table.style.borderCollapse = 'collapse'; + + // Create the header row + const headerRow = document.createElement('tr'); + + const headers = ['link/hash', 'src', 'extension name', 'source code', what]; + headers.forEach(headerText => { + const th = document.createElement('th'); + th.style.border = '1px solid black'; + th.style.padding = '5px'; + th.textContent = headerText; + headerRow.appendChild(th); + }); + + table.appendChild(headerRow); + + // Create table rows + for (const key in data) { + const row = document.createElement('tr'); + const { type, src, rawjs } = data[key]; + + // Key cell + const keyCell = document.createElement('td'); + keyCell.style.border = '1px solid black'; + keyCell.style.padding = '5px'; + keyCell.textContent = shortenString(key, 3, 3); + row.appendChild(keyCell); + + // Src cell + const srcCell = document.createElement('td'); + srcCell.style.border = '1px solid black'; + srcCell.style.padding = '5px'; + const regex = /# sourceURL=(.*\.js)\b/; + const result = rawjs ? rawjs.match(regex) : ''; + srcCell.textContent = + type !== 'raw_js' && src ? src : result && result[1] ? result[1] : ''; + row.appendChild(srcCell); + + const extensionCell = document.createElement('td'); + extensionCell.style.border = '1px solid black'; + extensionCell.style.padding = '5px'; + const regex1 = /chrome-extension:\/\/([^/]+)\//; + const result1 = result ? result[1].match(regex1) : ''; + extensionCell.textContent = + result1.length > 1 + ? ((await getExtensionName(result1[1])) as string) + : KNOWN_EXTENSION_HASHES_MAP.has(key) + ? KNOWN_EXTENSION_HASHES_MAP.get(key) + : ''; + row.appendChild(extensionCell); + + // Source code cell + const sourceCodeCell = document.createElement('td'); + sourceCodeCell.style.border = '1px solid black'; + sourceCodeCell.style.padding = '5px'; + const aCell = document.createElement('a'); + const textBlob = new Blob([rawjs ? rawjs : ''], { + type: 'text/plain', + }); + const textUrl = URL.createObjectURL(textBlob); + aCell.href = textUrl; + aCell.textContent = + type.toLowerCase() === 'raw_js' && rawjs ? 'source code' : ''; + aCell.target = '_blank'; + sourceCodeCell.appendChild(aCell); + row.appendChild(sourceCodeCell); + const allowDisallowCell = document.createElement('td'); + allowDisallowCell.style.border = '1px solid black'; + allowDisallowCell.style.padding = '5px'; + const allowACell = document.createElement('a'); + allowACell.href = '#'; + allowACell.textContent = what; + allowACell.addEventListener('click', () => + handleBoth(what === 'allow' ? 'disallow' : 'allow', key) + ); + allowDisallowCell.appendChild(allowACell); + row.appendChild(allowDisallowCell); + table.appendChild(row); + } + + // Add table to the document + const disallowDiv = document.getElementById( + what === 'allow' ? 'disallow' : 'allow' + ); + disallowDiv.innerHTML = ''; + disallowDiv.appendChild(table); +} +async function whatTable() { + const { disallow } = await chrome.storage.local.get('disallow'); + const { allowlist } = await chrome.storage.local.get('allowlist'); + attachTable(disallow, 'allow'); + attachTable(allowlist, 'disallow'); +} +function attachListeners(origin) { + if (!(origin in ORIGIN_TO_LEARN_MORE_PAGES)) { + throw new Error( + `Learn more pages for origin type: ${origin} do not exist!` + ); + } + const learnMoreUrls = ORIGIN_TO_LEARN_MORE_PAGES[origin]; + + const menuButtonList = document.getElementsByClassName('menu'); + Array.from(menuButtonList).forEach(menuButton => { + menuButton.addEventListener('click', () => updateDisplay('menu')); + }); + + const closeMenuButton = document.getElementById('close_menu'); + closeMenuButton.addEventListener('click', () => window.close()); + + const menuRowList = document.getElementsByClassName('menu_row'); + menuRowList[0].addEventListener('click', async _evt => { + whatTable(); + updateDisplay('allowlist'); + }); + (menuRowList[0] as HTMLElement).style.cursor = 'pointer'; + menuRowList[1].addEventListener('click', _evt => { + chrome.tabs.create({ url: learnMoreUrls.about }); + }); + (menuRowList[1] as HTMLElement).style.cursor = 'pointer'; + + const downloadTextList = document.getElementsByClassName( + 'status_message_highlight' + ); + const downloadSrcButton = document.getElementById('i18nDownloadSourceButton'); + + if (DOWNLOAD_JS_ENABLED) { + menuRowList[2].addEventListener('click', () => updateDisplay('download')); + (menuRowList[2] as HTMLElement).style.cursor = 'pointer'; + + downloadTextList[0].addEventListener('click', () => { + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage( + tabs[0].id, + { greeting: 'downloadMove' }, + () => {} + ); + }); + }); + (downloadTextList[0] as HTMLElement).style.cursor = 'pointer'; + + downloadSrcButton.onclick = () => { + chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { + chrome.tabs.sendMessage( + tabs[0].id, + { greeting: 'downloadSource' }, + () => {} + ); + }); + }; + + downloadSrcButton.style.cursor = 'pointer'; + + downloadTextList[0].addEventListener('click', () => + updateDisplay('download') + ); + (downloadTextList[0] as HTMLElement).style.cursor = 'pointer'; + } else { + menuRowList[1].remove(); + downloadTextList[0].remove(); + const downloadMessagePartTwo = document.getElementById( + 'i18nValidationFailureStatusMessagePartTwo' + ); + if (downloadMessagePartTwo != null) { + downloadMessagePartTwo.remove(); + } + downloadSrcButton.remove(); + } + + const learnMoreList = document.getElementsByClassName( + 'anomaly_learn_more_button' + ); + learnMoreList[0].addEventListener('click', () => { + chrome.tabs.create({ url: learnMoreUrls.failure }); + }); + (learnMoreList[0] as HTMLElement).style.cursor = 'pointer'; + + const riskLearnMoreList = document.getElementsByClassName( + 'risk_learn_more_button' + ); + riskLearnMoreList[0].addEventListener('click', () => { + chrome.tabs.create({ url: learnMoreUrls.risk }); + }); + (riskLearnMoreList[0] as HTMLElement).style.cursor = 'pointer'; + + const retryButtonList = document.getElementsByClassName('retry_button'); + Array.from(retryButtonList).forEach(retryButton => { + retryButton.addEventListener('click', () => { + chrome.tabs.reload(); + }); + (retryButton as HTMLElement).style.cursor = 'pointer'; + }); + + const timeoutLearnMoreList = document.getElementsByClassName( + 'timeout_learn_more_button' + ); + timeoutLearnMoreList[0].addEventListener('click', () => { + chrome.tabs.create({ url: learnMoreUrls.timeout }); + }); + (timeoutLearnMoreList[0] as HTMLElement).style.cursor = 'pointer'; +} + +function updateDisplay(state) { + const popupState = STATE_TO_POPUP_STATE[state] || state; + Array.from(document.getElementsByClassName('state_boundary')).forEach( + element => { + if (element.id == popupState) { + (element as HTMLElement).style.display = 'flex'; + document.body.className = popupState + '_body'; + } else { + (element as HTMLElement).style.display = 'none'; + } + } + ); +} + +function setUpBackgroundMessageHandler(tabId) { + if (tabId == null || tabId.trim() === '') { + console.error('[Popup] No tab_id query param', document.location); + return; + } + chrome.runtime.onMessage.addListener(message => { + if (!('type' in message)) { + return; + } + if ( + message.type === MESSAGE_TYPE.STATE_UPDATED && + message.tabId.toString() === tabId + ) { + updateDisplay(message.state); + } + }); +} + +function loadUp() { + const params = new URL(document.location.href).searchParams; + setUpBackgroundMessageHandler(params.get('tab_id')); + updateDisplay(params.get('state')); + attachTextToHtml(); + attachListeners(params.get('origin')); +} + +loadUp(); diff --git a/packages/apps/meta-code-verify/src/js/tab_state_tracker/FrameStateMachine.ts b/packages/apps/meta-code-verify/src/js/tab_state_tracker/FrameStateMachine.ts new file mode 100644 index 0000000000..468e1ffd93 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/tab_state_tracker/FrameStateMachine.ts @@ -0,0 +1,21 @@ +import StateMachine from './StateMachine'; +import TabStateMachine from './TabStateMachine'; + +/** + * Tracks the extension's state for each frame. It'll notify the overall tab's + * state machine of any changes. The tab may or may not choose to apply those + * changes based on the current states of the rest of its frames + * (see TabStateMachine.ts). + */ +export default class FrameStateMachine extends StateMachine { + private _tabStateMachine: TabStateMachine; + + constructor(tabStateMachine: TabStateMachine) { + super(); + this._tabStateMachine = tabStateMachine; + } + + onStateUpdated() { + this._tabStateMachine.updateStateIfValid(this.getState()); + } +} diff --git a/packages/apps/meta-code-verify/src/js/tab_state_tracker/StateMachine.ts b/packages/apps/meta-code-verify/src/js/tab_state_tracker/StateMachine.ts new file mode 100644 index 0000000000..62120c3c85 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/tab_state_tracker/StateMachine.ts @@ -0,0 +1,101 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { State, STATES } from '../config'; + +// Table of possible transitions from one state to another. The entries for +// each transition can be: +// (a) a boolean indicating if the transition to that state is valid +// (b) another state to transition to should a transition to the 'from' state +// is attempted. +const STATE_TRANSITIONS: Partial<{ + [key in State]: Partial<{ [key in State]: boolean | State }>; +}> = { + [STATES.START]: { + [STATES.START]: true, + [STATES.PROCESSING]: true, + [STATES.IGNORE]: true, + }, + [STATES.PROCESSING]: { + [STATES.PROCESSING]: true, + [STATES.INVALID]: true, + [STATES.RISK]: true, + [STATES.VALID]: true, + [STATES.TIMEOUT]: true, + }, + [STATES.IGNORE]: { + [STATES.IGNORE]: true, + [STATES.INVALID]: true, + // Attempting to go from IGNORE to anything other than INVALID is bad and + // should send you to an INVALID state. Either all frames in the tab are + // being checked to some extent, or all should be ignored by the extension. + // Nothing in between. + [STATES.START]: STATES.INVALID, + [STATES.PROCESSING]: STATES.INVALID, + [STATES.RISK]: STATES.INVALID, + [STATES.VALID]: STATES.INVALID, + [STATES.TIMEOUT]: STATES.INVALID, + }, + [STATES.INVALID]: { + [STATES.INVALID]: true, + }, + [STATES.RISK]: { + [STATES.RISK]: true, + }, + [STATES.VALID]: { + [STATES.VALID]: true, + [STATES.PROCESSING]: true, + [STATES.INVALID]: true, + [STATES.IGNORE]: STATES.INVALID, + }, + [STATES.TIMEOUT]: { + [STATES.TIMEOUT]: true, + }, +}; + +/** + * State machine that transitions through the states listed above. This is used + * to track the extension's state of the overall tab, and for individual frames + * within that tab. + */ +export default class StateMachine { + private _state: State; + constructor() { + this._state = STATES.START; + } + + getState() { + return this._state; + } + + updateStateIfValid(newState: State) { + // You messed up. + if (!(newState in STATES)) { + console.error('State', newState, 'does not exist!'); + this._setState(STATES.INVALID); + return; + } + + const skipState = STATE_TRANSITIONS[this._state][newState]; + if (typeof skipState === 'string') { + this.updateStateIfValid(skipState); + return; + } else if (skipState) { + this._setState(newState); + } + } + + _setState(newState: State) { + const oldState = this._state; + this._state = newState; + if (oldState !== newState) { + this.onStateUpdated(); + } + } + + onStateUpdated() {} +} diff --git a/packages/apps/meta-code-verify/src/js/tab_state_tracker/TabStateMachine.ts b/packages/apps/meta-code-verify/src/js/tab_state_tracker/TabStateMachine.ts new file mode 100644 index 0000000000..867cf4f9d2 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/tab_state_tracker/TabStateMachine.ts @@ -0,0 +1,90 @@ +import { + MESSAGE_TYPE, + Origin, + State, + STATES, + STATES_TO_ICONS, +} from '../config'; + +import StateMachine from './StateMachine'; +import FrameStateMachine from './FrameStateMachine'; + +function getChromeV3Action() { + if (self.chrome.runtime.getManifest().manifest_version >= 3) { + return self.chrome.action; + } else { + return { + setIcon: self.chrome.pageAction.setIcon, + enable: self.chrome.pageAction.show, + disable: self.chrome.pageAction.hide, + setPopup: self.chrome.pageAction.setPopup, + }; + } +} + +/** + * Tracks the extension's state based on the states of the individual frames + * in it. + */ +export default class TabStateMachine extends StateMachine { + private _tabId: number; + private _origin: Origin; + private _frameStates: { [key: number]: FrameStateMachine }; + + constructor(tabId: number, origin: Origin) { + super(); + this._tabId = tabId; + this._origin = origin; + this._frameStates = {}; + } + + addFrameStateMachine(frameId: number) { + this._frameStates[frameId] = new FrameStateMachine(this); + } + + updateStateForFrame(frameId: number, newState: State): void { + if (!(frameId in this._frameStates)) { + throw new Error( + `State machine for frame: ${frameId} does not exist for tab: ${this._tabId}` + ); + } + this._frameStates[frameId].updateStateIfValid(newState); + } + + updateStateIfValid(newState: State) { + // Only update the tab's state to VALID if all of it's frames are VALID + if ( + newState === STATES.VALID && + !Object.values(this._frameStates).every( + fsm => fsm.getState() === STATES.VALID + ) + ) { + return; + } + super.updateStateIfValid(newState); + } + + onStateUpdated() { + const state = this.getState(); + const chromeAction = getChromeV3Action(); + chromeAction.setIcon({ + tabId: this._tabId, + path: STATES_TO_ICONS[state], + }); + if (state === STATES.IGNORE || state === STATES.START) { + chromeAction.disable(this._tabId); + } else { + chromeAction.enable(this._tabId); + chromeAction.setPopup({ + tabId: this._tabId, + popup: `popup.html?tab_id=${this._tabId}&state=${state}&origin=${this._origin}`, + }); + // Broadcast state update for relevant popup to update its contents. + chrome.runtime.sendMessage({ + type: MESSAGE_TYPE.STATE_UPDATED, + tabId: this._tabId, + state, + }); + } + } +} diff --git a/packages/apps/meta-code-verify/src/js/tab_state_tracker/tabStateTracker.ts b/packages/apps/meta-code-verify/src/js/tab_state_tracker/tabStateTracker.ts new file mode 100644 index 0000000000..e7594132a2 --- /dev/null +++ b/packages/apps/meta-code-verify/src/js/tab_state_tracker/tabStateTracker.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { Origin, State } from '../config'; +import TabStateMachine from './TabStateMachine'; + +const tabStateTracker = new Map(); +if (typeof chrome !== 'undefined') { + chrome.tabs.onRemoved.addListener((tabId: number, _removeInfo) => { + tabStateTracker.delete(tabId); + }); + chrome.tabs.onReplaced.addListener((_addedTabId, removedTabId: number) => { + tabStateTracker.delete(removedTabId); + }); +} + +function getOrCreateTabStateMachine(tabId: number, origin: Origin) { + if (!tabStateTracker.has(tabId)) { + tabStateTracker.set(tabId, new TabStateMachine(tabId, origin)); + } + return tabStateTracker.get(tabId); +} + +export function recordContentScriptStart( + sender: chrome.runtime.MessageSender, + origin: Origin +) { + // This is a top-level frame initializing + if (sender.frameId === 0) { + tabStateTracker.delete(sender.tab.id); + } + getOrCreateTabStateMachine(sender.tab.id, origin).addFrameStateMachine( + sender.frameId + ); +} + +export function updateContentScriptState( + sender: chrome.runtime.MessageSender, + newState: State, + origin: Origin +) { + getOrCreateTabStateMachine(sender.tab.id, origin).updateStateForFrame( + sender.frameId, + newState + ); +} diff --git a/packages/apps/meta-code-verify/tsconfig.json b/packages/apps/meta-code-verify/tsconfig.json new file mode 100644 index 0000000000..dabba1e8b0 --- /dev/null +++ b/packages/apps/meta-code-verify/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "esModuleInterop": true + } +} \ No newline at end of file diff --git a/packages/apps/meta-code-verify/vitest.config.ts b/packages/apps/meta-code-verify/vitest.config.ts new file mode 100644 index 0000000000..b64dcfbaa9 --- /dev/null +++ b/packages/apps/meta-code-verify/vitest.config.ts @@ -0,0 +1,14 @@ +// vite.config.ts + +import {defineConfig, UserConfigExport} from "vite"; + +export default defineConfig({ + test: { + globals: true, + environment: 'happy-dom', + setupFiles: './vitest.setup.ts', + coverage: { + reporter: ['text', 'json', 'html'], + }, + } , +} as UserConfigExport ) \ No newline at end of file diff --git a/packages/apps/meta-code-verify/vitest.setup.ts b/packages/apps/meta-code-verify/vitest.setup.ts new file mode 100644 index 0000000000..5649d61627 --- /dev/null +++ b/packages/apps/meta-code-verify/vitest.setup.ts @@ -0,0 +1,103 @@ +// vitest.setup.ts + +import { vi } from 'vitest'; + +declare global { + interface Window { + crypto: { + subtle: SubtleCrypto & { + digest: (algorithm: AlgorithmIdentifier, data: BufferSource) => Promise; + }; + getRandomValues: Crypto['getRandomValues']; + randomUUID: Crypto['randomUUID']; + }; + } + + // ... (the rest of the global declarations) +} + +window.chrome = { + browserAction: { + setIcon: vi.fn(), + setPopup: vi.fn(), + } as any, + storage: { + local: { + get: vi.fn(), + set: vi.fn(), + } as any, + } as any, + tabs: { + onRemoved: { + addListener: vi.fn(), + hasListener: vi.fn(), + removeListener: vi.fn(), + addRules: vi.fn(), + getRules: vi.fn(), + removeRules: vi.fn(), + } as any, + onReplaced: { + addListener: vi.fn(), + hasListener: vi.fn(), + removeListener: vi.fn(), + addRules: vi.fn(), + getRules: vi.fn(), + removeRules: vi.fn(), + } as any, + } as any, + webRequest: { + onResponseStarted: { + addListener: vi.fn(), + hasListener: vi.fn(), + removeListener: vi.fn(), + addRules: vi.fn(), + getRules: vi.fn(), + removeRules: vi.fn(), + } as any, + onHeadersReceived: { + addListener: vi.fn(), + hasListener: vi.fn(), + removeListener: vi.fn(), + addRules: vi.fn(), + getRules: vi.fn(), + removeRules: vi.fn(), + } as any, + } as any, + runtime: { + onMessage: { + addListener: vi.fn(), + hasListener: vi.fn(), + removeListener: vi.fn(), + addRules: vi.fn(), + getRules: vi.fn(), + removeRules: vi.fn(), + } as any, + onInstalled: { + addListener: vi.fn(), + hasListener: vi.fn(), + removeListener: vi.fn(), + addRules: vi.fn(), + getRules: vi.fn(), + removeRules: vi.fn(), + } as any, + sendMessage: vi.fn(), + } as any, +} as any; + +globalThis.crypto = { + subtle: { + digest: (algorithm: AlgorithmIdentifier, data: BufferSource) => Promise, + }, + getRandomValues: (array: T): T => { + // Provide an implementation for getRandomValues + return array; // For now, return the input array (you should replace it with the actual implementation) + }, + randomUUID: (): string => { + // Provide an implementation for randomUUID + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = Math.random() * 16 | 0, + v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + }, +} as unknown as Window['crypto']; diff --git a/yarn.lock b/yarn.lock index 2eacc5d92c..666cf09bfe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,6 +34,13 @@ dependencies: tslib "^2.3.1" +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -41,11 +48,44 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== +"@babel/compat-data@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" + integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== + +"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" + integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-compilation-targets" "^7.21.4" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.4" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.4" + "@babel/types" "^7.21.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.20.12", "@babel/core@^7.20.2": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" @@ -86,6 +126,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" + integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== + dependencies: + "@babel/types" "^7.21.4" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -112,6 +162,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" + integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== + dependencies: + "@babel/compat-data" "^7.21.4" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" @@ -290,7 +351,7 @@ "@babel/traverse" "^7.21.0" "@babel/types" "^7.21.0" -"@babel/highlight@^7.18.6": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== @@ -304,6 +365,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== +"@babel/parser@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" + integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -736,7 +802,7 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.19.6": +"@babel/plugin-transform-modules-commonjs@^7.19.6", "@babel/plugin-transform-modules-commonjs@^7.21.2": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== @@ -1084,6 +1150,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" + integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.4" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.4" + "@babel/types" "^7.21.4" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" @@ -1093,6 +1175,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" + integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@bcherny/json-schema-ref-parser@10.0.5-fork": version "10.0.5-fork" resolved "https://registry.yarnpkg.com/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz#9b5e1e7e07964ea61840174098e634edbe8197bc" @@ -1293,6 +1384,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.11.tgz#52c3e6cabc19c5e4c1c0c01cb58f0442338e1c14" integrity sha512-QnK4d/zhVTuV4/pRM4HUjcsbl43POALU2zvBynmrrqZt9LPcLA3x1fTZPBg2RRguBQnJcnU059yKr+bydkntjg== +"@esbuild/android-arm64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.17.tgz#164b054d58551f8856285f386e1a8f45d9ba3a31" + integrity sha512-jaJ5IlmaDLFPNttv0ofcwy/cfeY4bh/n705Tgh+eLObbGtQBK3EPAu+CzL95JVE4nFAliyrnEu0d32Q5foavqg== + "@esbuild/android-arm@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" @@ -1303,6 +1399,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.11.tgz#f3fc768235aecbeb840d0049fdf13cd28592105f" integrity sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw== +"@esbuild/android-arm@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.17.tgz#1b3b5a702a69b88deef342a7a80df4c894e4f065" + integrity sha512-E6VAZwN7diCa3labs0GYvhEPL2M94WLF8A+czO8hfjREXxba8Ng7nM5VxV+9ihNXIY1iQO1XxUU4P7hbqbICxg== + "@esbuild/android-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" @@ -1313,6 +1414,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.11.tgz#443ed47771a7e917e4282469ba350d117473550c" integrity sha512-3PL3HKtsDIXGQcSCKtWD/dy+mgc4p2Tvo2qKgKHj9Yf+eniwFnuoQ0OUhlSfAEpKAFzF9N21Nwgnap6zy3L3MQ== +"@esbuild/android-x64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.17.tgz#6781527e3c4ea4de532b149d18a2167f06783e7f" + integrity sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA== + "@esbuild/darwin-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" @@ -1323,6 +1429,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.11.tgz#0e8c78d94d5759a48521dbfd83189d2ed3499a16" integrity sha512-pJ950bNKgzhkGNO3Z9TeHzIFtEyC2GDQL3wxkMApDEghYx5Qers84UTNc1bAxWbRkuJOgmOha5V0WUeh8G+YGw== +"@esbuild/darwin-arm64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.17.tgz#c5961ef4d3c1cc80dafe905cc145b5a71d2ac196" + integrity sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ== + "@esbuild/darwin-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" @@ -1333,6 +1444,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.11.tgz#2405cfdf70eb961c7cf973463ca7263dc2004c88" integrity sha512-iB0dQkIHXyczK3BZtzw1tqegf0F0Ab5texX2TvMQjiJIWXAfM4FQl7D909YfXWnB92OQz4ivBYQ2RlxBJrMJOw== +"@esbuild/darwin-x64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.17.tgz#b81f3259cc349691f67ae30f7b333a53899b3c20" + integrity sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg== + "@esbuild/freebsd-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" @@ -1343,6 +1459,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.11.tgz#d5138e873e15f87bd4564c024dfa00ef37e623fd" integrity sha512-7EFzUADmI1jCHeDRGKgbnF5sDIceZsQGapoO6dmw7r/ZBEKX7CCDnIz8m9yEclzr7mFsd+DyasHzpjfJnmBB1Q== +"@esbuild/freebsd-arm64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.17.tgz#db846ad16cf916fd3acdda79b85ea867cb100e87" + integrity sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA== + "@esbuild/freebsd-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" @@ -1353,6 +1474,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.11.tgz#e850b58b8fabf8e9ef0e125af3c25229ad2d6c38" integrity sha512-iPgenptC8i8pdvkHQvXJFzc1eVMR7W2lBPrTE6GbhR54sLcF42mk3zBOjKPOodezzuAz/KSu8CPyFSjcBMkE9g== +"@esbuild/freebsd-x64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.17.tgz#4dd99acbaaba00949d509e7c144b1b6ef9e1815b" + integrity sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw== + "@esbuild/linux-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" @@ -1363,6 +1489,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.11.tgz#2bfb93d0809ec2357c12ebb27736b750c9ae0aa5" integrity sha512-Qxth3gsWWGKz2/qG2d5DsW/57SeA2AmpSMhdg9TSB5Svn2KDob3qxfQSkdnWjSd42kqoxIPy3EJFs+6w1+6Qjg== +"@esbuild/linux-arm64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.17.tgz#7f9274140b2bb9f4230dbbfdf5dc2761215e30f6" + integrity sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw== + "@esbuild/linux-arm@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" @@ -1373,6 +1504,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.11.tgz#e56fb3b76828317a704f4a167c5bd790fe5314e7" integrity sha512-M9iK/d4lgZH0U5M1R2p2gqhPV/7JPJcRz+8O8GBKVgqndTzydQ7B2XGDbxtbvFkvIs53uXTobOhv+RyaqhUiMg== +"@esbuild/linux-arm@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.17.tgz#5c8e44c2af056bb2147cf9ad13840220bcb8948b" + integrity sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg== + "@esbuild/linux-ia32@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" @@ -1383,6 +1519,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.11.tgz#59fa1c49b271793d14eb5effc757e8c0d0cb2cab" integrity sha512-dB1nGaVWtUlb/rRDHmuDQhfqazWE0LMro/AIbT2lWM3CDMHJNpLckH+gCddQyhhcLac2OYw69ikUMO34JLt3wA== +"@esbuild/linux-ia32@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.17.tgz#18a6b3798658be7f46e9873fa0c8d4bec54c9212" + integrity sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q== + "@esbuild/linux-loong64@0.14.54": version "0.14.54" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" @@ -1398,6 +1539,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.11.tgz#89575bc189099c03a36daa54f3f481780c7fd502" integrity sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g== +"@esbuild/linux-loong64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.17.tgz#a8d93514a47f7b4232716c9f02aeb630bae24c40" + integrity sha512-WVMBtcDpATjaGfWfp6u9dANIqmU9r37SY8wgAivuKmgKHE+bWSuv0qXEFt/p3qXQYxJIGXQQv6hHcm7iWhWjiw== + "@esbuild/linux-mips64el@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" @@ -1408,6 +1554,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.11.tgz#0e18ca039dc7e4645efd8edc1b10952933eb6b1b" integrity sha512-cGeGNdQxqY8qJwlYH1BP6rjIIiEcrM05H7k3tR7WxOLmD1ZxRMd6/QIOWMb8mD2s2YJFNRuNQ+wjMhgEL2oCEw== +"@esbuild/linux-mips64el@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.17.tgz#4784efb1c3f0eac8133695fa89253d558149ee1b" + integrity sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A== + "@esbuild/linux-ppc64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" @@ -1418,6 +1569,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.11.tgz#2d152cb3a253afb8c100a165ad132dc96f36cb11" integrity sha512-BdlziJQPW/bNe0E8eYsHB40mYOluS+jULPCjlWiHzDgr+ZBRXPtgMV1nkLEGdpjrwgmtkZHEGEPaKdS/8faLDA== +"@esbuild/linux-ppc64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.17.tgz#ef6558ec5e5dd9dc16886343e0ccdb0699d70d3c" + integrity sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ== + "@esbuild/linux-riscv64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" @@ -1428,6 +1584,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.11.tgz#c6ac494a81221d53d65b33e665c7df1747952d3c" integrity sha512-MDLwQbtF+83oJCI1Cixn68Et/ME6gelmhssPebC40RdJaect+IM+l7o/CuG0ZlDs6tZTEIoxUe53H3GmMn8oMA== +"@esbuild/linux-riscv64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.17.tgz#13a87fdbcb462c46809c9d16bcf79817ecf9ce6f" + integrity sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA== + "@esbuild/linux-s390x@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" @@ -1438,6 +1599,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.11.tgz#4bad33894bc7415cea4be8fa90fe456226a424ad" integrity sha512-4N5EMESvws0Ozr2J94VoUD8HIRi7X0uvUv4c0wpTHZyZY9qpaaN7THjosdiW56irQ4qnJ6Lsc+i+5zGWnyqWqQ== +"@esbuild/linux-s390x@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.17.tgz#83cb16d1d3ac0dca803b3f031ba3dc13f1ec7ade" + integrity sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ== + "@esbuild/linux-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" @@ -1448,6 +1614,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.11.tgz#903fda743459f530a16a6c6ee8d2c0f6c1a12fc7" integrity sha512-rM/v8UlluxpytFSmVdbCe1yyKQd/e+FmIJE2oPJvbBo+D0XVWi1y/NQ4iTNx+436WmDHQBjVLrbnAQLQ6U7wlw== +"@esbuild/linux-x64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.17.tgz#7bc400568690b688e20a0c94b2faabdd89ae1a79" + integrity sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg== + "@esbuild/netbsd-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" @@ -1458,6 +1629,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.11.tgz#b589239fe7d9b16ee03c5e191f3f5b640f1518a1" integrity sha512-4WaAhuz5f91h3/g43VBGdto1Q+X7VEZfpcWGtOFXnggEuLvjV+cP6DyLRU15IjiU9fKLLk41OoJfBFN5DhPvag== +"@esbuild/netbsd-x64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.17.tgz#1b5dcfbc4bfba80e67a11e9148de836af5b58b6c" + integrity sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA== + "@esbuild/openbsd-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" @@ -1468,6 +1644,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.11.tgz#b355019754116bef39ec688f8fd2fe6471b9779b" integrity sha512-UBj135Nx4FpnvtE+C8TWGp98oUgBcmNmdYgl5ToKc0mBHxVVqVE7FUS5/ELMImOp205qDAittL6Ezhasc2Ev/w== +"@esbuild/openbsd-x64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.17.tgz#e275098902291149a5dcd012c9ea0796d6b7adff" + integrity sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA== + "@esbuild/sunos-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" @@ -1478,6 +1659,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.11.tgz#2ea47fb592e68406e5025a7696dc714fc6a115dc" integrity sha512-1/gxTifDC9aXbV2xOfCbOceh5AlIidUrPsMpivgzo8P8zUtczlq1ncFpeN1ZyQJ9lVs2hILy1PG5KPp+w8QPPg== +"@esbuild/sunos-x64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.17.tgz#10603474866f64986c0370a2d4fe5a2bb7fee4f5" + integrity sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q== + "@esbuild/win32-arm64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" @@ -1488,6 +1674,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.11.tgz#47e6fdab17c4c52e6e0d606dd9cb843b29826325" integrity sha512-vtSfyx5yRdpiOW9yp6Ax0zyNOv9HjOAw8WaZg3dF5djEHKKm3UnoohftVvIJtRh0Ec7Hso0RIdTqZvPXJ7FdvQ== +"@esbuild/win32-arm64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.17.tgz#521a6d97ee0f96b7c435930353cc4e93078f0b54" + integrity sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q== + "@esbuild/win32-ia32@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" @@ -1498,6 +1689,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.11.tgz#a97273aa3164c8d8f501899f55cc75a4a79599a3" integrity sha512-GFPSLEGQr4wHFTiIUJQrnJKZhZjjq4Sphf+mM76nQR6WkQn73vm7IsacmBRPkALfpOCHsopSvLgqdd4iUW2mYw== +"@esbuild/win32-ia32@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.17.tgz#56f88462ebe82dad829dc2303175c0e0ccd8e38e" + integrity sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ== + "@esbuild/win32-x64@0.16.17": version "0.16.17" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" @@ -1508,6 +1704,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.11.tgz#9be796d93ae27b636da32d960899a4912bca27a1" integrity sha512-N9vXqLP3eRL8BqSy8yn4Y98cZI2pZ8fyuHx6lKjiG2WABpT2l01TXdzq5Ma2ZUBzfB7tx5dXVhge8X9u0S70ZQ== +"@esbuild/win32-x64@0.17.17": + version "0.17.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.17.tgz#2b577b976e6844106715bbe0cdc57cd1528063f9" + integrity sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg== + "@eslint-community/eslint-utils@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz#a831e6e468b4b2b5ae42bf658bea015bf10bc518" @@ -1520,6 +1721,21 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403" integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + "@eslint/eslintrc@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d" @@ -1535,11 +1751,31 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.2.tgz#01575e38707add677cf73ca1589abba8da899a02" + integrity sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.1" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + "@eslint/js@8.36.0": version "8.36.0" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe" integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== +"@eslint/js@8.38.0": + version "8.38.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.38.0.tgz#73a8a0d8aa8a8e6fe270431c5e72ae91b5337892" + integrity sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g== + "@ethereumjs/common@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" @@ -2231,12 +2467,21 @@ debug "^4.1.1" minimatch "^3.0.5" +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": +"@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -2289,6 +2534,18 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + "@jest/console@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" @@ -2301,6 +2558,40 @@ jest-util "^29.5.0" slash "^3.0.0" +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + "@jest/core@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" @@ -2335,6 +2626,16 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + "@jest/environment@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" @@ -2360,6 +2661,18 @@ expect "^29.5.0" jest-snapshot "^29.5.0" +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + "@jest/fake-timers@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" @@ -2372,6 +2685,15 @@ jest-mock "^29.5.0" jest-util "^29.5.0" +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + "@jest/globals@^29.3.1", "@jest/globals@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" @@ -2382,6 +2704,37 @@ "@jest/types" "^29.5.0" jest-mock "^29.5.0" +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + "@jest/reporters@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" @@ -2419,6 +2772,15 @@ dependencies: "@sinclair/typebox" "^0.25.16" +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + "@jest/source-map@^29.4.3": version "29.4.3" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" @@ -2428,6 +2790,16 @@ callsites "^3.0.0" graceful-fs "^4.2.9" +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-result@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" @@ -2438,6 +2810,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + "@jest/test-sequencer@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" @@ -2448,6 +2830,27 @@ jest-haste-map "^29.5.0" slash "^3.0.0" +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + "@jest/transform@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" @@ -2469,6 +2872,17 @@ slash "^3.0.0" write-file-atomic "^4.0.2" +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@jest/types@^29.5.0": version "29.5.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" @@ -3215,6 +3629,26 @@ resolved "https://registry.yarnpkg.com/@rescript/std/-/std-9.0.0.tgz#df53f3fa5911cb4e85bd66b92e9e58ddf3e4a7e1" integrity sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ== +"@rollup/plugin-commonjs@^24.0.1": + version "24.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz#79e54bd83bb64396761431eee6c44152ef322100" + integrity sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.27.0" + +"@rollup/plugin-eslint@^9.0.3": + version "9.0.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-eslint/-/plugin-eslint-9.0.3.tgz#f5e8c22d557bef02570e4f1770fb085568ea4b37" + integrity sha512-iV2m9BhPdsjQzmRVe3Nzovrjxbdq5Slva8bvUSzbM4gSBUaGXAFnFXcHcvO4N4tSuirZoY61mkn8KtV3G6o0iQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + eslint "^8.24.0" + "@rollup/plugin-inject@^5.0.3": version "5.0.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz#0783711efd93a9547d52971db73b2fb6140a67b1" @@ -3224,6 +3658,34 @@ estree-walker "^2.0.2" magic-string "^0.27.0" +"@rollup/plugin-node-resolve@^15.0.1": + version "15.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.2.tgz#8183a80c2cbf7b471f5ac86b16747997f3b5d185" + integrity sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/plugin-replace@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz#45f53501b16311feded2485e98419acb8448c61d" + integrity sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA== + dependencies: + "@rollup/pluginutils" "^5.0.1" + magic-string "^0.27.0" + +"@rollup/plugin-typescript@^11.0.0": + version "11.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.0.tgz#4dd2a98475a791200d3e4dd1b8234073ad96c535" + integrity sha512-86flrfE+bSHB69znnTV6kVjkncs2LBMhcTCyxWgRxLyfXfQrxg4UwlAqENnjrrxnSNS/XKCDJCl8EkdFJVHOxw== + dependencies: + "@rollup/pluginutils" "^5.0.1" + resolve "^1.22.1" + "@rollup/pluginutils@^5.0.1": version "5.0.2" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" @@ -3374,6 +3836,13 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== +"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0", "@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + "@sinonjs/commons@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" @@ -3381,6 +3850,13 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + "@sinonjs/fake-timers@^10.0.2": version "10.0.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" @@ -3388,6 +3864,44 @@ dependencies: "@sinonjs/commons" "^2.0.0" +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/formatio@^3.2.1": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" + integrity sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" + +"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" + integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== + dependencies: + "@sinonjs/commons" "^1.3.0" + array-from "^2.1.1" + lodash "^4.17.15" + +"@sinonjs/samsam@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" + integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== + dependencies: + "@sinonjs/commons" "^2.0.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== + "@skaleproject/pow-ethers@^0.2.4": version "0.2.4" resolved "https://registry.yarnpkg.com/@skaleproject/pow-ethers/-/pow-ethers-0.2.4.tgz#8fcdd7ee4d2e389916804d7c6d077511f086a77d" @@ -3721,6 +4235,11 @@ resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.4.3.tgz#af975e367743fa91989cd666666aec31a8f50591" integrity sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q== +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -3771,7 +4290,7 @@ resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== -"@types/babel__core@^7.1.14": +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.20.0" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== @@ -3797,7 +4316,7 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": version "7.18.3" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== @@ -3855,6 +4374,14 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== +"@types/chrome@^0.0.213": + version "0.0.213" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.213.tgz#f1e421f76ce7986d2886bafc6c359575e599471e" + integrity sha512-oDF+AGr2gcHzxX5xq8TjmLtnMnV3nL1ci4Y6CjhDqIKI8Ar36JOWnmQx6eGVBBYEX824OIN0NQwDo2cevEBbQQ== + dependencies: + "@types/filesystem" "*" + "@types/har-format" "*" + "@types/concat-stream@^1.6.0": version "1.6.1" resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" @@ -3876,6 +4403,11 @@ dependencies: "@types/node" "*" +"@types/crypto-js@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" + integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== + "@types/d3-array@^3.0.3": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz#44eebe40be57476cad6a0cd6a85b0f57d54185a2" @@ -3927,6 +4459,11 @@ resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.0.tgz#e2505f1c21ec08bda8915238e397fb71d2fc54ce" integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== +"@types/estree@*": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + "@types/estree@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" @@ -3951,6 +4488,18 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/filesystem@*": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf" + integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ== + dependencies: + "@types/filewriter" "*" + +"@types/filewriter@*": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee" + integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== + "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" @@ -3966,13 +4515,26 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/graceful-fs@^4.1.3": +"@types/glob@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + +"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" +"@types/har-format@*": + version "1.2.10" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.10.tgz#7b4e1e0ada4d17684ac3b05d601a4871cfab11fc" + integrity sha512-o0J30wqycjF5miWDKYKKzzOU1ZTLuA42HZ4HE7/zqTOc/jTLdQ5NhYWvsRQo45Nfi1KHoRdNhteSI4BAxTF1Pg== + "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" @@ -4013,6 +4575,14 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/jest@^29.4.0": + version "29.5.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" + integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/jsdom@^20.0.0": version "20.0.1" resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" @@ -4059,7 +4629,7 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/minimatch@*": +"@types/minimatch@*", "@types/minimatch@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== @@ -4185,6 +4755,11 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" @@ -4278,6 +4853,13 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^17.0.8": version "17.0.22" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" @@ -4301,6 +4883,22 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^5.52.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz#c0e10eeb936debe5d1c3433cf36206a95befefd0" + integrity sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.0" + "@typescript-eslint/type-utils" "5.59.0" + "@typescript-eslint/utils" "5.59.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/experimental-utils@^5.0.0": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.54.1.tgz#a45609ce43fc6b24b4c4dde215446eaad7805223" @@ -4318,6 +4916,16 @@ "@typescript-eslint/typescript-estree" "5.54.1" debug "^4.3.4" +"@typescript-eslint/parser@^5.52.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.0.tgz#0ad7cd019346cc5d150363f64869eca10ca9977c" + integrity sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w== + dependencies: + "@typescript-eslint/scope-manager" "5.59.0" + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/typescript-estree" "5.59.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@5.54.1": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" @@ -4326,6 +4934,14 @@ "@typescript-eslint/types" "5.54.1" "@typescript-eslint/visitor-keys" "5.54.1" +"@typescript-eslint/scope-manager@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz#86501d7a17885710b6716a23be2e93fc54a4fe8c" + integrity sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ== + dependencies: + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/visitor-keys" "5.59.0" + "@typescript-eslint/type-utils@5.54.1": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" @@ -4336,11 +4952,26 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" +"@typescript-eslint/type-utils@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz#8e8d1420fc2265989fa3a0d897bde37f3851e8c9" + integrity sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA== + dependencies: + "@typescript-eslint/typescript-estree" "5.59.0" + "@typescript-eslint/utils" "5.59.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== +"@typescript-eslint/types@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.0.tgz#3fcdac7dbf923ec5251545acdd9f1d42d7c4fe32" + integrity sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA== + "@typescript-eslint/typescript-estree@5.54.1": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" @@ -4354,6 +4985,19 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz#8869156ee1dcfc5a95be3ed0e2809969ea28e965" + integrity sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg== + dependencies: + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/visitor-keys" "5.59.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + "@typescript-eslint/utils@5.54.1", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.42.1", "@typescript-eslint/utils@^5.43.0": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" @@ -4368,6 +5012,20 @@ eslint-utils "^3.0.0" semver "^7.3.7" +"@typescript-eslint/utils@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.0.tgz#063d066b3bc4850c18872649ed0da9ee72d833d5" + integrity sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.59.0" + "@typescript-eslint/types" "5.59.0" + "@typescript-eslint/typescript-estree" "5.59.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + "@typescript-eslint/visitor-keys@5.54.1": version "5.54.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" @@ -4376,6 +5034,14 @@ "@typescript-eslint/types" "5.54.1" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz#a59913f2bf0baeb61b5cfcb6135d3926c3854365" + integrity sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA== + dependencies: + "@typescript-eslint/types" "5.59.0" + eslint-visitor-keys "^3.3.0" + "@vitejs/plugin-react@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz#d1091f535eab8b83d6e74034d01e27d73c773240" @@ -4405,6 +5071,15 @@ "@vitest/utils" "0.29.2" chai "^4.3.7" +"@vitest/expect@0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.30.1.tgz#3c92a3fc23a198315ce8cd16689dc2d5aeac40b8" + integrity sha512-c3kbEtN8XXJSeN81iDGq29bUzSjQhjES2WR3aColsS4lPGbivwLtas4DNUe0jD9gg/FYGIteqOenfU95EFituw== + dependencies: + "@vitest/spy" "0.30.1" + "@vitest/utils" "0.30.1" + chai "^4.3.7" + "@vitest/runner@0.28.5": version "0.28.5" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.28.5.tgz#4a18fe0e40b25569763f9f1f64b799d1629b3026" @@ -4423,6 +5098,25 @@ p-limit "^4.0.0" pathe "^1.1.0" +"@vitest/runner@0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.30.1.tgz#534db590091e5d40682f47b9478f64b776073c50" + integrity sha512-W62kT/8i0TF1UBCNMRtRMOBWJKRnNyv9RrjIgdUryEe0wNpGZvvwPDLuzYdxvgSckzjp54DSpv1xUbv4BQ0qVA== + dependencies: + "@vitest/utils" "0.30.1" + concordance "^5.0.4" + p-limit "^4.0.0" + pathe "^1.1.0" + +"@vitest/snapshot@0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-0.30.1.tgz#25e912557b357ecb89d5ee35e8d7c4c7a5ecfe32" + integrity sha512-fJZqKrE99zo27uoZA/azgWyWbFvM1rw2APS05yB0JaLwUIg9aUtvvnBf4q7JWhEcAHmSwbrxKFgyBUga6tq9Tw== + dependencies: + magic-string "^0.30.0" + pathe "^1.1.0" + pretty-format "^27.5.1" + "@vitest/spy@0.28.5": version "0.28.5" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.28.5.tgz#b69affa0786200251b9e5aac5c58bbfb1b3273c9" @@ -4437,6 +5131,13 @@ dependencies: tinyspy "^1.0.2" +"@vitest/spy@0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.30.1.tgz#e3344d4513407afd922963737fb9733a7787a2bf" + integrity sha512-YfJeIf37GvTZe04ZKxzJfnNNuNSmTEGnla2OdL60C8od16f3zOfv9q9K0nNii0NfjDJRt/CVN/POuY5/zTS+BA== + dependencies: + tinyspy "^2.1.0" + "@vitest/utils@0.28.5": version "0.28.5" resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.28.5.tgz#7b82b528df86adfbd4a1f6a3b72c39790e81de0d" @@ -4459,6 +5160,15 @@ picocolors "^1.0.0" pretty-format "^27.5.1" +"@vitest/utils@0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.30.1.tgz#0e5bf8c1b81a6dfa2b70120c2aa092a651440cda" + integrity sha512-/c8Xv2zUVc+rnNt84QF0Y0zkfxnaGhp87K2dYJMLtLOIckPzuxLVzAtFCicGFdB4NeBHNzTRr1tNn7rCtQcWFA== + dependencies: + concordance "^5.0.4" + loupe "^2.3.6" + pretty-format "^27.5.1" + "@wagmi/chains@0.2.13": version "0.2.13" resolved "https://registry.yarnpkg.com/@wagmi/chains/-/chains-0.2.13.tgz#c20979cffb2fbb14c013f06fa140fffa53b65d68" @@ -4986,7 +5696,7 @@ JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.6: +abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== @@ -5044,6 +5754,14 @@ accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + acorn-globals@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" @@ -5052,17 +5770,27 @@ acorn-globals@^7.0.0: acorn "^8.1.0" acorn-walk "^8.0.2" -acorn-jsx@^5.3.2: +acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + acorn-walk@^8.0.2, acorn-walk@^8.1.1, acorn-walk@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.1.0, acorn@^8.4.1, acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2: +acorn@^7.1.1, acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.1.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -5128,7 +5856,7 @@ ajv@8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.11.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -5313,11 +6041,21 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== +array-flat-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz#1e3a4255be619dfbffbfd1d635c1cf357cd034e7" + integrity sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg== + array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" @@ -5593,6 +6331,20 @@ axobject-query@^3.1.1: dependencies: deep-equal "^2.0.5" +babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-jest@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" @@ -5617,6 +6369,16 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + babel-plugin-jest-hoist@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" @@ -5683,6 +6445,14 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + babel-preset-jest@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" @@ -5761,7 +6531,7 @@ bigint-mod-arith@^3.1.0: resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== -bignumber.js@^9.0.0, bignumber.js@^9.1.0: +bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.1.0: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== @@ -5885,6 +6655,11 @@ bluebird@^3.5.0: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +blueimp-md5@^2.10.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== + bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" @@ -5936,6 +6711,11 @@ body-parser@^1.16.0, body-parser@^1.20.0: type-is "~1.6.18" unpipe "1.0.0" +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + borc@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" @@ -6014,6 +6794,11 @@ browser-or-node@^1.3.0: resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-1.3.0.tgz#f2a4e8568f60263050a6714b2cc236bb976647a7" integrity sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg== +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + browser-readablestream-to-it@^1.0.0, browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.2, browser-readablestream-to-it@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" @@ -6160,6 +6945,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-reverse@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-reverse/-/buffer-reverse-1.0.1.tgz#49283c8efa6f901bc01fa3304d06027971ae2f60" + integrity sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg== + buffer-to-arraybuffer@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" @@ -6210,6 +7000,11 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -6393,7 +7188,7 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -6416,6 +7211,31 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.3: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + chokidar@3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" @@ -6778,6 +7598,11 @@ commander@^9.4.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + compare-versions@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-5.0.3.tgz#a9b34fea217472650ef4a2651d905f42c28ebfd7" @@ -6825,6 +7650,20 @@ concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@~1.6.2: inherits "^2.0.3" readable-stream "^3.0.2" +concordance@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/concordance/-/concordance-5.0.4.tgz#9896073261adced72f88d60e4d56f8efc4bbbbd2" + integrity sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw== + dependencies: + date-time "^3.1.0" + esutils "^2.0.3" + fast-diff "^1.2.0" + js-string-escape "^1.0.1" + lodash "^4.17.15" + md5-hex "^3.0.1" + semver "^7.3.2" + well-known-symbols "^2.0.0" + concurrently@^7.5.0: version "7.6.0" resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.6.0.tgz#531a6f5f30cf616f355a4afb8f8fcb2bba65a49a" @@ -6881,7 +7720,7 @@ content-type@~1.0.4, content-type@~1.0.5: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== @@ -6959,6 +7798,17 @@ cosmiconfig@8.0.0: parse-json "^5.0.0" path-type "^4.0.0" +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -7049,21 +7899,52 @@ crypto-browserify@^3.11.0, crypto-browserify@^3.12.0: randombytes "^2.0.0" randomfill "^1.0.3" +crypto-js@^3.1.9-1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== + +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + crypto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + css-unit-converter@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + cssom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" @@ -7182,6 +8063,15 @@ data-uri-to-buffer@^3.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + data-urls@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" @@ -7201,6 +8091,13 @@ date-fns@^2.29.1: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== +date-time@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e" + integrity sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg== + dependencies: + time-zone "^1.0.0" + dateformat@^4.6.3: version "4.6.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" @@ -7223,7 +8120,7 @@ debug@2.6.9, debug@^2.2.0: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -7267,7 +8164,7 @@ decimal.js-light@^2.4.1: resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== -decimal.js@^10.4.2: +decimal.js@^10.2.1, decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== @@ -7432,6 +8329,11 @@ detect-port@^1.3.0: address "^1.0.1" debug "4" +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + diff-sequences@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" @@ -7442,6 +8344,11 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -7547,6 +8454,15 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -7557,6 +8473,18 @@ domain-browser@^4.22.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.22.0.tgz#6ddd34220ec281f9a65d3386d267ddd35c491f9f" integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw== +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + domexception@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" @@ -7564,6 +8492,22 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + dotenv-cli@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/dotenv-cli/-/dotenv-cli-6.0.0.tgz#8a30cbc59d0a8aaa166b2fee0a9a55e23a1223ab" @@ -7675,6 +8619,11 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -7722,13 +8671,18 @@ enhanced-resolve@^5.10.0, enhanced-resolve@^5.12.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@2.3.6, enquirer@^2.3.0, enquirer@^2.3.6: +enquirer@2.3.6, enquirer@^2.3.0, enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + entities@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" @@ -8007,7 +8961,7 @@ esbuild-windows-arm64@0.14.54: resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== -esbuild@^0.14.54: +esbuild@^0.14.27, esbuild@^0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== @@ -8062,6 +9016,34 @@ esbuild@^0.16.14: "@esbuild/win32-ia32" "0.16.17" "@esbuild/win32-x64" "0.16.17" +esbuild@^0.17.5: + version "0.17.17" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.17.tgz#fa906ab11b11d2ed4700f494f4f764229b25c916" + integrity sha512-/jUywtAymR8jR4qsa2RujlAF7Krpt5VWi72Q2yuLD4e/hvtNcFQ0I1j8m/bxq238pf3/0KO5yuXNpuLx8BE1KA== + optionalDependencies: + "@esbuild/android-arm" "0.17.17" + "@esbuild/android-arm64" "0.17.17" + "@esbuild/android-x64" "0.17.17" + "@esbuild/darwin-arm64" "0.17.17" + "@esbuild/darwin-x64" "0.17.17" + "@esbuild/freebsd-arm64" "0.17.17" + "@esbuild/freebsd-x64" "0.17.17" + "@esbuild/linux-arm" "0.17.17" + "@esbuild/linux-arm64" "0.17.17" + "@esbuild/linux-ia32" "0.17.17" + "@esbuild/linux-loong64" "0.17.17" + "@esbuild/linux-mips64el" "0.17.17" + "@esbuild/linux-ppc64" "0.17.17" + "@esbuild/linux-riscv64" "0.17.17" + "@esbuild/linux-s390x" "0.17.17" + "@esbuild/linux-x64" "0.17.17" + "@esbuild/netbsd-x64" "0.17.17" + "@esbuild/openbsd-x64" "0.17.17" + "@esbuild/sunos-x64" "0.17.17" + "@esbuild/win32-arm64" "0.17.17" + "@esbuild/win32-ia32" "0.17.17" + "@esbuild/win32-x64" "0.17.17" + esbuild@~0.17.6: version "0.17.11" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.11.tgz#9f3122643b21d7e7731e42f18576c10bfa28152b" @@ -8327,6 +9309,13 @@ eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-utils@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" @@ -8334,6 +9323,11 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" @@ -8344,6 +9338,103 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-visitor-keys@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +eslint@^8.24.0: + version "8.38.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.38.0.tgz#a62c6f36e548a5574dd35728ac3c6209bd1e2f1a" + integrity sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.2" + "@eslint/js" "8.38.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.4.0" + espree "^9.5.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + eslint@^8.27.0: version "8.36.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.36.0.tgz#1bd72202200a5492f91803b113fb8a83b11285cf" @@ -8390,6 +9481,15 @@ eslint@^8.27.0: strip-json-comments "^3.1.0" text-table "^0.2.0" +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + espree@^9.5.0: version "9.5.0" resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113" @@ -8399,6 +9499,15 @@ espree@^9.5.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" +espree@^9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.1.tgz#4f26a4d5f18905bf4f2e0bd99002aab807e96dd4" + integrity sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.0" + esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -8409,7 +9518,7 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: +esquery@^1.4.0, esquery@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== @@ -8443,7 +9552,7 @@ estree-walker@^2.0.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== -esutils@^2.0.2: +esutils@^2.0.2, esutils@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== @@ -8761,6 +9870,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + expect@^29.0.0, expect@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" @@ -8876,7 +9995,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-diff@^1.1.2: +fast-diff@^1.1.2, fast-diff@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== @@ -9174,6 +10293,15 @@ form-data@^2.2.0: combined-stream "^1.0.6" mime-types "^2.1.12" +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -9503,7 +10631,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -9515,7 +10643,7 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.0: +glob@^8.0.0, glob@^8.0.3: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -9555,7 +10683,7 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0: +globals@^13.19.0, globals@^13.6.0, globals@^13.9.0: version "13.20.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== @@ -10043,6 +11171,13 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -10055,6 +11190,16 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +htmlparser2@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + http-basic@^8.1.1: version "8.1.3" resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" @@ -10086,6 +11231,15 @@ http-https@^1.0.0: resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" @@ -10212,6 +11366,11 @@ ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + ignore@^5.1.1, ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -10237,7 +11396,7 @@ immutable@^4.0.0-rc.12: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -10653,6 +11812,13 @@ is-buffer@^2.0.3, is-buffer@^2.0.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -10772,6 +11938,11 @@ is-map@^2.0.1, is-map@^2.0.2: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + is-nan@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" @@ -10837,6 +12008,13 @@ is-pull-stream@0.0.0: resolved "https://registry.yarnpkg.com/is-pull-stream/-/is-pull-stream-0.0.0.tgz#a3bc3d1c6d3055151c46bde6f399efed21440ca9" integrity sha512-NWLwqCc95I6m8FZDYLAmVJc9Xgk8O+8pPOoDKFTC293FH4S7FBcbLCw3WWPCdiT8uUSdzPy47VM08WPDMJJrag== +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -11172,6 +12350,15 @@ jayson@^3.4.4: uuid "^8.3.2" ws "^7.4.5" +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + jest-changed-files@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" @@ -11180,6 +12367,31 @@ jest-changed-files@^29.5.0: execa "^5.0.0" p-limit "^3.1.0" +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + jest-circus@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" @@ -11206,6 +12418,24 @@ jest-circus@^29.5.0: slash "^3.0.0" stack-utils "^2.0.3" +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + jest-cli@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" @@ -11224,6 +12454,36 @@ jest-cli@^29.5.0: prompts "^2.0.1" yargs "^17.3.1" +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + jest-config@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" @@ -11252,6 +12512,16 @@ jest-config@^29.5.0: slash "^3.0.0" strip-json-comments "^3.1.1" +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + jest-diff@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" @@ -11262,6 +12532,13 @@ jest-diff@^29.5.0: jest-get-type "^29.4.3" pretty-format "^29.5.0" +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + jest-docblock@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" @@ -11269,6 +12546,17 @@ jest-docblock@^29.4.3: dependencies: detect-newline "^3.0.0" +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + jest-each@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" @@ -11280,6 +12568,19 @@ jest-each@^29.5.0: jest-util "^29.5.0" pretty-format "^29.5.0" +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + jest-environment-jsdom@^29.3.1: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" @@ -11294,6 +12595,18 @@ jest-environment-jsdom@^29.3.1: jest-util "^29.5.0" jsdom "^20.0.0" +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jest-environment-node@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" @@ -11306,11 +12619,36 @@ jest-environment-node@^29.5.0: jest-mock "^29.5.0" jest-util "^29.5.0" +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + jest-get-type@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + jest-haste-map@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" @@ -11330,6 +12668,37 @@ jest-haste-map@^29.5.0: optionalDependencies: fsevents "^2.3.2" +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + jest-leak-detector@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" @@ -11338,6 +12707,16 @@ jest-leak-detector@^29.5.0: jest-get-type "^29.4.3" pretty-format "^29.5.0" +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + jest-matcher-utils@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" @@ -11348,6 +12727,21 @@ jest-matcher-utils@^29.5.0: jest-get-type "^29.4.3" pretty-format "^29.5.0" +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-message-util@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" @@ -11363,6 +12757,14 @@ jest-message-util@^29.5.0: slash "^3.0.0" stack-utils "^2.0.3" +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" @@ -11377,11 +12779,25 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + jest-regex-util@^29.4.3: version "29.4.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + jest-resolve-dependencies@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" @@ -11390,6 +12806,22 @@ jest-resolve-dependencies@^29.5.0: jest-regex-util "^29.4.3" jest-snapshot "^29.5.0" +jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + jest-resolve@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" @@ -11405,6 +12837,33 @@ jest-resolve@^29.5.0: resolve.exports "^2.0.0" slash "^3.0.0" +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + jest-runner@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" @@ -11432,6 +12891,34 @@ jest-runner@^29.5.0: p-limit "^3.1.0" source-map-support "0.5.13" +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-runtime@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" @@ -11460,6 +12947,42 @@ jest-runtime@^29.5.0: slash "^3.0.0" strip-bom "^4.0.0" +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + jest-snapshot@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" @@ -11489,6 +13012,18 @@ jest-snapshot@^29.5.0: pretty-format "^29.5.0" semver "^7.3.5" +jest-util@^27.0.0, jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-util@^29.0.0, jest-util@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" @@ -11501,6 +13036,18 @@ jest-util@^29.0.0, jest-util@^29.5.0: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + jest-validate@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" @@ -11513,6 +13060,19 @@ jest-validate@^29.5.0: leven "^3.1.0" pretty-format "^29.5.0" +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + jest-watcher@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" @@ -11527,6 +13087,15 @@ jest-watcher@^29.5.0: jest-util "^29.5.0" string-length "^4.0.1" +jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest-worker@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" @@ -11537,6 +13106,15 @@ jest-worker@^29.5.0: merge-stream "^2.0.0" supports-color "^8.0.0" +jest@^27.1.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + jest@^29.3.1: version "29.5.0" resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" @@ -11577,6 +13155,11 @@ js-sha3@0.8.0, js-sha3@^0.8.0, js-sha3@~0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-string-escape@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" + integrity sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -11610,6 +13193,39 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + jsdom@^20.0.0: version "20.0.3" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" @@ -11764,6 +13380,11 @@ json-text-sequence@~0.1.0: dependencies: delimit-stream "0.1.0" +json5@2.x, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -11771,11 +13392,6 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" @@ -11809,6 +13425,11 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsonpath-plus@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-4.0.0.tgz#954b69faa3d8b07f30ae2f9e601176a4b0d2806e" + integrity sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A== + jsonschema@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" @@ -11842,6 +13463,11 @@ jszip@^3.10.1: readable-stream "~2.3.6" setimmediate "^1.0.5" +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== + just-kebab-case@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/just-kebab-case/-/just-kebab-case-1.1.0.tgz#ebe854fde84b0afa4e597fcd870b12eb3c026755" @@ -12084,7 +13710,7 @@ lit@2.6.1: lit-element "^3.2.0" lit-html "^2.6.0" -local-pkg@^0.4.2: +local-pkg@^0.4.2, local-pkg@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== @@ -12121,6 +13747,21 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + lodash.isequal@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -12211,7 +13852,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.16.3, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -12253,6 +13894,18 @@ logform@^2.3.2, logform@^2.4.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" +lolex@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" + integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== + +lolex@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A== + dependencies: + "@sinonjs/commons" "^1.7.0" + long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -12344,6 +13997,13 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +magic-string@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" + integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -12363,6 +14023,13 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -12397,6 +14064,13 @@ mcl-wasm@^0.7.1: resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== +md5-hex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-3.0.1.tgz#be3741b510591434b2784d79e556eefc2c9a8e5c" + integrity sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw== + dependencies: + blueimp-md5 "^2.10.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -12411,6 +14085,14 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +mem@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.1.tgz#ea110c2ebc079eca3022e6b08c85a795e77f6318" + integrity sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.0.0" + memoizee@^0.4.15: version "0.4.15" resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.15.tgz#e6f3d2da863f318d02225391829a6c5956555b72" @@ -12479,6 +14161,17 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +merkletreejs@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.3.9.tgz#cdb364a3b974a44f4eff3446522d7066e0cf95de" + integrity sha512-NjlATjJr4NEn9s8v/VEHhgwRWaE1eA/Une07d9SEqKzULJi1Wsh0Y3svwJdP2bYLMmgSBHzOrNydMWM1NN9VeQ== + dependencies: + bignumber.js "^9.0.1" + buffer-reverse "^1.0.1" + crypto-js "^3.1.9-1" + treeify "^1.1.0" + web3-utils "^1.3.4" + meros@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/meros/-/meros-1.2.1.tgz#056f7a76e8571d0aaf3c7afcbe7eb6407ff7329e" @@ -12539,6 +14232,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + mimic-fn@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" @@ -12700,7 +14398,7 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mlly@^1.1.0, mlly@^1.1.1: +mlly@^1.1.0, mlly@^1.1.1, mlly@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.2.0.tgz#f0f6c2fc8d2d12ea6907cd869066689b5031b613" integrity sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww== @@ -12999,6 +14697,11 @@ nanoid@^3.0.2, nanoid@^3.1.20, nanoid@^3.1.23, nanoid@^3.3.4: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + napi-macros@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" @@ -13067,6 +14770,28 @@ nft.storage@^7.0.0: streaming-iterables "^6.0.0" throttled-queue "^2.1.2" +nise@^1.5.2: + version "1.5.3" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" + integrity sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ== + dependencies: + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^5.0.1" + path-to-regexp "^1.7.0" + +nise@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.4.tgz#491ce7e7307d4ec546f5a659b2efe94a18b4bbc0" + integrity sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers" "^10.0.2" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -13217,6 +14942,13 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -13230,6 +14962,11 @@ numeral@^2.0.6: resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506" integrity sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== +nwsapi@^2.2.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" + integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== + nwsapi@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" @@ -13472,6 +15209,11 @@ p-cancelable@^3.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + p-defer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" @@ -13607,6 +15349,19 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parse5@^7.0.0, parse5@^7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" @@ -13674,6 +15429,13 @@ path-to-regexp@2.2.1: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -13910,6 +15672,15 @@ postcss-value-parser@^3.3.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== +postcss@^8.4.13: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^8.4.21: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" @@ -13950,7 +15721,7 @@ prettier-plugin-solidity@^1.0.0-beta.24: semver "^7.3.8" solidity-comments-extractor "^0.0.7" -prettier@1.19.1: +prettier@1.19.1, prettier@^1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== @@ -13960,6 +15731,11 @@ prettier@^2.3.1, prettier@^2.6.2, prettier@^2.7.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== +prettier@^2.3.2: + version "2.8.7" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" + integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== + pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" @@ -13998,6 +15774,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-nodeify@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/promise-nodeify/-/promise-nodeify-3.0.1.tgz#f0f5d9720ee9ec71dd2bfa92667be504c10229c2" @@ -14188,9 +15969,9 @@ pvutils@^1.1.3: integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== qrcode@1.5.1, qrcode@^1.5.0, qrcode@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" - integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== + version "1.5.3" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170" + integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg== dependencies: dijkstrajs "^1.0.1" encode-utf8 "^1.0.3" @@ -14677,7 +16458,7 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.2.0: +regexpp@^3.1.0, regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -14834,6 +16615,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + resolve.exports@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.1.tgz#cee884cd4e3f355660e501fa3276b27d7ffe5a20" @@ -14860,6 +16646,15 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.0: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" @@ -14943,6 +16738,20 @@ rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" +"rollup@>=2.59.0 <2.78.0": + version "2.77.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" + integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== + optionalDependencies: + fsevents "~2.3.2" + +rollup@^2.38.5, rollup@^2.56.3: + version "2.79.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + rollup@^3.10.0: version "3.19.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.19.1.tgz#2b3a31ac1ff9f3afab2e523fa687fef5b0ee20fc" @@ -14950,6 +16759,13 @@ rollup@^3.10.0: optionalDependencies: fsevents "~2.3.2" +rollup@^3.20.2: + version "3.20.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.6.tgz#53c0fd73e397269d2ce5f0ec12851457dd53cacd" + integrity sha512-2yEB3nQXp/tBQDN0hJScJQheXdvU2wFhh6ld7K/aiZ1vYcak6N/BKjY1QrU6BvO2JWYS8bEs14FRaxXosxy2zw== + optionalDependencies: + fsevents "~2.3.2" + rpc-websockets@^7.5.1: version "7.5.1" resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.5.1.tgz#e0a05d525a97e7efc31a0617f093a13a2e10c401" @@ -15074,6 +16890,13 @@ sax@>=0.6.0: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -15170,6 +16993,13 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1, semver@^7.3.2: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -15362,6 +17192,40 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +sinon-chrome@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sinon-chrome/-/sinon-chrome-3.0.1.tgz#9fb14c230fa0959cb280f9f589e9eda8ccfda1d9" + integrity sha512-NTEFhyuiWEMnRmIqldUiA2DhKn2EqnZxyEk5Ez5rBXj+Nl54aJ0MEmF4wjltrxecxd8zlNLxyE0HyLabev9JsQ== + dependencies: + lodash "^4.16.3" + sinon "^7.2.3" + urijs "^1.18.2" + +sinon@^15.0.4: + version "15.0.4" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-15.0.4.tgz#bcca6fef19b14feccc96473f0d7adc81e0bc5268" + integrity sha512-uzmfN6zx3GQaria1kwgWGeKiXSSbShBbue6Dcj0SI8fiCNFbiUDqKl57WFlY5lyhxZVUKmXvzgG2pilRQCBwWg== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers" "^10.0.2" + "@sinonjs/samsam" "^8.0.0" + diff "^5.1.0" + nise "^5.1.4" + supports-color "^7.2.0" + +sinon@^7.2.3: + version "7.5.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" + integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== + dependencies: + "@sinonjs/commons" "^1.4.0" + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/samsam" "^3.3.3" + diff "^3.5.0" + lolex "^4.2.0" + nise "^1.5.2" + supports-color "^5.5.0" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -15481,7 +17345,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.13, source-map-support@^0.5.20, source-map-support@^0.5.21: +source-map-support@^0.5.13, source-map-support@^0.5.20, source-map-support@^0.5.21, source-map-support@^0.5.6: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -15499,6 +17363,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" @@ -15618,7 +17487,7 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -std-env@^3.3.1: +std-env@^3.3.1, std-env@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.2.tgz#af27343b001616015534292178327b202b9ee955" integrity sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA== @@ -15875,7 +17744,7 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-literal@^1.0.0: +strip-literal@^1.0.0, strip-literal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2" integrity sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== @@ -15919,20 +17788,28 @@ supports-color@^3.1.0: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -15999,7 +17876,7 @@ table-layout@^1.0.2: typical "^5.2.0" wordwrapjs "^4.0.0" -table@^6.8.0: +table@^6.0.9, table@^6.8.0: version "6.8.1" resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== @@ -16089,6 +17966,14 @@ tenderly@^0.4.0: prompts "^2.4.2" tslog "^4.4.0" +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -16158,6 +18043,11 @@ thread-stream@^2.0.0: dependencies: real-require "^0.2.0" +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== + throttled-queue@^2.1.2: version "2.1.4" resolved "https://registry.yarnpkg.com/throttled-queue/-/throttled-queue-2.1.4.tgz#4e2008c73ab3f72ba1bb09496c3cc9c5b745dbee" @@ -16176,6 +18066,11 @@ through2@^3.0.0, through2@^3.0.1: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +time-zone@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" + integrity sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA== + timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -16217,7 +18112,7 @@ tiny-lru@^10.0.0: resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-10.0.1.tgz#aaf5d22207e641ed1b176ac2e616d6cc2fc9ef66" integrity sha512-Vst+6kEsWvb17Zpz14sRJV/f8bUWKhqm6Dc+v08iShmIJ/WxqWytHzCTd6m88pS33rE2zpX34TRmOpAJPloNCA== -tinybench@^2.3.1: +tinybench@^2.3.1, tinybench@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.4.0.tgz#83f60d9e5545353610fe7993bd783120bc20c7a7" integrity sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg== @@ -16227,11 +18122,21 @@ tinypool@^0.3.0, tinypool@^0.3.1: resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.3.1.tgz#a99c2e446aba9be05d3e1cb756d6aed7af4723b6" integrity sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ== +tinypool@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.4.0.tgz#3cf3ebd066717f9f837e8d7d31af3c127fdb5446" + integrity sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA== + tinyspy@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-1.1.1.tgz#0cb91d5157892af38cb2d217f5c7e8507a5bf092" integrity sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g== +tinyspy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.1.0.tgz#bd6875098f988728e6456cfd5ab8cc06498ecdeb" + integrity sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ== + tmp-promise@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.2.tgz#6e933782abff8b00c3119d63589ca1fb9caaa62a" @@ -16293,7 +18198,7 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^4.1.2: +tough-cookie@^4.0.0, tough-cookie@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== @@ -16303,6 +18208,13 @@ tough-cookie@^4.1.2: universalify "^0.2.0" url-parse "^1.5.3" +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + tr46@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" @@ -16320,6 +18232,11 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -16346,6 +18263,20 @@ ts-essentials@^7.0.1: resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== +ts-jest@^27.1.0: + version "27.1.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" + integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + ts-jest@^29.0.3: version "29.0.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" @@ -16468,7 +18399,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -16563,7 +18494,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^4.5.5, typescript@^4.9.3: +typescript@^4.5.5, typescript@^4.9.3, typescript@^4.9.5: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -16700,6 +18631,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urijs@^1.18.2: + version "1.19.11" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== + url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -16817,6 +18753,20 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + v8-to-istanbul@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" @@ -16917,6 +18867,42 @@ vite-node@0.29.2: picocolors "^1.0.0" vite "^3.0.0 || ^4.0.0" +vite-node@0.30.1: + version "0.30.1" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.30.1.tgz#ab0ed1553019c7d81ac95529c57ab8ac9e82347d" + integrity sha512-vTikpU/J7e6LU/8iM3dzBo8ZhEiKZEKRznEMm+mJh95XhWaPrJQraT/QsT2NWmuEf+zgAoMe64PKT7hfZ1Njmg== + dependencies: + cac "^6.7.14" + debug "^4.3.4" + mlly "^1.2.0" + pathe "^1.1.0" + picocolors "^1.0.0" + vite "^3.0.0 || ^4.0.0" + +vite-plugin-chrome-extension@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/vite-plugin-chrome-extension/-/vite-plugin-chrome-extension-0.0.7.tgz#d6bceddcf5914c921fce8052f2d8e3024e3023b5" + integrity sha512-AoNcYg04MFpytR5/1NTsgPYDPHGXC0v/3EbCzbdDTNKAK+V5SmAY5ZRmANRXyfsnyb73NFoKrmqW4THjT93l2Q== + dependencies: + ajv "^6.11.0" + array-flat-polyfill "^1.0.1" + chalk "^4.1.1" + cheerio "^1.0.0-rc.3" + convert-source-map "^1.7.0" + cosmiconfig "^6.0.0" + fs-extra "^8.1.0" + glob "^7.1.6" + jsonpath-plus "^4.0.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.get "^4.4.2" + mem "^6.0.1" + prettier "^1.19.1" + rollup "^2.38.5" + slash "^3.0.0" + vite "^2.2.0" + webextension-polyfill "^0.6.0" + vite-plugin-node-polyfills@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.7.0.tgz#004f400cfae791338c6f0a46d4ddf559c331c899" @@ -16925,6 +18911,18 @@ vite-plugin-node-polyfills@^0.7.0: "@rollup/plugin-inject" "^5.0.3" node-stdlib-browser "^1.2.0" +vite@^2.2.0: + version "2.9.15" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.15.tgz#2858dd5b2be26aa394a283e62324281892546f0b" + integrity sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ== + dependencies: + esbuild "^0.14.27" + postcss "^8.4.13" + resolve "^1.22.0" + rollup ">=2.59.0 <2.78.0" + optionalDependencies: + fsevents "~2.3.2" + "vite@^3.0.0 || ^4.0.0", vite@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" @@ -16937,6 +18935,17 @@ vite-plugin-node-polyfills@^0.7.0: optionalDependencies: fsevents "~2.3.2" +vite@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.0.tgz#1fb9432e1980cf254e1ae1b7b8981fd262c6aa49" + integrity sha512-JTGFgDh3dVxeGBpuQX04Up+JZmuG6wu9414Ei36vQzaEruY/M4K0AgwtuB2b4HaBgB7R8l+LHxjB0jcgz4d2qQ== + dependencies: + esbuild "^0.17.5" + postcss "^8.4.21" + rollup "^3.20.2" + optionalDependencies: + fsevents "~2.3.2" + vitest@^0.25.8: version "0.25.8" resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.25.8.tgz#9b57e0b41cd6f2d2d92aa94a39b35c36f715f8cc" @@ -17017,11 +19026,57 @@ vitest@^0.29.2: vite-node "0.29.2" why-is-node-running "^2.2.2" +vitest@^0.30.1: + version "0.30.1" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.30.1.tgz#351d4a2f27aa8cc0245e3583e3ed45e30efc71d6" + integrity sha512-y35WTrSTlTxfMLttgQk4rHcaDkbHQwDP++SNwPb+7H8yb13Q3cu2EixrtHzF27iZ8v0XCciSsLg00RkPAzB/aA== + dependencies: + "@types/chai" "^4.3.4" + "@types/chai-subset" "^1.3.3" + "@types/node" "*" + "@vitest/expect" "0.30.1" + "@vitest/runner" "0.30.1" + "@vitest/snapshot" "0.30.1" + "@vitest/spy" "0.30.1" + "@vitest/utils" "0.30.1" + acorn "^8.8.2" + acorn-walk "^8.2.0" + cac "^6.7.14" + chai "^4.3.7" + concordance "^5.0.4" + debug "^4.3.4" + local-pkg "^0.4.3" + magic-string "^0.30.0" + pathe "^1.1.0" + picocolors "^1.0.0" + source-map "^0.6.1" + std-env "^3.3.2" + strip-literal "^1.0.1" + tinybench "^2.4.0" + tinypool "^0.4.0" + vite "^3.0.0 || ^4.0.0" + vite-node "0.30.1" + why-is-node-running "^2.2.2" + vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" @@ -17046,7 +19101,7 @@ wagmi@^0.12.2: abitype "^0.3.0" use-sync-external-store "^1.2.0" -walker@^1.0.8: +walker@^1.0.7, walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -17321,6 +19376,19 @@ web3-utils@1.8.2, web3-utils@^1.3.6: randombytes "^2.1.0" utf8 "3.0.0" +web3-utils@^1.3.4: + version "1.9.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.9.0.tgz#7c5775a47586cefb4ad488831be8f6627be9283d" + integrity sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + web3@^1.8.0, web3@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.2.tgz#95a4e5398fd0f01325264bf8e5e8cdc69a7afe86" @@ -17345,11 +19413,26 @@ webcrypto-core@^1.7.4: pvtsutils "^1.3.2" tslib "^2.4.0" +webextension-polyfill@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.6.0.tgz#1afd925f3274a0d4848083579b9c0b649a5c6763" + integrity sha512-PlYwiX8e4bNZrEeBFxbFFsLtm0SMPxJliLTGdNCA0Bq2XkWrAn2ejUd+89vZm+8BnfFB1BclJyCz3iKsm2atNg== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -17367,6 +19450,18 @@ websocket@^1.0.32: utf-8-validate "^5.0.2" yaeti "^0.0.6" +well-known-symbols@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/well-known-symbols/-/well-known-symbols-2.0.0.tgz#e9c7c07dbd132b7b84212c8174391ec1f9871ba5" + integrity sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + whatwg-encoding@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" @@ -17374,6 +19469,11 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + whatwg-mimetype@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" @@ -17395,6 +19495,15 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -17548,6 +19657,16 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" @@ -17620,6 +19739,11 @@ xhr@^2.0.4, xhr@^2.3.3: parse-headers "^2.0.0" xtend "^4.0.0" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" @@ -17703,7 +19827,7 @@ yaml@1.9.2: dependencies: "@babel/runtime" "^7.9.2" -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== @@ -17718,6 +19842,11 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -17726,11 +19855,6 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.0.0, yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -17746,7 +19870,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: +yargs@16.2.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==