From e789c36d89f7d01bcac1eda86ec0bcabac37123b Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Mon, 26 Jun 2023 16:42:28 +0200 Subject: [PATCH 01/13] Rewrite vault encryption function using argon2 - add required packages - configure webpack to work with webAssembly - add neccessary config to `content_security_policy` to allow webAssembly --- background/package.json | 3 ++ .../services/internal-signer/encryption.ts | 31 ++++++++++++++++++- manifest/manifest.development.json | 2 +- manifest/manifest.json | 2 +- webpack.config.ts | 8 +++++ yarn.lock | 15 +++++++++ 6 files changed, 58 insertions(+), 3 deletions(-) diff --git a/background/package.json b/background/package.json index 57f8f0d378..a37bdda3d4 100644 --- a/background/package.json +++ b/background/package.json @@ -49,7 +49,9 @@ "@walletconnect/utils": "^2.1.4", "ajv": "^8.6.2", "ajv-formats": "^2.1.0", + "argon2-browser": "^1.18.0", "assert": "^2.0.0", + "base64-loader": "^1.0.0", "bnc-sdk": "^3.4.1", "dayjs": "^1.10.7", "dexie": "^3.0.3", @@ -64,6 +66,7 @@ }, "devDependencies": { "@reduxjs/toolkit": "^1.6.1", + "@types/argon2-browser": "^1.18.1", "@types/sinon": "^10.0.12", "@types/uuid": "^8.3.4", "@types/webextension-polyfill": "^0.8.0", diff --git a/background/services/internal-signer/encryption.ts b/background/services/internal-signer/encryption.ts index cc004e979c..0f149414c2 100644 --- a/background/services/internal-signer/encryption.ts +++ b/background/services/internal-signer/encryption.ts @@ -1,3 +1,4 @@ +import argon2 from "argon2-browser" /** * An encrypted vault which can be safely serialized and stored. */ @@ -64,7 +65,7 @@ function requireCryptoGlobal(message?: string) { * material using AES GCM mode, as well as the salt required to derive * the key again later. */ -export async function deriveSymmetricKeyFromPassword( +export async function depricatedDeriveSymmetricKeyFromPassword( password: string, existingSalt?: string ): Promise { @@ -101,6 +102,34 @@ export async function deriveSymmetricKeyFromPassword( } } +export async function deriveSymmetricKeyFromPassword( + password: string, + existingSalt?: string +): Promise { + const { crypto } = global + + const salt = existingSalt || (await generateSalt()) + + // Argon2 returns hash which is 24 bytes long, we need 16 bytes for AES-GCM + const { hash } = await argon2.hash({ + pass: password, + salt, + }) + + const key = await crypto.subtle.importKey( + "raw", + hash.slice(0, 16), + { name: "AES-GCM", length: 256 }, + false, + ["encrypt", "decrypt"] + ) + + return { + key, + salt, + } +} + /** * Encrypt a JSON-serializable object with a supplied password using AES GCM * mode. diff --git a/manifest/manifest.development.json b/manifest/manifest.development.json index 61874e5372..6754d5a6d2 100644 --- a/manifest/manifest.development.json +++ b/manifest/manifest.development.json @@ -1,5 +1,5 @@ { - "content_security_policy": "object-src 'self'; script-src 'self' http://localhost:*;", + "content_security_policy": "object-src 'self'; script-src 'self' 'wasm-eval' http://localhost:*;", "background": { "scripts": ["dev-utils/extension-reload.js"] } diff --git a/manifest/manifest.json b/manifest/manifest.json index 1fa68b3d00..b7ef899526 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -5,7 +5,7 @@ "homepage_url": "https://taho.xyz", "author": "https://taho.xyz", "manifest_version": 2, - "content_security_policy": "object-src 'self'; script-src 'self';", + "content_security_policy": "object-src 'self'; script-src 'self' 'wasm-eval';", "web_accessible_resources": ["*.js", "*.json"], "content_scripts": [ { diff --git a/webpack.config.ts b/webpack.config.ts index ce88f20786..d9b8512b5f 100644 --- a/webpack.config.ts +++ b/webpack.config.ts @@ -31,7 +31,13 @@ const baseConfig: Configuration = { "provider-bridge": "./src/provider-bridge.ts", }, module: { + noParse: /\.wasm$/, rules: [ + { + test: /\.wasm$/, + loader: "base64-loader", + type: "javascript/auto", + }, { test: /\.(tsx|ts|jsx)?$/, exclude: /node_modules(?!\/@tallyho)|webpack/, @@ -53,6 +59,8 @@ const baseConfig: Configuration = { resolve: { extensions: [".tsx", ".ts", ".js", ".jsx"], fallback: { + fs: false, + path: false, stream: require.resolve("stream-browserify"), process: require.resolve("process/browser"), // these are required for @tallyho/keyring-controller diff --git a/yarn.lock b/yarn.lock index 0c78fbef38..2e9f26854b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3396,6 +3396,11 @@ dependencies: "@types/glob" "*" +"@types/argon2-browser@^1.18.1": + version "1.18.1" + resolved "https://registry.yarnpkg.com/@types/argon2-browser/-/argon2-browser-1.18.1.tgz#39bc2bf2fbe86d4854005730ace3b8015758adfb" + integrity sha512-PZffP/CqH9m2kovDSRQMfMMxUC3V98I7i7/caa0RB0/nvsXzYbL9bKyqZpNMFmLFGZslROlG1R60ONt7abrwlA== + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" @@ -4908,6 +4913,11 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +argon2-browser@^1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/argon2-browser/-/argon2-browser-1.18.0.tgz#f35820211e0a431aed7f82b9348477234be69bec" + integrity sha512-ImVAGIItnFnvET1exhsQB7apRztcoC5TnlSqernMJDUjbc/DLq3UEYeXFrLPrlaIl8cVfwnXb6wX2KpFf2zxHw== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -5286,6 +5296,11 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base64-loader@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64-loader/-/base64-loader-1.0.0.tgz#e530bad88e906dd2a1fad0af2d9e683fa8bd92a8" + integrity sha512-p32+F8dg+ANGx7s8QsZS74ZPHfIycmC2yZcoerzFgbersIYWitPbbF39G6SBx3gyvzyLH5nt1ooocxr0IHuWKA== + base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" From 2884bf839354482055839384260928140f07e87c Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Tue, 27 Jun 2023 12:28:02 +0200 Subject: [PATCH 02/13] Specify argon hash length Let's set length to 32 bytes to match length expected by AES-GCM --- background/services/internal-signer/encryption.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/background/services/internal-signer/encryption.ts b/background/services/internal-signer/encryption.ts index 0f149414c2..bd3535425f 100644 --- a/background/services/internal-signer/encryption.ts +++ b/background/services/internal-signer/encryption.ts @@ -65,7 +65,7 @@ function requireCryptoGlobal(message?: string) { * material using AES GCM mode, as well as the salt required to derive * the key again later. */ -export async function depricatedDeriveSymmetricKeyFromPassword( +export async function deprecatedDerivePbkdf2KeyFromPassword( password: string, existingSalt?: string ): Promise { @@ -110,15 +110,15 @@ export async function deriveSymmetricKeyFromPassword( const salt = existingSalt || (await generateSalt()) - // Argon2 returns hash which is 24 bytes long, we need 16 bytes for AES-GCM const { hash } = await argon2.hash({ pass: password, salt, + hashLen: 32, }) const key = await crypto.subtle.importKey( "raw", - hash.slice(0, 16), + hash, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"] From ccf69a8404586030ab2462b5a681024c2897fe89 Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Tue, 27 Jun 2023 14:25:57 +0200 Subject: [PATCH 03/13] Add migration strategy for vaults encrypted with PBKDF2 --- background/services/internal-signer/index.ts | 15 ++++- .../services/internal-signer/storage.ts | 64 +++++++++++++++++-- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/background/services/internal-signer/index.ts b/background/services/internal-signer/index.ts index 29c931b51c..5df416717d 100644 --- a/background/services/internal-signer/index.ts +++ b/background/services/internal-signer/index.ts @@ -6,7 +6,12 @@ import { arrayify } from "ethers/lib/utils" import { Wallet } from "ethers" import { normalizeEVMAddress, sameEVMAddress } from "../../lib/utils" import { ServiceCreatorFunction, ServiceLifecycleEvents } from "../types" -import { getEncryptedVaults, writeLatestEncryptedVault } from "./storage" +import { + VaultVersion, + getEncryptedVaults, + migrateVaultsToArgon, + writeLatestEncryptedVault, +} from "./storage" import { decryptVault, deriveSymmetricKeyFromPassword, @@ -251,7 +256,13 @@ export default class InternalSignerService extends BaseService { } if (!ignoreExistingVaults) { - const { vaults } = await getEncryptedVaults() + const encryptedVaultsData = await getEncryptedVaults() + let { vaults } = encryptedVaultsData + + if (encryptedVaultsData.version === VaultVersion.PBKDF2) { + vaults = await migrateVaultsToArgon(password) + } + const currentEncryptedVault = vaults.slice(-1)[0]?.vault if (currentEncryptedVault) { // attempt to load the vault diff --git a/background/services/internal-signer/storage.ts b/background/services/internal-signer/storage.ts index 2158d00471..25f4518371 100644 --- a/background/services/internal-signer/storage.ts +++ b/background/services/internal-signer/storage.ts @@ -1,15 +1,26 @@ import browser from "webextension-polyfill" -import { EncryptedVault } from "./encryption" +import { + EncryptedVault, + decryptVault, + deprecatedDerivePbkdf2KeyFromPassword, + deriveSymmetricKeyFromPassword, + encryptVault, +} from "./encryption" import { UNIXTime } from "../../types" -type SerializedEncryptedVault = { +export enum VaultVersion { + PBKDF2 = 1, + Argon2 = 2, +} + +export type SerializedEncryptedVault = { timeSaved: UNIXTime vault: EncryptedVault } type SerializedEncryptedVaults = { - version: 1 + version: VaultVersion vaults: SerializedEncryptedVault[] } @@ -22,15 +33,16 @@ export async function getEncryptedVaults(): Promise { const data = await browser.storage.local.get("tallyVaults") if (!("tallyVaults" in data)) { return { - version: 1, + version: VaultVersion.Argon2, vaults: [], } } const { tallyVaults } = data if ( "version" in tallyVaults && - tallyVaults.version === 1 && "vaults" in tallyVaults && + (tallyVaults.version === VaultVersion.PBKDF2 || + tallyVaults.version === VaultVersion.Argon2) && Array.isArray(tallyVaults.vaults) ) { return tallyVaults as SerializedEncryptedVaults @@ -86,3 +98,45 @@ export async function writeLatestEncryptedVault( }) } } + +export async function migrateVaultsToArgon( + password: string +): Promise { + const serializedVaults = await getEncryptedVaults() + if (serializedVaults.version === VaultVersion.Argon2) { + return serializedVaults.vaults + } + const { vaults } = serializedVaults + + const newVaults = await Promise.all( + vaults.map(async ({ vault, timeSaved }) => { + const deprecatedSaltedKey = await deprecatedDerivePbkdf2KeyFromPassword( + password, + vault.salt + ) + const newSaltedKey = await deriveSymmetricKeyFromPassword( + password, + vault.salt + ) + const oldDecryptedVault = await decryptVault(vault, deprecatedSaltedKey) + const newEncryptedVault = await encryptVault( + oldDecryptedVault, + newSaltedKey + ) + + return { + timeSaved, + vault: newEncryptedVault, + } + }) + ) + + await browser.storage.local.set({ + tallyVaults: { + version: VaultVersion.Argon2, + vaults: newVaults, + }, + }) + + return newVaults +} From 7de1fbf3fac10a087c5e5048ffa0e262e4578670 Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Tue, 27 Jun 2023 14:54:30 +0200 Subject: [PATCH 04/13] Rename `old..` to `deprecated...` --- background/services/internal-signer/storage.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/background/services/internal-signer/storage.ts b/background/services/internal-signer/storage.ts index 25f4518371..3030e8f012 100644 --- a/background/services/internal-signer/storage.ts +++ b/background/services/internal-signer/storage.ts @@ -118,9 +118,13 @@ export async function migrateVaultsToArgon( password, vault.salt ) - const oldDecryptedVault = await decryptVault(vault, deprecatedSaltedKey) + + const deprecatedDecryptedVault = await decryptVault( + vault, + deprecatedSaltedKey + ) const newEncryptedVault = await encryptVault( - oldDecryptedVault, + deprecatedDecryptedVault, newSaltedKey ) From 9fb21451910cf77a373039e4a76d34f163e0fb51 Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Tue, 27 Jun 2023 16:04:53 +0200 Subject: [PATCH 05/13] Handle errors on vaults migration Catch erros if vaults migration to Argon2 fails and allow to continue with old vaults encrypted with PBKDF2. Log analytics event when vaults are succesfully migrated. --- background/lib/posthog.ts | 1 + background/main.ts | 6 ++ .../services/internal-signer/encryption.ts | 45 ++++++++-- background/services/internal-signer/index.ts | 38 +++++---- .../services/internal-signer/storage.ts | 82 ++++++++++--------- .../tests/encryption.unit.test.ts | 55 +++++++++++-- 6 files changed, 155 insertions(+), 72 deletions(-) diff --git a/background/lib/posthog.ts b/background/lib/posthog.ts index 0730521af5..08d9caefe1 100644 --- a/background/lib/posthog.ts +++ b/background/lib/posthog.ts @@ -18,6 +18,7 @@ export enum OneTimeAnalyticsEvent { ONBOARDING_STARTED = "Onboarding Started", ONBOARDING_FINISHED = "Onboarding Finished", CHAIN_ADDED = "Chain Added", + ARGON_MIGRATION = "Vaults migrated to Argon2", } export const isOneTimeAnalyticsEvent = ( diff --git a/background/main.ts b/background/main.ts index 762ad1ce32..4a6f994185 100644 --- a/background/main.ts +++ b/background/main.ts @@ -1151,6 +1151,12 @@ export default class Main extends BaseService { } }) + this.internalSignerService.emitter.on("migratedToArgon2", async () => { + this.analyticsService.sendOneTimeAnalyticsEvent( + OneTimeAnalyticsEvent.ARGON_MIGRATION + ) + }) + internalSignerSliceEmitter.on("createPassword", async (password) => { await this.internalSignerService.unlock(password, true) }) diff --git a/background/services/internal-signer/encryption.ts b/background/services/internal-signer/encryption.ts index bd3535425f..1acc2ee815 100644 --- a/background/services/internal-signer/encryption.ts +++ b/background/services/internal-signer/encryption.ts @@ -11,6 +11,11 @@ export type EncryptedVault = { cipherText: string } +export enum VaultVersion { + PBKDF2 = 1, + Argon2 = 2, +} + /* * A key with a salt that can be combined with a password to re-derive the key. * @@ -102,7 +107,7 @@ export async function deprecatedDerivePbkdf2KeyFromPassword( } } -export async function deriveSymmetricKeyFromPassword( +export async function deriveArgon2KeyFromPassword( password: string, existingSalt?: string ): Promise { @@ -130,6 +135,20 @@ export async function deriveSymmetricKeyFromPassword( } } +export async function deriveSymmetricKeyFromPassword( + version: VaultVersion, + password: string, + existingSalt?: string +): Promise { + switch (version) { + case VaultVersion.PBKDF2: + return deprecatedDerivePbkdf2KeyFromPassword(password, existingSalt) + case VaultVersion.Argon2: + return deriveArgon2KeyFromPassword(password, existingSalt) + default: + throw new Error(`Unsupported vault version: ${version}`) + } +} /** * Encrypt a JSON-serializable object with a supplied password using AES GCM * mode. @@ -140,16 +159,18 @@ export async function deriveSymmetricKeyFromPassword( * @returns the ciphertext and all non-password material required for later * decryption, including the salt and AES initialization vector. */ -export async function encryptVault( - vault: V, +export async function encryptVault(vaultData: { + vault: V passwordOrSaltedKey: string | SaltedKey -): Promise { + version: VaultVersion +}): Promise { requireCryptoGlobal("Encrypting a vault") const { crypto } = global + const { vault, passwordOrSaltedKey, version } = vaultData const { key, salt } = typeof passwordOrSaltedKey === "string" - ? await deriveSymmetricKeyFromPassword(passwordOrSaltedKey) + ? await deriveSymmetricKeyFromPassword(version, passwordOrSaltedKey) : passwordOrSaltedKey const encoder = new TextEncoder() @@ -188,10 +209,12 @@ export async function encryptVault( * most objects `decryptVault(encryptVault(o, password), password)` * should deeply equal `o`. */ -export async function decryptVault( - vault: EncryptedVault, +export async function decryptVault(vaultData: { + vault: EncryptedVault passwordOrSaltedKey: string | SaltedKey -): Promise { + version: VaultVersion +}): Promise { + const { vault, passwordOrSaltedKey } = vaultData requireCryptoGlobal("Decrypting a vault") const { crypto } = global @@ -199,7 +222,11 @@ export async function decryptVault( const { key } = typeof passwordOrSaltedKey === "string" - ? await deriveSymmetricKeyFromPassword(passwordOrSaltedKey, salt) + ? await deriveSymmetricKeyFromPassword( + vaultData.version, + passwordOrSaltedKey, + salt + ) : passwordOrSaltedKey const plaintext = await crypto.subtle.decrypt( diff --git a/background/services/internal-signer/index.ts b/background/services/internal-signer/index.ts index 6f1a91f3a9..abdde9811f 100644 --- a/background/services/internal-signer/index.ts +++ b/background/services/internal-signer/index.ts @@ -7,7 +7,6 @@ import { Wallet } from "ethers" import { normalizeEVMAddress, sameEVMAddress } from "../../lib/utils" import { ServiceCreatorFunction, ServiceLifecycleEvents } from "../types" import { - VaultVersion, getEncryptedVaults, migrateVaultsToArgon, writeLatestEncryptedVault, @@ -17,6 +16,7 @@ import { deriveSymmetricKeyFromPassword, encryptVault, SaltedKey, + VaultVersion, } from "./encryption" import { HexString, EIP712TypedData, UNIXTime } from "../../types" import { SignedTransaction, TransactionRequestWithNonce } from "../../networks" @@ -126,6 +126,7 @@ interface Events extends ServiceLifecycleEvents { // TODO message was signed signedTx: SignedTransaction signedData: string + migratedToArgon2: never } const isPrivateKey = ( @@ -154,6 +155,8 @@ const isKeyring = ( export default class InternalSignerService extends BaseService { #cachedKey: SaltedKey | null = null + #cachedVaultVersion: VaultVersion = VaultVersion.PBKDF2 + #keyrings: HDKeyring[] = [] #privateKeys: Wallet[] = [] @@ -270,27 +273,29 @@ export default class InternalSignerService extends BaseService { return true } - if (!ignoreExistingVaults) { - const encryptedVaultsData = await getEncryptedVaults() - let { vaults } = encryptedVaultsData + const { vaults, version } = await migrateVaultsToArgon(password) + this.#cachedVaultVersion = version - if (encryptedVaultsData.version === VaultVersion.PBKDF2) { - vaults = await migrateVaultsToArgon(password) - } + if (version === VaultVersion.Argon2) { + this.emitter.emit("migratedToArgon2") + } + if (!ignoreExistingVaults) { const currentEncryptedVault = vaults.slice(-1)[0]?.vault if (currentEncryptedVault) { // attempt to load the vault const saltedKey = await deriveSymmetricKeyFromPassword( + version, password, currentEncryptedVault.salt ) let plainTextVault: SerializedKeyringData try { - plainTextVault = await decryptVault( - currentEncryptedVault, - saltedKey - ) + plainTextVault = await decryptVault({ + version, + vault: currentEncryptedVault, + passwordOrSaltedKey: saltedKey, + }) this.#cachedKey = saltedKey } catch (err) { // if we weren't able to load the vault, don't unlock @@ -323,7 +328,7 @@ export default class InternalSignerService extends BaseService { // if there's no vault or we want to force a new vault, generate a new key // and unlock if (!this.#cachedKey) { - this.#cachedKey = await deriveSymmetricKeyFromPassword(password) + this.#cachedKey = await deriveSymmetricKeyFromPassword(version, password) await this.#persistInternalSigners() } @@ -1050,15 +1055,16 @@ export default class InternalSignerService extends BaseService { const hiddenAccounts = { ...this.#hiddenAccounts } const metadata = { ...this.#signerMetadata } serializedKeyrings.sort((a, b) => (a.id > b.id ? 1 : -1)) - const vault = await encryptVault( - { + const vault = await encryptVault({ + version: this.#cachedVaultVersion, + passwordOrSaltedKey: this.#cachedKey, + vault: { keyrings: serializedKeyrings, privateKeys: serializedPrivateKeys, metadata, hiddenAccounts, }, - this.#cachedKey - ) + }) await writeLatestEncryptedVault(vault) } } diff --git a/background/services/internal-signer/storage.ts b/background/services/internal-signer/storage.ts index 3030e8f012..e27992af76 100644 --- a/background/services/internal-signer/storage.ts +++ b/background/services/internal-signer/storage.ts @@ -2,17 +2,14 @@ import browser from "webextension-polyfill" import { EncryptedVault, + VaultVersion, decryptVault, deprecatedDerivePbkdf2KeyFromPassword, - deriveSymmetricKeyFromPassword, + deriveArgon2KeyFromPassword, encryptVault, } from "./encryption" import { UNIXTime } from "../../types" - -export enum VaultVersion { - PBKDF2 = 1, - Argon2 = 2, -} +import logger from "../../lib/logger" export type SerializedEncryptedVault = { timeSaved: UNIXTime @@ -101,46 +98,55 @@ export async function writeLatestEncryptedVault( export async function migrateVaultsToArgon( password: string -): Promise { +): Promise { const serializedVaults = await getEncryptedVaults() if (serializedVaults.version === VaultVersion.Argon2) { - return serializedVaults.vaults + return serializedVaults } - const { vaults } = serializedVaults - const newVaults = await Promise.all( - vaults.map(async ({ vault, timeSaved }) => { - const deprecatedSaltedKey = await deprecatedDerivePbkdf2KeyFromPassword( - password, - vault.salt - ) - const newSaltedKey = await deriveSymmetricKeyFromPassword( - password, - vault.salt - ) + const { vaults } = serializedVaults + try { + const newVaults = await Promise.all( + vaults.map(async ({ vault, timeSaved }) => { + const deprecatedSaltedKey = await deprecatedDerivePbkdf2KeyFromPassword( + password, + vault.salt + ) + const newSaltedKey = await deriveArgon2KeyFromPassword( + password, + vault.salt + ) - const deprecatedDecryptedVault = await decryptVault( - vault, - deprecatedSaltedKey - ) - const newEncryptedVault = await encryptVault( - deprecatedDecryptedVault, - newSaltedKey - ) + const deprecatedDecryptedVault = await decryptVault({ + version: VaultVersion.PBKDF2, + vault, + passwordOrSaltedKey: deprecatedSaltedKey, + }) + const newEncryptedVault = await encryptVault({ + version: VaultVersion.Argon2, + vault: deprecatedDecryptedVault, + passwordOrSaltedKey: newSaltedKey, + }) - return { - timeSaved, - vault: newEncryptedVault, - } - }) - ) + return { + timeSaved, + vault: newEncryptedVault, + } + }) + ) - await browser.storage.local.set({ - tallyVaults: { + const newSerializedVaults = { version: VaultVersion.Argon2, vaults: newVaults, - }, - }) + } - return newVaults + await browser.storage.local.set({ + tallyVaults: newSerializedVaults, + }) + + return newSerializedVaults + } catch (error) { + logger.error("Failed to migrate vaults to Argon2") + return serializedVaults + } } diff --git a/background/services/internal-signer/tests/encryption.unit.test.ts b/background/services/internal-signer/tests/encryption.unit.test.ts index 0164c8d0d7..2206e2d56f 100644 --- a/background/services/internal-signer/tests/encryption.unit.test.ts +++ b/background/services/internal-signer/tests/encryption.unit.test.ts @@ -3,6 +3,7 @@ import { encryptVault, decryptVault, deriveSymmetricKeyFromPassword, + VaultVersion, } from "../encryption" const originalCrypto = global.crypto @@ -28,6 +29,7 @@ describe("Encryption utils", () => { ).toString("base64") const { key, salt } = await deriveSymmetricKeyFromPassword( + VaultVersion.PBKDF2, password, newSalt ) @@ -41,13 +43,21 @@ describe("Encryption utils", () => { it("doesn't throw when encrypting a vault with a password", async () => { const vault = { a: 1 } const password = "this-is-a-poor-password" - await encryptVault(vault, password) + await encryptVault({ + version: VaultVersion.PBKDF2, + vault, + passwordOrSaltedKey: password, + }) }) it("avoids couple common footguns when encrypting a vault with a password", async () => { const vault = { thisIsAnInterestingKey: "sentinel" } const password = "this-is-a-poor-password" - const newVault = await encryptVault(vault, password) + const newVault = await encryptVault({ + version: VaultVersion.PBKDF2, + vault, + passwordOrSaltedKey: password, + }) // ensure sensitive plaintext isn't in the output, with a couple simple // transformations. Note this *doesn't* show correctness of encryption — a // simple substitution cipher would still pass this — it's just a smoke test. @@ -63,9 +73,17 @@ describe("Encryption utils", () => { it("can decrypt a vault encrypted with a password", async () => { const vault = { a: 1 } const password = "this-is-a-poor-password" - const encryptedVault = await encryptVault(vault, password) + const encryptedVault = await encryptVault({ + version: VaultVersion.PBKDF2, + vault, + passwordOrSaltedKey: password, + }) - const newVault = await decryptVault(encryptedVault, password) + const newVault = await decryptVault({ + version: VaultVersion.PBKDF2, + vault: encryptedVault, + passwordOrSaltedKey: password, + }) expect(newVault).toEqual(vault) }) @@ -77,9 +95,17 @@ describe("Encryption utils", () => { d: 123, } const password = "this-is-a-poor-password" - const encryptedVault = await encryptVault(vault, password) + const encryptedVault = await encryptVault({ + version: VaultVersion.PBKDF2, + vault, + passwordOrSaltedKey: password, + }) - const newVault = await decryptVault(encryptedVault, password) + const newVault = await decryptVault({ + version: VaultVersion.PBKDF2, + vault: encryptedVault, + passwordOrSaltedKey: password, + }) expect(newVault).toEqual(vault) }) @@ -94,11 +120,22 @@ describe("Encryption utils", () => { global.crypto.getRandomValues(new Uint8Array(16)) ).toString("base64") - const saltedKey = await deriveSymmetricKeyFromPassword(password) + const saltedKey = await deriveSymmetricKeyFromPassword( + VaultVersion.PBKDF2, + password + ) - const encryptedVault = await encryptVault(vault, saltedKey) + const encryptedVault = await encryptVault({ + version: VaultVersion.PBKDF2, + vault, + passwordOrSaltedKey: saltedKey, + }) - const newVault = await decryptVault(encryptedVault, saltedKey) + const newVault = await decryptVault({ + version: VaultVersion.PBKDF2, + vault: encryptedVault, + passwordOrSaltedKey: saltedKey, + }) expect(newVault).toEqual(vault) }) From 8ce4d3be4454464cf9ffb56e535c7e47059351b1 Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Wed, 28 Jun 2023 14:55:12 +0200 Subject: [PATCH 06/13] Allow Jest to work with wasm - allowed Jest to fetch WebAssembly files - moved `crypto.subtle` mock to global setup --- .../tests/encryption.unit.test.ts | 12 --------- .../tests/index.integration.test.ts | 11 -------- .../internal-signer/tests/index.unit.test.ts | 4 --- setupJest.ts | 26 +++++++++++++++++-- 4 files changed, 24 insertions(+), 29 deletions(-) diff --git a/background/services/internal-signer/tests/encryption.unit.test.ts b/background/services/internal-signer/tests/encryption.unit.test.ts index 2206e2d56f..276a86ff4c 100644 --- a/background/services/internal-signer/tests/encryption.unit.test.ts +++ b/background/services/internal-signer/tests/encryption.unit.test.ts @@ -1,4 +1,3 @@ -import { webcrypto } from "crypto" import { encryptVault, decryptVault, @@ -6,18 +5,7 @@ import { VaultVersion, } from "../encryption" -const originalCrypto = global.crypto - describe("Encryption utils", () => { - beforeEach(() => { - // polyfill the WebCrypto API - global.crypto = webcrypto as unknown as Crypto - }) - - afterEach(() => { - global.crypto = originalCrypto - }) - it("derives symmetric keys", async () => { /* eslint-disable no-await-in-loop */ for (let i = 0; i < 5; i += 1) { diff --git a/background/services/internal-signer/tests/index.integration.test.ts b/background/services/internal-signer/tests/index.integration.test.ts index a4be0f1205..504d2c9846 100644 --- a/background/services/internal-signer/tests/index.integration.test.ts +++ b/background/services/internal-signer/tests/index.integration.test.ts @@ -1,4 +1,3 @@ -import { webcrypto } from "crypto" import browser from "webextension-polyfill" import InternalSignerService, { @@ -18,16 +17,6 @@ import { createPreferenceService, } from "../../../tests/factories" -const originalCrypto = global.crypto -beforeEach(() => { - // polyfill the WebCrypto API - global.crypto = webcrypto as unknown as Crypto -}) - -afterEach(() => { - global.crypto = originalCrypto -}) - const validMnemonics = { metamask: [ "input pulp truth gain expire kick castle voyage firm fee degree draft", diff --git a/background/services/internal-signer/tests/index.unit.test.ts b/background/services/internal-signer/tests/index.unit.test.ts index b6954be8f5..cf11ebf0fe 100644 --- a/background/services/internal-signer/tests/index.unit.test.ts +++ b/background/services/internal-signer/tests/index.unit.test.ts @@ -1,4 +1,3 @@ -import { webcrypto } from "crypto" import InternalSignerService, { SignerInternalTypes, SignerImportSource, @@ -12,7 +11,6 @@ import { } from "../../../tests/factories" import { mockLocalStorage } from "../../../tests/utils" -const originalCrypto = global.crypto const HD_WALLET_MOCK = { mnemonic: "input pulp truth gain expire kick castle voyage firm fee degree draft", @@ -31,7 +29,6 @@ describe("InternalSignerService", () => { let internalSignerService: InternalSignerService beforeEach(async () => { - global.crypto = webcrypto as unknown as Crypto mockLocalStorage() internalSignerService = await createInternalSignerService() @@ -41,7 +38,6 @@ describe("InternalSignerService", () => { afterEach(async () => { await internalSignerService.stopService() - global.crypto = originalCrypto }) describe("generated HD wallet", () => { diff --git a/setupJest.ts b/setupJest.ts index c036c1319e..138782955e 100644 --- a/setupJest.ts +++ b/setupJest.ts @@ -1,6 +1,8 @@ import * as util from "util" import Dexie from "dexie" import logger, { LogLevel } from "@tallyho/tally-background/lib/logger" +import { readFileSync } from "fs" +import { webcrypto } from "crypto" const IS_CI = process.env.CI === "true" @@ -36,11 +38,31 @@ Object.defineProperty(Dexie.dependencies, "indexedDB", { get: () => indexedDB, }) -// Stub fetch calls +// Stub fetch calls but allow wasm files to be loaded. Object.defineProperty(window, "fetch", { writable: true, - value: (url: string) => { + value: async ( + url: string + ): Promise<{ status: number; body: string | Buffer } | undefined> => { + if (url.endsWith(".wasm")) { + const file = readFileSync(url) + return { + status: 200, + body: file, + } + } // eslint-disable-next-line no-console console.warn("Uncaught fetch call to: \n", url) + return undefined }, }) + +// Below, we replace any existing crypto.subtle implementation with the Node +// one. jsdom ships with an ad hoc, informally-specified, bug-ridden +// implementation of half of WebCrypto, but that includes securing the `crypto` +// variable to prevent it from being replaced, which manes we have to dig into +// the object instead of being able to replace the top-level variable. +Object.defineProperty(globalThis.crypto, "subtle", { + writable: true, + value: (webcrypto as unknown as Crypto).subtle, +}) From b04ee01db7f913b6645727b70f52414baaac5ade Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Wed, 28 Jun 2023 14:57:55 +0200 Subject: [PATCH 07/13] Move sending migration event to Internal Signer service --- background/main.ts | 16 ++++----- .../services/internal-signer/encryption.ts | 2 +- background/services/internal-signer/index.ts | 18 ++++++---- .../tests/index.integration.test.ts | 7 +++- background/tests/factories.ts | 34 +++++++++++-------- 5 files changed, 44 insertions(+), 33 deletions(-) diff --git a/background/main.ts b/background/main.ts index 4a6f994185..b2eab862b8 100644 --- a/background/main.ts +++ b/background/main.ts @@ -303,8 +303,12 @@ export default class Main extends BaseService { static create: ServiceCreatorFunction = async () => { const preferenceService = PreferenceService.create() - const internalSignerService = - InternalSignerService.create(preferenceService) + const analyticsService = AnalyticsService.create(preferenceService) + + const internalSignerService = InternalSignerService.create( + preferenceService, + analyticsService + ) const chainService = ChainService.create( preferenceService, internalSignerService @@ -337,8 +341,6 @@ export default class Main extends BaseService { chainService ) - const analyticsService = AnalyticsService.create(preferenceService) - const nftsService = NFTsService.create(chainService) const abilitiesService = AbilitiesService.create( @@ -1151,12 +1153,6 @@ export default class Main extends BaseService { } }) - this.internalSignerService.emitter.on("migratedToArgon2", async () => { - this.analyticsService.sendOneTimeAnalyticsEvent( - OneTimeAnalyticsEvent.ARGON_MIGRATION - ) - }) - internalSignerSliceEmitter.on("createPassword", async (password) => { await this.internalSignerService.unlock(password, true) }) diff --git a/background/services/internal-signer/encryption.ts b/background/services/internal-signer/encryption.ts index 1acc2ee815..64831852ba 100644 --- a/background/services/internal-signer/encryption.ts +++ b/background/services/internal-signer/encryption.ts @@ -27,7 +27,7 @@ export type SaltedKey = { key: CryptoKey } -function bufferToBase64(array: Uint8Array): string { +function bufferToBase64(array: Uint8Array | ArrayBuffer): string { return Buffer.from(array).toString("base64") } diff --git a/background/services/internal-signer/index.ts b/background/services/internal-signer/index.ts index abdde9811f..6a3e368fbe 100644 --- a/background/services/internal-signer/index.ts +++ b/background/services/internal-signer/index.ts @@ -29,6 +29,8 @@ import { AddressOnNetwork } from "../../accounts" import logger from "../../lib/logger" import PreferenceService from "../preferences" import { DEFAULT_AUTOLOCK_INTERVAL } from "../preferences/defaults" +import AnalyticsService from "../analytics" +import { OneTimeAnalyticsEvent } from "../../lib/posthog" export enum SignerInternalTypes { mnemonicBIP39S128 = "mnemonic#bip39:128", @@ -126,7 +128,6 @@ interface Events extends ServiceLifecycleEvents { // TODO message was signed signedTx: SignedTransaction signedData: string - migratedToArgon2: never } const isPrivateKey = ( @@ -182,12 +183,15 @@ export default class InternalSignerService extends BaseService { static create: ServiceCreatorFunction< Events, InternalSignerService, - [Promise] - > = async (preferenceService) => { - return new this(await preferenceService) + [Promise, Promise] + > = async (preferenceService, analyticsService) => { + return new this(await preferenceService, await analyticsService) } - private constructor(private preferenceService: PreferenceService) { + private constructor( + private preferenceService: PreferenceService, + private analyticsService: AnalyticsService + ) { super({ autolock: { schedule: { @@ -277,7 +281,9 @@ export default class InternalSignerService extends BaseService { this.#cachedVaultVersion = version if (version === VaultVersion.Argon2) { - this.emitter.emit("migratedToArgon2") + this.analyticsService.sendOneTimeAnalyticsEvent( + OneTimeAnalyticsEvent.ARGON_MIGRATION + ) } if (!ignoreExistingVaults) { diff --git a/background/services/internal-signer/tests/index.integration.test.ts b/background/services/internal-signer/tests/index.integration.test.ts index 504d2c9846..fd74724c57 100644 --- a/background/services/internal-signer/tests/index.integration.test.ts +++ b/background/services/internal-signer/tests/index.integration.test.ts @@ -15,6 +15,7 @@ import { import { createTransactionRequest, createPreferenceService, + createAnalyticsService, } from "../../../tests/factories" const validMnemonics = { @@ -43,7 +44,11 @@ const dateNowValue = 1000000000000 const startInternalSignerService = async () => { const preferencesService = createPreferenceService() - const service = await InternalSignerService.create(preferencesService) + const analyticsService = createAnalyticsService() + const service = await InternalSignerService.create( + preferencesService, + analyticsService + ) await service.startService() diff --git a/background/tests/factories.ts b/background/tests/factories.ts index 767f8a8013..456c251f48 100644 --- a/background/tests/factories.ts +++ b/background/tests/factories.ts @@ -67,14 +67,27 @@ export const createPreferenceService = async (): Promise => { return PreferenceService.create() } +export async function createAnalyticsService(overrides?: { + chainService?: Promise + preferenceService?: Promise +}): Promise { + const preferenceService = + overrides?.preferenceService ?? createPreferenceService() + return AnalyticsService.create(preferenceService) +} + +type CreateInternalSignerServiceOverrides = { + preferenceService?: Promise + analyticsService?: Promise +} + export const createInternalSignerService = async ( - preferenceService?: PreferenceService + overrides: CreateInternalSignerServiceOverrides = {} ): Promise => { - const override = preferenceService - ? Promise.resolve(preferenceService) - : createPreferenceService() - - return InternalSignerService.create(override) + return InternalSignerService.create( + overrides.preferenceService ?? createPreferenceService(), + overrides.analyticsService ?? createAnalyticsService() + ) } type CreateChainServiceOverrides = { @@ -143,15 +156,6 @@ type CreateInternalEthereumProviderServiceOverrides = { preferenceService?: Promise } -export async function createAnalyticsService(overrides?: { - chainService?: Promise - preferenceService?: Promise -}): Promise { - const preferenceService = - overrides?.preferenceService ?? createPreferenceService() - return AnalyticsService.create(preferenceService) -} - export const createSigningService = async ( overrides: CreateSigningServiceOverrides = {} ): Promise => { From 1d3d1a6e696a59f142f4561f142d9068ec9b0e63 Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Wed, 28 Jun 2023 15:59:07 +0200 Subject: [PATCH 08/13] Bump Jest and Typescript versions - for Jest to work with WebAssembly we need to update to next major version - to support dependencies for new Jest version we need to bump Typesript as well - let's fix problems found by new Typescript version --- .eslintrc.js | 5 +- background/lib/utils/index.ts | 4 +- background/lib/validate/prices.ts | 2 +- background/redux-slices/utils.ts | 12 +- background/services/chain/index.ts | 5 +- package.json | 28 +- ui/components/SignData/SignTypedDataInfo.tsx | 2 +- yarn.lock | 1890 ++++++++++-------- 8 files changed, 1144 insertions(+), 804 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 6d756aadfa..b8c317951c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -92,7 +92,10 @@ module.exports = { ], }, ], - "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-unused-vars": [ + "error", + { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }, + ], "no-unused-vars": "off", }, ignorePatterns: [ diff --git a/background/lib/utils/index.ts b/background/lib/utils/index.ts index e2c6cc44a2..4983671051 100644 --- a/background/lib/utils/index.ts +++ b/background/lib/utils/index.ts @@ -108,14 +108,14 @@ export function gweiToWei(value: number | bigint): bigint { return BigInt(utils.parseUnits(value.toString(), "gwei").toString()) } -export function convertToEth(value: string | number | bigint): string { +export function convertToEth(value: bigint): string { if (value && value >= 1) { return utils.formatUnits(BigInt(value)) } return "" } -export function weiToGwei(value: string | number | bigint): string { +export function weiToGwei(value: bigint): string { if (value && value >= 1) { return truncateDecimalAmount(utils.formatUnits(BigInt(value), "gwei"), 2) } diff --git a/background/lib/validate/prices.ts b/background/lib/validate/prices.ts index 724eed5dda..b20f9ee5b7 100644 --- a/background/lib/validate/prices.ts +++ b/background/lib/validate/prices.ts @@ -27,7 +27,7 @@ export const coingeckoPriceSchema: JSONSchemaType = { additionalProperties: { type: "number", nullable: true }, nullable: true, }, -} +} as const export type CoingeckoPriceData = { [coinId: string]: diff --git a/background/redux-slices/utils.ts b/background/redux-slices/utils.ts index 574cf499e1..f572b32ea6 100644 --- a/background/redux-slices/utils.ts +++ b/background/redux-slices/utils.ts @@ -68,6 +68,16 @@ const asyncThunkProperties = (() => { return exhaustiveList })() +// Extracts a @reduxjs/toolkit internal type for type alignment in the below +// function types. +type AsyncThunkConfig = ReturnType extends AsyncThunk< + infer _, + infer __, + infer T +> + ? T + : never + /** * Create an async thunk action that will always run in the background script, * and dispatches lifecycle actions (pending, fulfilled, rejected) on the @@ -108,7 +118,7 @@ export function createBackgroundAsyncThunk< TypePrefix extends string, Returned, ThunkArg = void, - ThunkApiConfig = { extra: { main: Main } } + ThunkApiConfig extends AsyncThunkConfig = { extra: { main: Main } } >( typePrefix: TypePrefix, payloadCreator: AsyncThunkPayloadCreator, diff --git a/background/services/chain/index.ts b/background/services/chain/index.ts index 353586d81e..7c1f6e1fed 100644 --- a/background/services/chain/index.ts +++ b/background/services/chain/index.ts @@ -1642,7 +1642,7 @@ export default class ChainService extends BaseService { // Don't override an already-persisted successful status with // an expiration-based failed status, but do set status to // failure if no transaction was seen. - { status: 0, ...existingTransaction }, + { status: 0, ...existingTransaction } as AnyEVMTransaction, "local" ) } @@ -1710,6 +1710,9 @@ export default class ChainService extends BaseService { logger.error(`Error emitting tx ${finalTransaction}`, error) } if (error) { + // We don't control the errors in the whole stack, but we do want to + // rethrow them regardless. + // eslint-disable-next-line @typescript-eslint/no-throw-literal throw error } } diff --git a/package.json b/package.json index 0b9e16c2a5..f1a9340991 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,15 @@ "author": "Matt Luongo ", "license": "GPL-3.0", "jest": { + "reporters": [ + [ + "github-actions", + { + "silent": false + } + ], + "default" + ], "setupFiles": [ "fake-indexeddb/auto", "jest-webextension-mock", @@ -17,7 +26,17 @@ "./setupJest.env.ts", "./ui/setupJest.env.ts" ], - "testEnvironment": "jsdom" + "testEnvironment": "jsdom", + "transformIgnorePatterns": [ + "node_modules/(?!@walletconnect/)" + ], + "moduleNameMapper": { + "^dexie$": "/node_modules/dexie", + "^@walletconnect/utils$": "/node_modules/@walletconnect/utils", + "^@walletconnect/((?!types))$": "/node_modules/@walletconnect/$1", + "^multiformats(.*)": "/node_modules/multiformats$1", + "^uint8arrays(.*)": "/node_modules/uint8arrays$1" + } }, "keywords": [ "ethereum", @@ -85,7 +104,7 @@ "@types/copy-webpack-plugin": "^8.0.0", "@types/dotenv-webpack": "^7.0.3", "@types/firefox-webext-browser": "^82.0.0", - "@types/jest": "^27.0.2", + "@types/jest": "^29.5.0", "@types/react-router-dom": "^5.3.1", "@types/remote-redux-devtools": "^0.5.5", "@types/terser-webpack-plugin": "^5.0.3", @@ -111,7 +130,8 @@ "eslint-plugin-react-hooks": "^4.2.0", "fork-ts-checker-webpack-plugin": "^6.3.2", "install": "^0.13.0", - "jest": "^27.2.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", "npm": "^7.5.6", "npm-run-all": "^4.1.5", "patch-package": "^6.4.7", @@ -122,7 +142,7 @@ "styled-jsx": "^3.4.4", "terser-webpack-plugin": "^5.1.1", "ts-loader": "^9.2.3", - "typescript": "^4.3.2", + "typescript": "^5.0.4", "webpack": "^5.58.1", "webpack-cli": "4.5.0", "webpack-livereload-plugin": "^3.0.1", diff --git a/ui/components/SignData/SignTypedDataInfo.tsx b/ui/components/SignData/SignTypedDataInfo.tsx index 32a71047ba..999908516c 100644 --- a/ui/components/SignData/SignTypedDataInfo.tsx +++ b/ui/components/SignData/SignTypedDataInfo.tsx @@ -22,7 +22,7 @@ export default function SignTypedDataInfo({ ? annotation.displayFields : typedData.message ?? {} - const keys = Object.keys(fieldsToDisplay) + const keys = Object.keys(fieldsToDisplay) as (keyof typeof fieldsToDisplay)[] return (
diff --git a/yarn.lock b/yarn.lock index 2e9f26854b..9e688afff0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,14 @@ resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@apollo/protobufjs@1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.2.tgz#4bd92cd7701ccaef6d517cdb75af2755f049f87c" @@ -50,7 +58,7 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== @@ -71,31 +79,43 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== -"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.15.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" - integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.4" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.4" - "@babel/helpers" "^7.15.4" - "@babel/parser" "^7.15.5" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" +"@babel/compat-data@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" + integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" + integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.1.2" + json5 "^2.2.2" semver "^6.3.0" - source-map "^0.5.0" "@babel/core@^7.13.1": version "7.15.4" @@ -145,6 +165,16 @@ "@jridgewell/gen-mapping" "^0.1.0" jsesc "^2.5.1" +"@babel/generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" @@ -187,6 +217,17 @@ browserslist "^4.16.6" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02" + integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" @@ -228,6 +269,11 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + "@babel/helper-explode-assignable-expression@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" @@ -252,6 +298,14 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/helper-get-function-arity@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" @@ -273,6 +327,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" @@ -301,6 +362,13 @@ dependencies: "@babel/types" "^7.15.4" +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" @@ -329,6 +397,20 @@ "@babel/traverse" "^7.15.0" "@babel/types" "^7.15.0" +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/helper-optimise-call-expression@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" @@ -353,6 +435,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + "@babel/helper-remap-async-to-generator@^7.14.5": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" @@ -396,6 +483,13 @@ dependencies: "@babel/types" "^7.15.4" +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers@^7.14.5": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" @@ -417,6 +511,18 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" @@ -432,11 +538,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + "@babel/helper-wrap-function@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" @@ -456,6 +572,15 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" +"@babel/helpers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820" + integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" @@ -483,11 +608,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.15.5", "@babel/parser@^7.7.2": +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae" integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g== +"@babel/parser@^7.14.7", "@babel/parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea" + integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q== + "@babel/parser@^7.15.0": version "7.15.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" @@ -710,6 +849,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -1253,7 +1399,16 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== @@ -1283,6 +1438,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1" + integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.4.5": version "7.17.10" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" @@ -1340,6 +1511,15 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -2254,62 +2434,61 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.2.2.tgz#a977245155c519ac2ef713ec0e722d13eda893c9" - integrity sha512-m7tbzPWyvSFfoanTknJoDnaeruDARsUe555tkVjG/qeaRDKwyPqqbgs4yFx583gmoETiAts1deeYozR5sVRhNA== +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.2.2" - jest-util "^27.2.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" -"@jest/core@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.2.2.tgz#9eea16101b2f04bf799dcdbdf1792d4ef7553ecf" - integrity sha512-4b9km/h9pAGdCkwWYtbfoeiOtajOlGmr5rL1Eq6JCAVbOevOqxWHxJ6daWxRJW9eF6keXJoJ1H+uVAVcdZu8Bg== +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== dependencies: - "@jest/console" "^27.2.2" - "@jest/reporters" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.8.1" + ci-info "^3.2.0" exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^27.1.1" - jest-config "^27.2.2" - jest-haste-map "^27.2.2" - jest-message-util "^27.2.2" - jest-regex-util "^27.0.6" - jest-resolve "^27.2.2" - jest-resolve-dependencies "^27.2.2" - jest-runner "^27.2.2" - jest-runtime "^27.2.2" - jest-snapshot "^27.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" - jest-watcher "^27.2.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" micromatch "^4.0.4" - p-each-series "^2.1.0" - rimraf "^3.0.0" + pretty-format "^29.5.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.2.2.tgz#2e57b9d2cc01028b0e35fae5833c1c63df4c5e41" - integrity sha512-gO9gVnZfn5ldeOJ5q+35Kru9QWGHEqZCB7W/M+8mD6uCwOGC9HR6mzpLSNRuDsxY/KhaGBYHpgFqtpe4Rl1gDQ== +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== dependencies: - "@jest/fake-timers" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^27.1.1" + jest-mock "^29.5.0" "@jest/expect-utils@^29.2.2": version "29.2.2" @@ -2318,56 +2497,72 @@ dependencies: jest-get-type "^29.2.0" -"@jest/fake-timers@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.2.2.tgz#43e6f191c95ae74e95d0ddba2ecb8470b4a288b7" - integrity sha512-gDIIqs0yxyjyxEI9HlJ8SEJ4uCc8qr8BupG1Hcx7tvyk/SLocyXE63rFxL+HQ0ZLMvSyEcJUmYnvvHH1osWiGA== +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: - "@jest/types" "^27.1.1" - "@sinonjs/fake-timers" "^7.0.2" + jest-get-type "^29.4.3" + +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== + dependencies: + expect "^29.5.0" + jest-snapshot "^29.5.0" + +"@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" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^27.2.2" - jest-mock "^27.1.1" - jest-util "^27.2.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" -"@jest/globals@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.2.2.tgz#df66aaafda5c69b2bb0dae548e3cfb345f549c31" - integrity sha512-fWa/Luwod1hyehnuep+zCnOTqTVvyc4HLUU/1VpFNOEu0tCWNSODyvKSSOjtb1bGOpCNjgaDcyjzo5f7rl6a7g== +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== dependencies: - "@jest/environment" "^27.2.2" - "@jest/types" "^27.1.1" - expect "^27.2.2" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" -"@jest/reporters@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.2.2.tgz#e2d41cd9f8088676b81b9a9908cb1ba67bdbee78" - integrity sha512-ufwZ8XoLChEfPffDeVGroYbhbcYPom3zKDiv4Flhe97rr/o2IfUXoWkDUDoyJ3/V36RFIMjokSu0IJ/pbFtbHg== +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" + glob "^7.1.3" + graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^27.2.2" - jest-resolve "^27.2.2" - jest-util "^27.2.0" - jest-worker "^27.2.2" + istanbul-reports "^3.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" slash "^3.0.0" - source-map "^0.6.0" string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.0.0" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" "@jest/schemas@^29.0.0": version "29.0.0" @@ -2376,73 +2571,81 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/source-map@^27.0.6": - version "27.0.6" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.0.6.tgz#be9e9b93565d49b0548b86e232092491fb60551f" - integrity sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g== +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@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" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== dependencies: + "@jridgewell/trace-mapping" "^0.3.15" callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" + graceful-fs "^4.2.9" -"@jest/test-result@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.2.2.tgz#cd4ba1ca9b0521e463bd4b32349ba1842277563b" - integrity sha512-yENoDEoWlEFI7l5z7UYyJb/y5Q8RqbPd4neAVhKr6l+vVaQOPKf8V/IseSMJI9+urDUIxgssA7RGNyCRhGjZvw== +"@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" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== dependencies: - "@jest/console" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.2.2.tgz#9a6d735317f525741a5913ee3cdefeffc9b0aba6" - integrity sha512-YnJqwNQP2Zeu0S4TMqkxg6NN7Y1EFq715n/nThNKrvIS9wmRZjDt2XYqsHbuvhAFjshi0iKDQ813NewFITBH+Q== +"@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" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== dependencies: - "@jest/test-result" "^27.2.2" - graceful-fs "^4.2.4" - jest-haste-map "^27.2.2" - jest-runtime "^27.2.2" + "@jest/test-result" "^29.5.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + slash "^3.0.0" -"@jest/transform@^27.2.2": - version "27.2.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.2.2.tgz#89b16b4de84354fb48d15712b3ea34cadc1cb600" - integrity sha512-l4Z/7PpajrOjCiXLWLfMY7fgljY0H8EwW7qdzPXXuv2aQF8kY2+Uyj3O+9Popnaw1V7JCw32L8EeI/thqFDkPA== +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.1.1" - babel-plugin-istanbul "^6.0.0" + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + 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.4" - jest-haste-map "^27.2.2" - jest-regex-util "^27.0.6" - jest-util "^27.2.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" micromatch "^4.0.4" - pirates "^4.0.1" + pirates "^4.0.4" slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + write-file-atomic "^4.0.2" -"@jest/types@^27.1.1": - version "27.1.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.1.1.tgz#77a3fc014f906c65752d12123a0134359707c0ad" - integrity sha512-yqJPDDseb0mXgKqmNqypCsb85C22K1aY5+LUxh7syIM9n/b0AsaltxNy+o6tt29VcfGDpYEve175bm3uOhcehA== +"@jest/types@^29.2.1": + version "29.2.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.2.1.tgz#ec9c683094d4eb754e41e2119d8bdaef01cf6da0" + integrity sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw== dependencies: + "@jest/schemas" "^29.0.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^16.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.2.1": - version "29.2.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.2.1.tgz#ec9c683094d4eb754e41e2119d8bdaef01cf6da0" - integrity sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw== +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -2462,16 +2665,48 @@ "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + "@jridgewell/set-array@^1.0.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.13" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@ledgerhq/cryptoassets@^6.37.0": version "6.37.0" resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-6.37.0.tgz#302833777bcd210809ca7820afb82cff8da5c296" @@ -3111,6 +3346,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -3123,6 +3363,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@>=5", "@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" @@ -3130,12 +3377,12 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/fake-timers@^7.0.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^3.0.0" "@sinonjs/samsam@^6.1.1": version "6.1.1" @@ -3362,6 +3609,11 @@ 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" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + "@tsconfig/node10@^1.0.7": version "1.0.8" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" @@ -3406,7 +3658,7 @@ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": +"@types/babel__core@^7.1.14": version "7.1.16" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== @@ -3432,7 +3684,7 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.14.2" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== @@ -3584,10 +3836,10 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== +"@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" "*" @@ -3636,19 +3888,33 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/jest@^27.0.2": - version "27.0.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.0.2.tgz#ac383c4d4aaddd29bbf2b916d8d105c304a5fcd7" - integrity sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA== +"@types/jest@^29.5.0": + version "29.5.2" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" + integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== + 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" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== dependencies: - jest-diff "^27.0.0" - pretty-format "^27.0.0" + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== +"@types/json-schema@^7.0.4": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -3915,6 +4181,11 @@ dependencies: "@types/jest" "*" +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + "@types/uglify-js@*": version "3.13.1" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" @@ -3970,13 +4241,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.13" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" @@ -4534,10 +4798,10 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== +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== abbrev@1, abbrev@~1.1.1: version "1.1.1" @@ -4552,13 +4816,13 @@ 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== +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" + acorn "^8.1.0" + acorn-walk "^8.0.2" acorn-import-assertions@^1.7.6: version "1.7.6" @@ -4570,25 +4834,20 @@ acorn-jsx@^5.3.1: 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.1.1: +acorn-walk@^8.0.2, acorn-walk@^8.1.1: 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@^7.1.1, acorn@^7.4.0: +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.2.4: - version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== +acorn@^8.1.0, acorn@^8.8.1: + version "8.9.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" + integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== acorn@^8.4.1: version "8.4.1" @@ -5142,18 +5401,17 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-jest@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.2.2.tgz#d7e96f3f6f56be692de948092697e1bfea7f1184" - integrity sha512-XNFNNfGKnZXzhej7TleVP4s9ktH5JjRW8Rmcbb223JJwKB/gmTyeWN0JfiPtSgnjIjDXtKNoixiy0QUHtv3vFA== +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== dependencies: - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/transform" "^29.5.0" "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^27.2.0" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" slash "^3.0.0" babel-loader@^8.2.2: @@ -5173,25 +5431,25 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^27.2.0: - version "27.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.2.0.tgz#79f37d43f7e5c4fdc4b2ca3e10cc6cf545626277" - integrity sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw== +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" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" + "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" babel-plugin-macros@^2.6.1: @@ -5261,12 +5519,12 @@ 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.2.0: - version "27.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.2.0.tgz#556bbbf340608fed5670ab0ea0c8ef2449fba885" - integrity sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg== +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" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== dependencies: - babel-plugin-jest-hoist "^27.2.0" + babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -5458,11 +5716,6 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -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== - browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -5528,6 +5781,16 @@ browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.16.8: escalade "^3.1.1" node-releases "^1.1.75" +browserslist@^4.21.3: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -5672,6 +5935,11 @@ caniuse-lite@^1.0.30001251: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz#cb16e4e3dafe948fc4a9bb3307aea054b912019a" integrity sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw== +caniuse-lite@^1.0.30001503: + version "1.0.30001509" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14" + integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -5713,9 +5981,9 @@ chardet@^0.4.0: integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= chokidar@^3.4.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -5747,11 +6015,6 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== - ci-info@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.5.0.tgz#bfac2a29263de4c829d806b1ab478e35091e171f" @@ -5817,13 +6080,13 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" wrap-ansi "^7.0.0" clone-deep@^4.0.1: @@ -6073,13 +6336,18 @@ convert-source-map@1.7.0: dependencies: safe-buffer "~5.1.1" -convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -6288,10 +6556,10 @@ cssfilter@0.0.10: resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= -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" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== cssom@~0.3.6: version "0.3.8" @@ -6358,14 +6626,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -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== +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" dateformat@^4.6.3: version "4.6.3" @@ -6408,10 +6676,10 @@ debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== +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== decode-uri-component@^0.2.0: version "0.2.2" @@ -6566,16 +6834,16 @@ diff-match-patch@^1.0.0: resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== -diff-sequences@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.0.6.tgz#3305cb2e55a033924054695cc66019fd7f8e5723" - integrity sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ== - diff-sequences@^29.2.0: version "29.2.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.2.0.tgz#4c55b5b40706c7b5d2c5c75999a50c56d214e8f6" integrity sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -6636,12 +6904,12 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" -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== +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: - webidl-conversions "^5.0.0" + webidl-conversions "^7.0.0" dotenv-defaults@^2.0.2: version "2.0.2" @@ -6715,6 +6983,11 @@ electron-to-chromium@^1.3.811: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz#c725e8db8c5be18b472a919e5f57904512df0fc1" integrity sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A== +electron-to-chromium@^1.4.431: + version "1.4.442" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.442.tgz#455f4c5bd6ae73afb634dcffee6f356c26c8e294" + integrity sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q== + electron@^18.0.1: version "18.2.0" resolved "https://registry.yarnpkg.com/electron/-/electron-18.2.0.tgz#a0cbf8d5d1a1e9d1c195d86cd6937e721ed60fec" @@ -6737,10 +7010,10 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -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== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emittery@^0.9.2: version "0.9.2" @@ -6809,6 +7082,11 @@ enquirer@^2.3.5, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -7369,18 +7647,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.2.2.tgz#65c414697415c0867ef588813e9c729ebab8a9a9" - integrity sha512-sjHBeEk47/eshN9oLbvPJZMgHQihOXXQzSMPCJ4MqKShbU9HOVFSNHEEU4dp4ujzxFSiNvPFzB2AMOFmkizhvA== - dependencies: - "@jest/types" "^27.1.1" - ansi-styles "^5.0.0" - jest-get-type "^27.0.6" - jest-matcher-utils "^27.2.2" - jest-message-util "^27.2.2" - jest-regex-util "^27.0.6" - expect@^29.0.0: version "29.2.2" resolved "https://registry.yarnpkg.com/expect/-/expect-29.2.2.tgz#ba2dd0d7e818727710324a6e7f13dd0e6d086106" @@ -7392,6 +7658,17 @@ expect@^29.0.0: jest-message-util "^29.2.1" jest-util "^29.2.1" +expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + expirymanager@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/expirymanager/-/expirymanager-0.9.4.tgz#dc9f2dfc2a8160dc88c24fe0bca8c085908bd322" @@ -7688,9 +7965,9 @@ forever-agent@~0.6.1: integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= fork-ts-checker-webpack-plugin@^6.3.2: - version "6.3.2" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.3.2.tgz#96555f9f05c1cf44af3aef7db632489a3b6ff085" - integrity sha512-L3n1lrV20pRa7ocAuM2YW4Ux1yHM8+dV4shqPdHf1xoeG5KQhp3o0YySvNsBKBISQOCN4N2Db9DV4xYN6xXwyQ== + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== dependencies: "@babel/code-frame" "^7.8.3" "@types/json-schema" "^7.0.5" @@ -7706,10 +7983,10 @@ fork-ts-checker-webpack-plugin@^6.3.2: semver "^7.3.2" tapable "^1.0.0" -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== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" @@ -7783,10 +8060,10 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-monkey@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== +fs-monkey@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== fs.realpath@^1.0.0: version "1.0.0" @@ -7974,18 +8251,6 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-agent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" @@ -8205,12 +8470,12 @@ hosted-git-info@^4.0.1, hosted-git-info@^4.0.2: 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== +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" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: - whatwg-encoding "^1.0.5" + whatwg-encoding "^2.0.0" html-entities@^2.3.3: version "2.3.3" @@ -8259,6 +8524,15 @@ http-proxy-agent@^4.0.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" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -8276,6 +8550,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -8307,7 +8589,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.17: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: +iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -8536,13 +8818,6 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-ci@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994" - integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== - dependencies: - ci-info "^3.1.1" - is-cidr@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814" @@ -8808,14 +9083,20 @@ istanbul-lib-coverage@^3.0.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz#e8900b3ed6069759229cf30f7067388d148aeb5e" integrity sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ== -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== +istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: - "@babel/core" "^7.7.5" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" + istanbul-lib-coverage "^3.2.0" semver "^6.3.0" istanbul-lib-report@^3.0.0: @@ -8836,10 +9117,10 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -8849,94 +9130,85 @@ javascript-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== -jest-changed-files@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.1.1.tgz#9b3f67a34cc58e3e811e2e1e21529837653e4200" - integrity sha512-5TV9+fYlC2A6hu3qtoyGHprBwCAn0AuGA77bZdUgYvVlRMjHXo063VcWTEAyx6XAZ85DYHqp0+aHKbPlfRDRvA== +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" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: - "@jest/types" "^27.1.1" execa "^5.0.0" - throat "^6.0.1" + p-limit "^3.1.0" -jest-circus@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.2.2.tgz#a3647082f3eba1226f7664a36a2b7ebf45ceaf7b" - integrity sha512-8txlqs0EDrvPasCgwfLMkG0l3F4FxqQa6lxOsvYfOl04eSJjRw3F4gk9shakuC00nMD+VT+SMtFYXxe64f0VZw== +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== dependencies: - "@jest/environment" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" - expect "^27.2.2" is-generator-fn "^2.0.0" - jest-each "^27.2.2" - jest-matcher-utils "^27.2.2" - jest-message-util "^27.2.2" - jest-runtime "^27.2.2" - jest-snapshot "^27.2.2" - jest-util "^27.2.0" - pretty-format "^27.2.2" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" - throat "^6.0.1" -jest-cli@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.2.2.tgz#0973a717c109f23de642b63486f3cb71c5a971be" - integrity sha512-jbEythw22LR/IHYgNrjWdO74wO9wyujCxTMjbky0GLav4rC4y6qDQr4TqQ2JPP51eDYJ2awVn83advEVSs5Brg== +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== dependencies: - "@jest/core" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^27.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" prompts "^2.0.1" - yargs "^16.0.3" + yargs "^17.3.1" -jest-config@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.2.2.tgz#970d8466c60ac106ac9d7d0b8dcf3ff150fa713a" - integrity sha512-2nhms3lp52ZpU0636bB6zIFHjDVtYxzFQIOHZjBFUeXcb6b41sEkWojbHaJ4FEIO44UbccTLa7tvNpiFCgPE7w== +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^27.2.2" - "@jest/types" "^27.1.1" - babel-jest "^27.2.2" + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - is-ci "^3.0.0" - jest-circus "^27.2.2" - jest-environment-jsdom "^27.2.2" - jest-environment-node "^27.2.2" - jest-get-type "^27.0.6" - jest-jasmine2 "^27.2.2" - jest-regex-util "^27.0.6" - jest-resolve "^27.2.2" - jest-runner "^27.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" micromatch "^4.0.4" - pretty-format "^27.2.2" - -jest-diff@^27.0.0, jest-diff@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.2.2.tgz#3992fe5f55f209676c5d3fd956e3f3d4145f76b8" - integrity sha512-o3LaDbQDSaMJif4yztJAULI4xVatxbBasbKLbEw3K8CiRdDdbxMrLArS9EKDHQFYh6Tgfrm1PC2mIYR1xhu0hQ== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.0.6" - jest-get-type "^27.0.6" - pretty-format "^27.2.2" + parse-json "^5.2.0" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" jest-diff@^29.2.1: version "29.2.1" @@ -8948,120 +9220,96 @@ jest-diff@^29.2.1: jest-get-type "^29.2.0" pretty-format "^29.2.1" -jest-docblock@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.0.6.tgz#cc78266acf7fe693ca462cbbda0ea4e639e4e5f3" - integrity sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA== +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== dependencies: detect-newline "^3.0.0" -jest-each@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.2.2.tgz#62da8dd68b9fc61ab6e9e344692eeb1251f8c91d" - integrity sha512-ZCDhkvwHeXHsxoFxvW43fabL18iLiVDxaipG5XWG7dSd+XWXXpzMQvBWYT9Wvzhg5x4hvrLQ24LtiOKw3I09xA== +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.5.0" chalk "^4.0.0" - jest-get-type "^27.0.6" - jest-util "^27.2.0" - pretty-format "^27.2.2" - -jest-environment-jsdom@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.2.2.tgz#fb3075b4be6289961dcc4942e98f1862b3a8c4cb" - integrity sha512-mzCLEdnpGWDJmNB6WIPLlZM+hpXdeiya9TryiByqcUdpliNV1O+LGC2SewzjmB4IblabGfvr3KcPN0Nme2wnDw== - dependencies: - "@jest/environment" "^27.2.2" - "@jest/fake-timers" "^27.2.2" - "@jest/types" "^27.1.1" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-jsdom@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" + integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^27.1.1" - jest-util "^27.2.0" - jsdom "^16.6.0" - -jest-environment-node@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.2.2.tgz#60ba7d7fee956f68964d47a785d0195ce125aaa3" - integrity sha512-XgUscWs6H6UNqC96/QJjmUGZzzpql/JyprLSXVu7wkgM8tjbJdEkSqwrVAvJPm1yu526ImrmsIoh2BTHxkwL/g== - dependencies: - "@jest/environment" "^27.2.2" - "@jest/fake-timers" "^27.2.2" - "@jest/types" "^27.1.1" + jest-mock "^29.5.0" + jest-util "^29.5.0" + jsdom "^20.0.0" + +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" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^27.1.1" - jest-util "^27.2.0" - -jest-get-type@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.0.6.tgz#0eb5c7f755854279ce9b68a9f1a4122f69047cfe" - integrity sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg== + jest-mock "^29.5.0" + jest-util "^29.5.0" jest-get-type@^29.2.0: version "29.2.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== -jest-haste-map@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.2.2.tgz#81ccb57b1e1cd513aaaadf5016aad5dab0ede552" - integrity sha512-kaKiq+GbAvk6/sq++Ymor4Vzk6+lr0vbKs2HDVPdkKsHX2lIJRyvhypZG/QsNfQnROKWIZSpUpGuv2HySSosvA== +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@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== dependencies: - "@jest/types" "^27.1.1" - "@types/graceful-fs" "^4.1.2" + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^27.0.6" - jest-serializer "^27.0.6" - jest-util "^27.2.0" - jest-worker "^27.2.2" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" micromatch "^4.0.4" - walker "^1.0.7" + walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-jasmine2@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.2.2.tgz#bf87c8820a192c86b65a7c4c1a54caae52124f04" - integrity sha512-SczhZNfmZID9HbJ1GHhO4EzeL/PMRGeAUw23ddPUdd6kFijEZpT2yOxyNCBUKAsVQ/14OB60kjgnbuFOboZUNg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^27.2.2" - "@jest/source-map" "^27.0.6" - "@jest/test-result" "^27.2.2" - "@jest/types" "^27.1.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.2.2" - is-generator-fn "^2.0.0" - jest-each "^27.2.2" - jest-matcher-utils "^27.2.2" - jest-message-util "^27.2.2" - jest-runtime "^27.2.2" - jest-snapshot "^27.2.2" - jest-util "^27.2.0" - pretty-format "^27.2.2" - throat "^6.0.1" - -jest-leak-detector@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.2.2.tgz#5af54273efcf5114ad406f4448860c2396319e12" - integrity sha512-fQIYKkhXUs/4EpE4wO1AVsv7aNH3o0km1BGq3vxvSfYdwG9GLMf+b0z/ghLmBYNxb+tVpm/zv2caoKm3GfTazg== - dependencies: - jest-get-type "^27.0.6" - pretty-format "^27.2.2" - -jest-matcher-utils@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.2.2.tgz#a6c0a10dce6bfe8250bbed3e2f1b206568d73bde" - integrity sha512-xN3wT4p2i9DGB6zmL3XxYp5lJmq9Q6ff8XKlMtVVBS2SAshmgsPBALJFQ8dWRd2G/xf5q/N0SD0Mipt8QBA26A== +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" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== dependencies: - chalk "^4.0.0" - jest-diff "^27.2.2" - jest-get-type "^27.0.6" - pretty-format "^27.2.2" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" jest-matcher-utils@^29.2.2: version "29.2.2" @@ -9073,20 +9321,15 @@ jest-matcher-utils@^29.2.2: jest-get-type "^29.2.0" pretty-format "^29.2.1" -jest-message-util@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.2.2.tgz#cdbb1b82dfe5f601ae35f5c6a28bf7823e6bcf99" - integrity sha512-/iS5/m2FSF7Nn6APFoxFymJpyhB/gPf0CJa7uFSkbYaWvrADUfQ9NTsuyjpszKErOS2/huFs44ysWhlQTKvL8Q== +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" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.1.1" - "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.4" - pretty-format "^27.2.2" - slash "^3.0.0" - stack-utils "^2.0.3" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" jest-message-util@^29.2.1: version "29.2.1" @@ -9103,159 +9346,146 @@ jest-message-util@^29.2.1: slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^27.1.1: - version "27.1.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.1.1.tgz#c7a2e81301fdcf3dab114931d23d89ec9d0c3a82" - integrity sha512-SClsFKuYBf+6SSi8jtAYOuPw8DDMsTElUWEae3zq7vDhH01ayVSIHUSIa8UgbDOUalCFp6gNsaikN0rbxN4dbw== +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" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.5.0" "@types/node" "*" + jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.0.6.tgz#02e112082935ae949ce5d13b2675db3d8c87d9c5" - integrity sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ== +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.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.2.2.tgz#7467c67cb8b5630ec28e2f0c72a0b62e56668083" - integrity sha512-nvJS+DyY51HHdZnMIwXg7fimQ5ylFx4+quQXspQXde2rXYy+4v75UYoX/J65Ln8mKCNc6YF8HEhfGaRBOrxxHg== +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" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== dependencies: - "@jest/types" "^27.1.1" - jest-regex-util "^27.0.6" - jest-snapshot "^27.2.2" + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" -jest-resolve@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.2.2.tgz#1bad93dbc6c20edb874e6720e82e4e48900b120b" - integrity sha512-tfbHcBs/hJTb3fPQ/3hLWR+TsLNTzzK98TU+zIAsrL9nNzWfWROwopUOmiSUqmHMZW5t9au/433kSF2/Af+tTw== +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== dependencies: - "@jest/types" "^27.1.1" chalk "^4.0.0" - escalade "^3.1.1" - graceful-fs "^4.2.4" - jest-haste-map "^27.2.2" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" jest-pnp-resolver "^1.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" + jest-util "^29.5.0" + jest-validate "^29.5.0" resolve "^1.20.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.2.2.tgz#e719a8ce2a16575677105f692fdff7cd00602325" - integrity sha512-+bUFwBq+yTnvsOFuxetoQtkuOnqdAk2YuIGjlLmc7xLAXn/V1vjhXrLencgij0BUTTUvG9Aul3+5XDss4Wa8Eg== +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== dependencies: - "@jest/console" "^27.2.2" - "@jest/environment" "^27.2.2" - "@jest/test-result" "^27.2.2" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-docblock "^27.0.6" - jest-environment-jsdom "^27.2.2" - jest-environment-node "^27.2.2" - jest-haste-map "^27.2.2" - jest-leak-detector "^27.2.2" - jest-message-util "^27.2.2" - jest-resolve "^27.2.2" - jest-runtime "^27.2.2" - jest-util "^27.2.0" - jest-worker "^27.2.2" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.2.2.tgz#cc29d3adde948d531657a67d33c9f8d9bb58a6fc" - integrity sha512-PtTHCK5jT+KrIpKpjJsltu/dK5uGhBtTNLOk1Z+ZD2Jrxam2qQsOqDFYLszcK0jc2TLTNsrVpclqSftn7y3aXA== - dependencies: - "@jest/console" "^27.2.2" - "@jest/environment" "^27.2.2" - "@jest/fake-timers" "^27.2.2" - "@jest/globals" "^27.2.2" - "@jest/source-map" "^27.0.6" - "@jest/test-result" "^27.2.2" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" - "@types/yargs" "^16.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - execa "^5.0.0" - exit "^0.1.2" glob "^7.1.3" - graceful-fs "^4.2.4" - jest-haste-map "^27.2.2" - jest-message-util "^27.2.2" - jest-mock "^27.1.1" - jest-regex-util "^27.0.6" - jest-resolve "^27.2.2" - jest-snapshot "^27.2.2" - jest-util "^27.2.0" - jest-validate "^27.2.2" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^16.0.3" -jest-serializer@^27.0.6: - version "27.0.6" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.0.6.tgz#93a6c74e0132b81a2d54623251c46c498bb5bec1" - integrity sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA== +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" - -jest-snapshot@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.2.2.tgz#898f0eedde658e723461d3cdcaedb404e716fa01" - integrity sha512-7ODSvULMiiOVuuLvLZpDlpqqTqX9hDfdmijho5auVu9qRYREolvrvgH4kSNOKfcqV3EZOTuLKNdqsz1PM20PQA== - dependencies: - "@babel/core" "^7.7.2" + "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" - "@babel/parser" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.2.2" - "@jest/types" "^27.1.1" - "@types/babel__traverse" "^7.0.4" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^27.2.2" - graceful-fs "^4.2.4" - jest-diff "^27.2.2" - jest-get-type "^27.0.6" - jest-haste-map "^27.2.2" - jest-matcher-utils "^27.2.2" - jest-message-util "^27.2.2" - jest-resolve "^27.2.2" - jest-util "^27.2.0" + expect "^29.5.0" + graceful-fs "^4.2.9" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" natural-compare "^1.4.0" - pretty-format "^27.2.2" - semver "^7.3.2" - -jest-util@^27.2.0: - version "27.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.2.0.tgz#bfccb85cfafae752257319e825a5b8d4ada470dc" - integrity sha512-T5ZJCNeFpqcLBpx+Hl9r9KoxBCUqeWlJ1Htli+vryigZVJ1vuLB9j35grEBASp4R13KFkV7jM52bBGnArpJN6A== - dependencies: - "@jest/types" "^27.1.1" - "@types/node" "*" - chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^3.0.0" - picomatch "^2.2.3" + pretty-format "^29.5.0" + semver "^7.3.5" jest-util@^29.2.1: version "29.2.1" @@ -9269,29 +9499,42 @@ jest-util@^29.2.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.2.2.tgz#e672118f1d9aa57b25b4c7998edc101dabd7020b" - integrity sha512-01mwTAs2kgDuX98Ua3Xhdhp5lXsLU4eyg6k56adTtrXnU/GbLd9uAsh5nc4MWVtUXMeNmHUyEiD4ibLqE8MuNw== +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== dependencies: - "@jest/types" "^27.1.1" + "@jest/types" "^29.5.0" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^27.0.6" + jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^27.2.2" + pretty-format "^29.5.0" -jest-watcher@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.2.2.tgz#8b00253d7e880c6637b402228a76f2fe5ea08132" - integrity sha512-7HJwZq06BCfM99RacCVzXO90B20/dNJvq+Ouiu/VrFdFRCpbnnqlQUEk4KAhBSllgDrTPgKu422SCF5KKBHDRA== +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== dependencies: - "@jest/test-result" "^27.2.2" - "@jest/types" "^27.1.1" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^27.2.0" + emittery "^0.13.1" + jest-util "^29.5.0" string-length "^4.0.1" jest-webextension-mock@^3.7.22: @@ -9308,23 +9551,25 @@ jest-worker@^27.0.6: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.2.2.tgz#636deeae8068abbf2b34b4eb9505f8d4e5bd625c" - integrity sha512-aG1xq9KgWB2CPC8YdMIlI8uZgga2LFNcGbHJxO8ctfXAydSaThR4EewKQGg3tBOC+kS3vhPGgymsBdi9VINjPw== +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: "@types/node" "*" + jest-util "^29.5.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.2.2.tgz#445a4c16aa4c4ae6e512d62fb6f8b2624cbd6c26" - integrity sha512-XAB/9akDTe3/V0wPNKWfP9Y/NT1QPiCqyRBYGbC66EA9EvgAzdaFEqhFGLaDJ5UP2yIyXUMtju9a9IMrlYbZTQ== +jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== dependencies: - "@jest/core" "^27.2.2" + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" import-local "^3.0.2" - jest-cli "^27.2.2" + jest-cli "^29.5.0" js-sha3@0.8.0: version "0.8.0" @@ -9354,38 +9599,37 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -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== +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" 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" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" 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" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" jsesc@^2.5.1: version "2.5.2" @@ -9472,6 +9716,11 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsondiffpatch@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/jsondiffpatch/-/jsondiffpatch-0.4.1.tgz#9fb085036767f03534ebd46dcd841df6070c5773" @@ -10138,6 +10387,13 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -10192,12 +10448,12 @@ make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0: socks-proxy-agent "^6.0.0" ssri "^8.0.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.x" + tmpl "1.0.5" map2tree@^2.1.0: version "2.1.0" @@ -10229,11 +10485,11 @@ media-typer@0.3.0: integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memfs@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.3.tgz#a5cc1b11a0608f4e38feea9a94b957acba820af3" - integrity sha512-vDKa1icg0KDNzcOPBPAduFFb3YL+pLbQ/3hW7rRgUKpoliTAkPmVV7r/3qJ6YqKyIXEDhzsdSvLlEh137AfWUA== + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: - fs-monkey "1.0.3" + fs-monkey "^1.0.4" memoize-one@^5.0.0: version "5.2.1" @@ -10618,6 +10874,11 @@ node-releases@^1.1.75: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== +node-releases@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== + nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -10873,10 +11134,10 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== +nwsapi@^2.2.2: + version "2.2.5" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" + integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== oauth-sign@~0.9.0: version "0.9.0" @@ -11068,11 +11329,6 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -11192,7 +11448,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -11202,10 +11458,12 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -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" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" @@ -11316,6 +11574,11 @@ pg-connection-string@2.5.0: resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -11371,13 +11634,18 @@ pino@7.11.0: sonic-boom "^2.2.1" thread-stream "^0.15.1" -pirates@^4.0.0, pirates@^4.0.1: +pirates@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== dependencies: node-modules-regexp "^1.0.0" +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -11443,16 +11711,6 @@ pretty-bytes@^5.3.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-format@^27.0.0, pretty-format@^27.2.2: - version "27.2.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.2.2.tgz#c080f1ab7ac64302e4d438f208596fc649dbeeb3" - integrity sha512-+DdLh+rtaElc2SQOE/YPH8k2g3Rf2OXWEpy06p8Szs3hdVSYD87QOOlYRHWAeb/59XTmeVmRKvDD0svHqf6ycA== - dependencies: - "@jest/types" "^27.1.1" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" @@ -11471,6 +11729,15 @@ pretty-format@^29.0.0, pretty-format@^29.2.1: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + printj@~1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" @@ -11600,6 +11867,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + qr.js@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" @@ -11658,6 +11930,11 @@ querystring@^0.2.1: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -12142,6 +12419,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + reselect@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" @@ -12174,6 +12456,11 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" @@ -12331,10 +12618,10 @@ safe-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: xmlchars "^2.2.0" @@ -12776,18 +13063,18 @@ sonic-boom@^2.2.1: dependencies: atomic-sleep "^1.0.0" -source-map-support@^0.5.16, source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.6: - version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== +source-map-support@^0.5.16, source-map-support@~0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -13160,7 +13447,7 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.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== @@ -13174,14 +13461,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - 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" @@ -13252,14 +13531,6 @@ tarn@^3.0.1: resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== -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" - terser-webpack-plugin@*, terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.1.3: version "5.2.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz#4852c91f709a4ea2bcf324cf48e7e88124cda0cc" @@ -13302,11 +13573,6 @@ thread-stream@^0.15.1: dependencies: real-require "^0.1.0" -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -13356,7 +13622,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmpl@1.0.x: +tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== @@ -13383,14 +13649,15 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tough-cookie@~2.5.0: version "2.5.0" @@ -13407,6 +13674,13 @@ tr46@^2.1.0: 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" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -13548,10 +13822,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.3.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.2.tgz#6d618640d430e3569a1dfb44f7d7e600ced3ee86" - integrity sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ== +typescript@^5.0.4: + version "5.1.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.5.tgz#a3ae755082488b6046fe64345d293ef26af08671" + integrity sha512-FOH+WN/DQjUvN6WgW+c4Ml3yi0PH+a/8q+kNIfRehv1wLhWONedw85iu+vQ39Wp49IzTJEsZ2lyLXpBF7mkF1g== typeson-registry@^1.0.0-alpha.20: version "1.0.0-alpha.39" @@ -13633,11 +13907,16 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -13648,6 +13927,14 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -13662,6 +13949,14 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -13725,14 +14020,14 @@ v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.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.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz#4229f2a99e367f3f018fa1d5c2b8ec684667c69c" - integrity sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg== +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" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" - source-map "^0.7.3" validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" @@ -13808,31 +14103,24 @@ void-elements@3.1.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== -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== +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: - xml-name-validator "^3.0.0" + xml-name-validator "^4.0.0" walk-up-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== -walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= +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== dependencies: - makeerror "1.0.x" + makeerror "1.0.12" watchpack@^2.2.0: version "2.2.0" @@ -13889,16 +14177,16 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -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" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + webpack-cli@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.5.0.tgz#b5213b84adf6e1f5de6391334c9fa53a48850466" @@ -14016,23 +14304,26 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -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== +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: - iconv-lite "0.4.24" - -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== + iconv-lite "0.6.3" whatwg-mimetype@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -14041,7 +14332,7 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^8.0.0, whatwg-url@^8.4.0, whatwg-url@^8.5.0: +whatwg-url@^8.4.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== @@ -14135,7 +14426,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: +write-file-atomic@^3.0.3: 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== @@ -14145,6 +14436,14 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: 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" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + ws@7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" @@ -14155,11 +14454,6 @@ ws@7.5.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== -ws@^7.4.6: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== - ws@^7.5.0: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" @@ -14170,10 +14464,15 @@ ws@^7.5.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -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== +ws@^8.11.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +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" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xmlchars@^2.2.0: version "2.2.0" @@ -14193,6 +14492,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -14203,23 +14507,23 @@ yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^20.2.2: - 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.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.0.3: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.1.1" yauzl@^2.10.0: version "2.10.0" From 1acca3b8daf38ec6393e431204baee6f31d16647 Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Wed, 28 Jun 2023 16:38:51 +0200 Subject: [PATCH 09/13] Add new unit tests to test encryption with Argon2 --- .../tests/encryption.unit.test.ts | 231 +++++++++--------- .../tests/storage.unit.test.ts | 101 ++++++++ 2 files changed, 220 insertions(+), 112 deletions(-) create mode 100644 background/services/internal-signer/tests/storage.unit.test.ts diff --git a/background/services/internal-signer/tests/encryption.unit.test.ts b/background/services/internal-signer/tests/encryption.unit.test.ts index 276a86ff4c..118e326a23 100644 --- a/background/services/internal-signer/tests/encryption.unit.test.ts +++ b/background/services/internal-signer/tests/encryption.unit.test.ts @@ -5,126 +5,133 @@ import { VaultVersion, } from "../encryption" -describe("Encryption utils", () => { - it("derives symmetric keys", async () => { - /* eslint-disable no-await-in-loop */ - for (let i = 0; i < 5; i += 1) { - const password = Buffer.from( - global.crypto.getRandomValues(new Uint8Array(16)) - ).toString("base64") - const newSalt = Buffer.from( - global.crypto.getRandomValues(new Uint8Array(16)) - ).toString("base64") - - const { key, salt } = await deriveSymmetricKeyFromPassword( - VaultVersion.PBKDF2, - password, - newSalt - ) - expect(salt).toEqual(newSalt) - - expect(new Set(key.usages)).toEqual(new Set(["encrypt", "decrypt"])) - } - /* eslint-enable no-await-in-loop */ - }) - - it("doesn't throw when encrypting a vault with a password", async () => { - const vault = { a: 1 } - const password = "this-is-a-poor-password" - await encryptVault({ - version: VaultVersion.PBKDF2, - vault, - passwordOrSaltedKey: password, - }) - }) - - it("avoids couple common footguns when encrypting a vault with a password", async () => { - const vault = { thisIsAnInterestingKey: "sentinel" } - const password = "this-is-a-poor-password" - const newVault = await encryptVault({ - version: VaultVersion.PBKDF2, - vault, - passwordOrSaltedKey: password, - }) - // ensure sensitive plaintext isn't in the output, with a couple simple - // transformations. Note this *doesn't* show correctness of encryption — a - // simple substitution cipher would still pass this — it's just a smoke test. - const importantPlaintext = ["thisIsAnInterestingKey", "sentinel", password] - const serializedVault = JSON.stringify(newVault) - importantPlaintext.forEach((t) => { - expect(serializedVault).not.toContain(t) - expect(serializedVault).not.toContain(t.toLowerCase()) - expect(serializedVault).not.toContain(Buffer.from(t).toString("base64")) - }) - }) - - it("can decrypt a vault encrypted with a password", async () => { - const vault = { a: 1 } - const password = "this-is-a-poor-password" - const encryptedVault = await encryptVault({ - version: VaultVersion.PBKDF2, - vault, - passwordOrSaltedKey: password, +describe.each([VaultVersion.PBKDF2, VaultVersion.Argon2])( + "Encryption utils", + (vaultVersion) => { + it("derives symmetric keys", async () => { + /* eslint-disable no-await-in-loop */ + for (let i = 0; i < 5; i += 1) { + const password = Buffer.from( + global.crypto.getRandomValues(new Uint8Array(16)) + ).toString("base64") + const newSalt = Buffer.from( + global.crypto.getRandomValues(new Uint8Array(16)) + ).toString("base64") + + const { key, salt } = await deriveSymmetricKeyFromPassword( + vaultVersion, + password, + newSalt + ) + expect(salt).toEqual(newSalt) + + expect(new Set(key.usages)).toEqual(new Set(["encrypt", "decrypt"])) + } + /* eslint-enable no-await-in-loop */ }) - const newVault = await decryptVault({ - version: VaultVersion.PBKDF2, - vault: encryptedVault, - passwordOrSaltedKey: password, + it("doesn't throw when encrypting a vault with a password", async () => { + const vault = { a: 1 } + const password = "this-is-a-poor-password" + await encryptVault({ + version: vaultVersion, + vault, + passwordOrSaltedKey: password, + }) }) - expect(newVault).toEqual(vault) - }) - - it("can decrypt a complex vault encrypted with a password", async () => { - const vault = { - a: { b: [1, 2, 3] }, - c: null, - d: 123, - } - const password = "this-is-a-poor-password" - const encryptedVault = await encryptVault({ - version: VaultVersion.PBKDF2, - vault, - passwordOrSaltedKey: password, + it("avoids couple common footguns when encrypting a vault with a password", async () => { + const vault = { thisIsAnInterestingKey: "sentinel" } + const password = "this-is-a-poor-password" + const newVault = await encryptVault({ + version: vaultVersion, + vault, + passwordOrSaltedKey: password, + }) + // ensure sensitive plaintext isn't in the output, with a couple simple + // transformations. Note this *doesn't* show correctness of encryption — a + // simple substitution cipher would still pass this — it's just a smoke test. + const importantPlaintext = [ + "thisIsAnInterestingKey", + "sentinel", + password, + ] + const serializedVault = JSON.stringify(newVault) + importantPlaintext.forEach((t) => { + expect(serializedVault).not.toContain(t) + expect(serializedVault).not.toContain(t.toLowerCase()) + expect(serializedVault).not.toContain(Buffer.from(t).toString("base64")) + }) }) - const newVault = await decryptVault({ - version: VaultVersion.PBKDF2, - vault: encryptedVault, - passwordOrSaltedKey: password, + it("can decrypt a vault encrypted with a password", async () => { + const vault = { a: 1 } + const password = "this-is-a-poor-password" + const encryptedVault = await encryptVault({ + version: vaultVersion, + vault, + passwordOrSaltedKey: password, + }) + + const newVault = await decryptVault({ + version: vaultVersion, + vault: encryptedVault, + passwordOrSaltedKey: password, + }) + + expect(newVault).toEqual(vault) }) - expect(newVault).toEqual(vault) - }) - - it("can decrypt a complex vault encrypted with a password", async () => { - const vault = { - a: { b: [1, 2, 3] }, - c: null, - d: 123, - } - const password = Buffer.from( - global.crypto.getRandomValues(new Uint8Array(16)) - ).toString("base64") - - const saltedKey = await deriveSymmetricKeyFromPassword( - VaultVersion.PBKDF2, - password - ) - - const encryptedVault = await encryptVault({ - version: VaultVersion.PBKDF2, - vault, - passwordOrSaltedKey: saltedKey, + it("can decrypt a complex vault encrypted with a password", async () => { + const vault = { + a: { b: [1, 2, 3] }, + c: null, + d: 123, + } + const password = "this-is-a-poor-password" + const encryptedVault = await encryptVault({ + version: vaultVersion, + vault, + passwordOrSaltedKey: password, + }) + + const newVault = await decryptVault({ + version: vaultVersion, + vault: encryptedVault, + passwordOrSaltedKey: password, + }) + + expect(newVault).toEqual(vault) }) - const newVault = await decryptVault({ - version: VaultVersion.PBKDF2, - vault: encryptedVault, - passwordOrSaltedKey: saltedKey, - }) + it("can decrypt a complex vault encrypted with a password", async () => { + const vault = { + a: { b: [1, 2, 3] }, + c: null, + d: 123, + } + const password = Buffer.from( + global.crypto.getRandomValues(new Uint8Array(16)) + ).toString("base64") - expect(newVault).toEqual(vault) - }) -}) + const saltedKey = await deriveSymmetricKeyFromPassword( + vaultVersion, + password + ) + + const encryptedVault = await encryptVault({ + version: vaultVersion, + vault, + passwordOrSaltedKey: saltedKey, + }) + + const newVault = await decryptVault({ + version: vaultVersion, + vault: encryptedVault, + passwordOrSaltedKey: saltedKey, + }) + + expect(newVault).toEqual(vault) + }) + } +) diff --git a/background/services/internal-signer/tests/storage.unit.test.ts b/background/services/internal-signer/tests/storage.unit.test.ts new file mode 100644 index 0000000000..20fb86ff2e --- /dev/null +++ b/background/services/internal-signer/tests/storage.unit.test.ts @@ -0,0 +1,101 @@ +import { + EncryptedVault, + VaultVersion, + decryptVault, + encryptVault, +} from "../encryption" +import { + getEncryptedVaults, + migrateVaultsToArgon, + writeLatestEncryptedVault, +} from "../storage" + +const mockedPassword = "password" +const mockedVault = { text: "secret" } + +describe("Storage utils", () => { + let vaultEncryptedWithPBKDF2: EncryptedVault + let vaultEncryptedWithArgon2: EncryptedVault + + beforeAll(async () => { + vaultEncryptedWithPBKDF2 = await encryptVault({ + vault: mockedVault, + passwordOrSaltedKey: mockedPassword, + version: VaultVersion.PBKDF2, + }) + + vaultEncryptedWithArgon2 = await encryptVault({ + vault: mockedVault, + passwordOrSaltedKey: mockedPassword, + version: VaultVersion.Argon2, + }) + }) + + it("should be able to store and retrieve data encrypted with PBKDF2", async () => { + await browser.storage.local.set({ + tallyVaults: { + version: VaultVersion.PBKDF2, + vaults: [], + }, + }) + await writeLatestEncryptedVault(vaultEncryptedWithPBKDF2) + + const { vaults, version } = await getEncryptedVaults() + + expect(version).toEqual(VaultVersion.PBKDF2) + expect(vaults.length).toEqual(1) + expect(vaults[0].vault).toEqual(vaultEncryptedWithPBKDF2) + }) + + it("should be able to store and retrieve data encrypted with Argon2", async () => { + await browser.storage.local.set({ + tallyVaults: { + version: VaultVersion.Argon2, + vaults: [], + }, + }) + await writeLatestEncryptedVault(vaultEncryptedWithArgon2) + + const { vaults, version } = await getEncryptedVaults() + + expect(version).toEqual(VaultVersion.Argon2) + expect(vaults.length).toEqual(1) + expect(vaults[0].vault).toEqual(vaultEncryptedWithArgon2) + }) + + it("shoould migrate existing vaults to Argon2", async () => { + await browser.storage.local.set({ + tallyVaults: { + version: VaultVersion.PBKDF2, + vaults: [], + }, + }) + await writeLatestEncryptedVault(vaultEncryptedWithPBKDF2) + + const { vaults, version } = await migrateVaultsToArgon(mockedPassword) + + expect(version).toEqual(VaultVersion.Argon2) + expect(vaults.length).toEqual(1) + + const decryptedVault = await decryptVault({ + version: VaultVersion.Argon2, + vault: vaults[0].vault, + passwordOrSaltedKey: mockedPassword, + }) + expect(decryptedVault).toEqual(mockedVault) + }) + + it("should not migrate vaults if they are already encrypted with Argon2", async () => { + await browser.storage.local.set({ + tallyVaults: { + version: VaultVersion.Argon2, + vaults: [], + }, + }) + await writeLatestEncryptedVault(vaultEncryptedWithArgon2) + + const { vaults } = await migrateVaultsToArgon(mockedPassword) + + expect(vaults[0].vault).toEqual(vaultEncryptedWithArgon2) + }) +}) From 02160361f76846bcddec97c220c4aef95264d664 Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Wed, 28 Jun 2023 16:46:36 +0200 Subject: [PATCH 10/13] Add `ignoreRestSiblings` to `no-unused-vars` lint rule Allow destructuring objects to remove unwanted fields from the objects. This is pattern we are using often across the codebase. --- .eslintrc.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index b8c317951c..66aab2446f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -94,7 +94,11 @@ module.exports = { ], "@typescript-eslint/no-unused-vars": [ "error", - { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }, + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, ], "no-unused-vars": "off", }, From ac79ba4379da917c4322639677fef371311e99bc Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Thu, 29 Jun 2023 11:04:58 +0200 Subject: [PATCH 11/13] Adjust `no-unused-vars` rule to use `_` for unused elements --- .eslintrc.js | 1 - background/lib/token-lists.ts | 2 +- background/redux-slices/migrations/to-14.ts | 2 +- background/redux-slices/migrations/to-16.ts | 7 +++++-- background/redux-slices/migrations/to-19.ts | 2 +- background/redux-slices/migrations/to-22.ts | 2 +- background/redux-slices/migrations/to-29.ts | 2 +- background/redux-slices/migrations/to-3.ts | 2 +- background/redux-slices/migrations/to-30.ts | 2 +- background/redux-slices/migrations/to-32.ts | 2 +- background/redux-slices/migrations/to-4.ts | 2 +- background/services/internal-signer/index.ts | 2 +- background/services/ledger/index.ts | 4 ++-- .../Signer/SignerLedger/SignerLedgerSigning/index.tsx | 2 +- 14 files changed, 18 insertions(+), 16 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 66aab2446f..bfc7c4a14f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -97,7 +97,6 @@ module.exports = { { argsIgnorePattern: "^_", varsIgnorePattern: "^_", - ignoreRestSiblings: true, }, ], "no-unused-vars": "off", diff --git a/background/lib/token-lists.ts b/background/lib/token-lists.ts index b19dc97730..c8e7cdeb8c 100644 --- a/background/lib/token-lists.ts +++ b/background/lib/token-lists.ts @@ -22,7 +22,7 @@ import { DeepWriteable } from "../types" const cleanTokenListResponse = (json: any, url: string) => { if (url.includes("api-polygon-tokens.polygon.technology")) { if (typeof json === "object" && json !== null && "tags" in json) { - const { tags, ...cleanedJson } = json + const { tags: _, ...cleanedJson } = json return cleanedJson } } diff --git a/background/redux-slices/migrations/to-14.ts b/background/redux-slices/migrations/to-14.ts index 3ebc42843c..3495855d80 100644 --- a/background/redux-slices/migrations/to-14.ts +++ b/background/redux-slices/migrations/to-14.ts @@ -5,7 +5,7 @@ export default ( prevState: Record ): Record => { - const { assets, ...newState } = prevState + const { assets: _, ...newState } = prevState // Clear assets collection; these should be immediately repopulated by the // IndexingService in startService. diff --git a/background/redux-slices/migrations/to-16.ts b/background/redux-slices/migrations/to-16.ts index d409011a43..94d359c9d4 100644 --- a/background/redux-slices/migrations/to-16.ts +++ b/background/redux-slices/migrations/to-16.ts @@ -96,8 +96,11 @@ export default (prevState: Record): NewState => { : {}, } - const { spenderName, spenderAddress, ...oldAnnotationProps } = - annotation + const { + spenderName: __, + spenderAddress: ___, + ...oldAnnotationProps + } = annotation newState.activities[address][chainID].entities[ activityItem.hash diff --git a/background/redux-slices/migrations/to-19.ts b/background/redux-slices/migrations/to-19.ts index 236d36caf6..f2be1db7c5 100644 --- a/background/redux-slices/migrations/to-19.ts +++ b/background/redux-slices/migrations/to-19.ts @@ -1,7 +1,7 @@ export default ( prevState: Record ): Record => { - const { activities, ...newState } = prevState + const { activities: _, ...newState } = prevState // Clear activities slice as we now have new activities slice instead newState.activities = {} diff --git a/background/redux-slices/migrations/to-22.ts b/background/redux-slices/migrations/to-22.ts index 3ebc42843c..3495855d80 100644 --- a/background/redux-slices/migrations/to-22.ts +++ b/background/redux-slices/migrations/to-22.ts @@ -5,7 +5,7 @@ export default ( prevState: Record ): Record => { - const { assets, ...newState } = prevState + const { assets: _, ...newState } = prevState // Clear assets collection; these should be immediately repopulated by the // IndexingService in startService. diff --git a/background/redux-slices/migrations/to-29.ts b/background/redux-slices/migrations/to-29.ts index b727bae737..19b79987ba 100644 --- a/background/redux-slices/migrations/to-29.ts +++ b/background/redux-slices/migrations/to-29.ts @@ -4,7 +4,7 @@ export default ( prevState: Record ): Record => { - const { assets, ...newState } = prevState + const { assets: _, ...newState } = prevState // Clear assets collection; these should be immediately repopulated by the // IndexingService in startService. diff --git a/background/redux-slices/migrations/to-3.ts b/background/redux-slices/migrations/to-3.ts index 3ebc42843c..3495855d80 100644 --- a/background/redux-slices/migrations/to-3.ts +++ b/background/redux-slices/migrations/to-3.ts @@ -5,7 +5,7 @@ export default ( prevState: Record ): Record => { - const { assets, ...newState } = prevState + const { assets: _, ...newState } = prevState // Clear assets collection; these should be immediately repopulated by the // IndexingService in startService. diff --git a/background/redux-slices/migrations/to-30.ts b/background/redux-slices/migrations/to-30.ts index 04e0fc0ed6..2a0aab83e4 100644 --- a/background/redux-slices/migrations/to-30.ts +++ b/background/redux-slices/migrations/to-30.ts @@ -11,7 +11,7 @@ type NewState = { // Remove old nfts slice and rename updated nfts slice export default (prevState: Record): NewState => { - const { nfts, nftsUpdate, ...otherState } = prevState as OldState + const { nfts: _, nftsUpdate, ...otherState } = prevState as OldState return { ...otherState, diff --git a/background/redux-slices/migrations/to-32.ts b/background/redux-slices/migrations/to-32.ts index 9abf89f394..d9d750d466 100644 --- a/background/redux-slices/migrations/to-32.ts +++ b/background/redux-slices/migrations/to-32.ts @@ -25,7 +25,7 @@ type NewState = { export default (prevState: Record): NewState => { const oldState = prevState as OldState const { - keyrings: { keyringMetadata, importing, ...keyringsState }, + keyrings: { keyringMetadata, importing: _, ...keyringsState }, ...stateWithoutKeyrings } = oldState diff --git a/background/redux-slices/migrations/to-4.ts b/background/redux-slices/migrations/to-4.ts index 39907c8ac5..2fc70507d8 100644 --- a/background/redux-slices/migrations/to-4.ts +++ b/background/redux-slices/migrations/to-4.ts @@ -39,7 +39,7 @@ export default ( }, } - const { blocks, ...oldStateAccountWithoutBlocks } = oldState.account ?? { + const { blocks: _, ...oldStateAccountWithoutBlocks } = oldState.account ?? { blocks: undefined, } diff --git a/background/services/internal-signer/index.ts b/background/services/internal-signer/index.ts index 6a3e368fbe..e4e1457cad 100644 --- a/background/services/internal-signer/index.ts +++ b/background/services/internal-signer/index.ts @@ -956,7 +956,7 @@ export default class InternalSignerService extends BaseService { } // When signing we should not include EIP712Domain type - const { EIP712Domain, ...typesForSigning } = types + const { EIP712Domain: _, ...typesForSigning } = types try { let signature: string if (isPrivateKey(signerWithType)) { diff --git a/background/services/ledger/index.ts b/background/services/ledger/index.ts index 9ece396e8c..6be273bef6 100644 --- a/background/services/ledger/index.ts +++ b/background/services/ledger/index.ts @@ -396,7 +396,7 @@ export default class LedgerService extends BaseService { if (!isEIP1559TransactionRequest(ethersTx)) { // Ethers does not permit "from" field when serializing legacy transaction requests - const { from, ...fieldsWithoutFrom } = ethersTx + const { from: _, ...fieldsWithoutFrom } = ethersTx serializableEthersTx = fieldsWithoutFrom } @@ -492,7 +492,7 @@ export default class LedgerService extends BaseService { } const eth = new Eth(this.transport) - const { EIP712Domain, ...typesForSigning } = typedData.types + const { EIP712Domain: _, ...typesForSigning } = typedData.types const hashedDomain = _TypedDataEncoder.hashDomain(typedData.domain) const hashedMessage = _TypedDataEncoder .from(typesForSigning) diff --git a/ui/components/Signing/Signer/SignerLedger/SignerLedgerSigning/index.tsx b/ui/components/Signing/Signer/SignerLedger/SignerLedgerSigning/index.tsx index f3051d576b..ae59a7bafd 100644 --- a/ui/components/Signing/Signer/SignerLedger/SignerLedgerSigning/index.tsx +++ b/ui/components/Signing/Signer/SignerLedger/SignerLedgerSigning/index.tsx @@ -55,7 +55,7 @@ function SignerLedgerSigningTypedData({ }: { typedData: EIP712TypedData }): ReactElement { - const { EIP712Domain, ...typesForSigning } = typedData.types + const { EIP712Domain: _, ...typesForSigning } = typedData.types const domainHash = _TypedDataEncoder .hashDomain(typedData.domain) .toUpperCase() From a5691686502ae1c4ad06943663e151c338d8677f Mon Sep 17 00:00:00 2001 From: Jagoda Berry Rybacka Date: Fri, 30 Jun 2023 10:49:13 +0200 Subject: [PATCH 12/13] Refactor Argon migration function - return `success` boolean - make sure decrypted vaults match - send event on migration fail --- background/lib/posthog.ts | 3 ++- background/services/internal-signer/index.ts | 11 +++++++-- .../services/internal-signer/storage.ts | 24 +++++++++++++++---- .../tests/storage.unit.test.ts | 15 +++++++++--- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/background/lib/posthog.ts b/background/lib/posthog.ts index 08d9caefe1..d7b056e1cf 100644 --- a/background/lib/posthog.ts +++ b/background/lib/posthog.ts @@ -18,7 +18,8 @@ export enum OneTimeAnalyticsEvent { ONBOARDING_STARTED = "Onboarding Started", ONBOARDING_FINISHED = "Onboarding Finished", CHAIN_ADDED = "Chain Added", - ARGON_MIGRATION = "Vaults migrated to Argon2", + ARGON_MIGRATION = "Migrate to Argon2", + ARGON_MIGRATION_FAILED = "Migrate to Argon2 failed", } export const isOneTimeAnalyticsEvent = ( diff --git a/background/services/internal-signer/index.ts b/background/services/internal-signer/index.ts index e4e1457cad..6757e8e9b9 100644 --- a/background/services/internal-signer/index.ts +++ b/background/services/internal-signer/index.ts @@ -277,13 +277,20 @@ export default class InternalSignerService extends BaseService { return true } - const { vaults, version } = await migrateVaultsToArgon(password) + const { + encryptedData: { vaults, version }, + success, + } = await migrateVaultsToArgon(password) this.#cachedVaultVersion = version - if (version === VaultVersion.Argon2) { + if (success) { this.analyticsService.sendOneTimeAnalyticsEvent( OneTimeAnalyticsEvent.ARGON_MIGRATION ) + } else { + this.analyticsService.sendOneTimeAnalyticsEvent( + OneTimeAnalyticsEvent.ARGON_MIGRATION_FAILED + ) } if (!ignoreExistingVaults) { diff --git a/background/services/internal-signer/storage.ts b/background/services/internal-signer/storage.ts index e27992af76..602df58c7d 100644 --- a/background/services/internal-signer/storage.ts +++ b/background/services/internal-signer/storage.ts @@ -98,10 +98,10 @@ export async function writeLatestEncryptedVault( export async function migrateVaultsToArgon( password: string -): Promise { +): Promise<{ encryptedData: SerializedEncryptedVaults; success: boolean }> { const serializedVaults = await getEncryptedVaults() if (serializedVaults.version === VaultVersion.Argon2) { - return serializedVaults + return { encryptedData: serializedVaults, success: true } } const { vaults } = serializedVaults @@ -128,6 +128,22 @@ export async function migrateVaultsToArgon( passwordOrSaltedKey: newSaltedKey, }) + // try to decrypt the new vault to make sure it's valid + const newDecryptedVault = await decryptVault({ + version: VaultVersion.Argon2, + vault: newEncryptedVault, + passwordOrSaltedKey: newSaltedKey, + }) + + if ( + JSON.stringify(newDecryptedVault) !== + JSON.stringify(deprecatedDecryptedVault) + ) { + throw new Error( + "Failed to migrate vaults to Argon2. Decrypted vaults do not match." + ) + } + return { timeSaved, vault: newEncryptedVault, @@ -144,9 +160,9 @@ export async function migrateVaultsToArgon( tallyVaults: newSerializedVaults, }) - return newSerializedVaults + return { encryptedData: newSerializedVaults, success: true } } catch (error) { logger.error("Failed to migrate vaults to Argon2") - return serializedVaults + return { encryptedData: serializedVaults, success: false } } } diff --git a/background/services/internal-signer/tests/storage.unit.test.ts b/background/services/internal-signer/tests/storage.unit.test.ts index 20fb86ff2e..f38105ea6b 100644 --- a/background/services/internal-signer/tests/storage.unit.test.ts +++ b/background/services/internal-signer/tests/storage.unit.test.ts @@ -63,7 +63,7 @@ describe("Storage utils", () => { expect(vaults[0].vault).toEqual(vaultEncryptedWithArgon2) }) - it("shoould migrate existing vaults to Argon2", async () => { + it("should migrate existing vaults to Argon2", async () => { await browser.storage.local.set({ tallyVaults: { version: VaultVersion.PBKDF2, @@ -72,8 +72,12 @@ describe("Storage utils", () => { }) await writeLatestEncryptedVault(vaultEncryptedWithPBKDF2) - const { vaults, version } = await migrateVaultsToArgon(mockedPassword) + const { + encryptedData: { vaults, version }, + success, + } = await migrateVaultsToArgon(mockedPassword) + expect(success).toEqual(true) expect(version).toEqual(VaultVersion.Argon2) expect(vaults.length).toEqual(1) @@ -94,8 +98,13 @@ describe("Storage utils", () => { }) await writeLatestEncryptedVault(vaultEncryptedWithArgon2) - const { vaults } = await migrateVaultsToArgon(mockedPassword) + const { + encryptedData: { vaults, version }, + success, + } = await migrateVaultsToArgon(mockedPassword) + expect(success).toEqual(true) + expect(version).toEqual(VaultVersion.Argon2) expect(vaults[0].vault).toEqual(vaultEncryptedWithArgon2) }) }) From d0e29081a221f4a3269bcdd6d57e3c9f367e77da Mon Sep 17 00:00:00 2001 From: Antonio Salazar Cardozo Date: Sun, 2 Jul 2023 15:01:28 -0400 Subject: [PATCH 13/13] Track vault migrations and errors generically Vault migration is no longer tracked as Argon2 specifically, but generically for all migrations. Already-migrated vaults are not tracked, and the migration function return value reflects that no migration was performed. Additionally, error messages are bubbled out of the migration function and reported up to the caller. The main outcome here is that PostHog migration events include the migrated-to version, and PostHog migration failure events include the error message. This will leave us open to future migrations, and will let us know if there are certain failures that are happening broadly that we may be able to do something about. Notably, wrong passwords will be tracked as migration errors if a wrong password is typed with an older vault version in the mix. Mitigating this may or may not be a good idea. --- background/lib/posthog.ts | 4 +- background/services/internal-signer/index.ts | 23 +++++------ .../services/internal-signer/storage.ts | 26 +++++++++---- .../tests/storage.unit.test.ts | 39 +++++++++++++++---- 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/background/lib/posthog.ts b/background/lib/posthog.ts index d7b056e1cf..c55e112275 100644 --- a/background/lib/posthog.ts +++ b/background/lib/posthog.ts @@ -12,14 +12,14 @@ export enum AnalyticsEvent { NEW_ACCOUNT_TO_TRACK = "Address added to tracking on network", CUSTOM_CHAIN_ADDED = "Custom chain added", DAPP_CONNECTED = "Dapp Connected", + VAULT_MIGRATION = "Migrate to newer vault version", + VAULT_MIGRATION_FAILED = "Vault version migration failed", } export enum OneTimeAnalyticsEvent { ONBOARDING_STARTED = "Onboarding Started", ONBOARDING_FINISHED = "Onboarding Finished", CHAIN_ADDED = "Chain Added", - ARGON_MIGRATION = "Migrate to Argon2", - ARGON_MIGRATION_FAILED = "Migrate to Argon2 failed", } export const isOneTimeAnalyticsEvent = ( diff --git a/background/services/internal-signer/index.ts b/background/services/internal-signer/index.ts index 6757e8e9b9..a612012800 100644 --- a/background/services/internal-signer/index.ts +++ b/background/services/internal-signer/index.ts @@ -8,7 +8,7 @@ import { normalizeEVMAddress, sameEVMAddress } from "../../lib/utils" import { ServiceCreatorFunction, ServiceLifecycleEvents } from "../types" import { getEncryptedVaults, - migrateVaultsToArgon, + migrateVaultsToLatestVersion, writeLatestEncryptedVault, } from "./storage" import { @@ -30,7 +30,7 @@ import logger from "../../lib/logger" import PreferenceService from "../preferences" import { DEFAULT_AUTOLOCK_INTERVAL } from "../preferences/defaults" import AnalyticsService from "../analytics" -import { OneTimeAnalyticsEvent } from "../../lib/posthog" +import { AnalyticsEvent } from "../../lib/posthog" export enum SignerInternalTypes { mnemonicBIP39S128 = "mnemonic#bip39:128", @@ -279,17 +279,18 @@ export default class InternalSignerService extends BaseService { const { encryptedData: { vaults, version }, - success, - } = await migrateVaultsToArgon(password) + ...migrationResults + } = await migrateVaultsToLatestVersion(password) this.#cachedVaultVersion = version - if (success) { - this.analyticsService.sendOneTimeAnalyticsEvent( - OneTimeAnalyticsEvent.ARGON_MIGRATION - ) - } else { - this.analyticsService.sendOneTimeAnalyticsEvent( - OneTimeAnalyticsEvent.ARGON_MIGRATION_FAILED + if (migrationResults.migrated) { + this.analyticsService.sendAnalyticsEvent(AnalyticsEvent.VAULT_MIGRATION, { + version, + }) + } else if (migrationResults.errorMessage !== undefined) { + this.analyticsService.sendAnalyticsEvent( + AnalyticsEvent.VAULT_MIGRATION_FAILED, + { error: migrationResults.errorMessage } ) } diff --git a/background/services/internal-signer/storage.ts b/background/services/internal-signer/storage.ts index 602df58c7d..7866485511 100644 --- a/background/services/internal-signer/storage.ts +++ b/background/services/internal-signer/storage.ts @@ -96,12 +96,20 @@ export async function writeLatestEncryptedVault( } } -export async function migrateVaultsToArgon( - password: string -): Promise<{ encryptedData: SerializedEncryptedVaults; success: boolean }> { +export async function migrateVaultsToLatestVersion(password: string): Promise< + | { + encryptedData: SerializedEncryptedVaults + migrated: true + } + | { + encryptedData: SerializedEncryptedVaults + migrated: false + errorMessage?: string + } +> { const serializedVaults = await getEncryptedVaults() if (serializedVaults.version === VaultVersion.Argon2) { - return { encryptedData: serializedVaults, success: true } + return { encryptedData: serializedVaults, migrated: false } } const { vaults } = serializedVaults @@ -160,9 +168,13 @@ export async function migrateVaultsToArgon( tallyVaults: newSerializedVaults, }) - return { encryptedData: newSerializedVaults, success: true } + return { encryptedData: newSerializedVaults, migrated: true } } catch (error) { - logger.error("Failed to migrate vaults to Argon2") - return { encryptedData: serializedVaults, success: false } + logger.error("Failed to migrate vaults to Argon2", error) + return { + encryptedData: serializedVaults, + migrated: false, + errorMessage: String(error), + } } } diff --git a/background/services/internal-signer/tests/storage.unit.test.ts b/background/services/internal-signer/tests/storage.unit.test.ts index f38105ea6b..4ca65dd0da 100644 --- a/background/services/internal-signer/tests/storage.unit.test.ts +++ b/background/services/internal-signer/tests/storage.unit.test.ts @@ -6,7 +6,7 @@ import { } from "../encryption" import { getEncryptedVaults, - migrateVaultsToArgon, + migrateVaultsToLatestVersion, writeLatestEncryptedVault, } from "../storage" @@ -74,10 +74,10 @@ describe("Storage utils", () => { const { encryptedData: { vaults, version }, - success, - } = await migrateVaultsToArgon(mockedPassword) + migrated, + } = await migrateVaultsToLatestVersion(mockedPassword) - expect(success).toEqual(true) + expect(migrated).toEqual(true) expect(version).toEqual(VaultVersion.Argon2) expect(vaults.length).toEqual(1) @@ -100,11 +100,36 @@ describe("Storage utils", () => { const { encryptedData: { vaults, version }, - success, - } = await migrateVaultsToArgon(mockedPassword) + ...migrationData + } = await migrateVaultsToLatestVersion(mockedPassword) - expect(success).toEqual(true) + expect(migrationData.migrated).toEqual(false) + expect( + migrationData.migrated === false && migrationData.errorMessage + ).toBeUndefined() expect(version).toEqual(VaultVersion.Argon2) expect(vaults[0].vault).toEqual(vaultEncryptedWithArgon2) }) + + it("should report migration errors in the return value", async () => { + await browser.storage.local.set({ + tallyVaults: { + version: VaultVersion.PBKDF2, + vaults: [], + }, + }) + await writeLatestEncryptedVault(vaultEncryptedWithPBKDF2) + + const migrationData = await migrateVaultsToLatestVersion("wrong password") + + expect(migrationData.migrated).toEqual(false) + expect( + migrationData.migrated === false && migrationData.errorMessage + ).not.toBeUndefined() + expect( + migrationData.migrated === false && + migrationData.errorMessage !== undefined && + migrationData.errorMessage.length + ).toBeGreaterThan(1) + }) })