diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 9a2b3f46..931ba86c 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -10,8 +10,8 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - run: yarn - run: yarn lint:all - - run: yarn test:all - run: yarn build:all + - run: yarn test:all diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000..a2baaa85 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,46 @@ +name: Run & Upload Test Coverage + +on: + push: + branches: + - main + pull_request: + branches: + - main + - feature/** + +jobs: + run-tests: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Use Node.js + uses: actions/setup-node@v2 + with: + node-version: 18 + + - name: Install dependencies + run: yarn install + + - name: Build packages + run: yarn build:all + + - name: Run Jest tests + run: yarn test:coverage + + - name: List coverage files + run: | + ls -al ./packages/core + ls -al ./packages/core/coverage + ls -al ./packages/react/coverage + ls -al ./packages/proto/coverage + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + with: + files: ./packages/core/coverage/coverage-final.json,./packages/react/coverage/coverage-final.json,./packages/proto/coverage/coverage-final.json + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ded2dd94..3ded0346 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,10 +15,10 @@ jobs: - name: Checkout Repo uses: actions/checkout@v3 - - name: Setup Node.js 16.x + - name: Setup Node.js 18.x uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18 - name: Install Dependencies run: yarn diff --git a/.gitignore b/.gitignore index 86ad99ef..f950ebc5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ # See http://help.github.com/ignore-files/ for more about ignoring files. +# testing packages/react/coverage - -packages/testing/src/lib/selenium/instance-data +packages/proto/coverage +packages/core/coverage # compiled output dist diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..f253c9de --- /dev/null +++ b/codecov.yml @@ -0,0 +1,26 @@ +flags: + core: + paths: + - packages/core/** + react: + paths: + - packages/react/** + proto: + paths: + - packages/proto/** + +coverage: + status: + project: + core: + target: 80% + flags: + - core + react: + target: 80% + flags: + - react + proto: + target: 80% + flags: + - proto diff --git a/package.json b/package.json index 607490f9..ea83345f 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint:since": "nx affected --target=lint", "test:all": "nx run-many --target=test", "test:since": "nx affected --target=test", + "test:coverage": "nx affected:test --all --coverage --no-cache", "release": "yarn build:all && changeset publish", "release:internal": "yarn build:all && yarn changeset && yarn changeset version --snapshot internal && yarn changeset publish --no-git-tag --snapshot --tag internal", "postrelease": "git push --follow-tags" @@ -21,7 +22,8 @@ "@nrwl/eslint-plugin-nx": "15.5.1", "@nrwl/nx-cloud": "latest", "@nrwl/workspace": "15.5.1", - "@types/jest": "^29.4.0", + "@types/jest": "^29.5.5", + "@types/node": "20.8.2", "@typescript-eslint/eslint-plugin": "^5.50.0", "@typescript-eslint/parser": "^5.50.0", "eslint": "^8.33.0", @@ -31,12 +33,12 @@ "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", - "jest": "28.1.1", + "jest": "29.7.0", "jest-environment-jsdom": "28.1.1", "nx": "15.5.1", "prettier": "^2.6.2", "rimraf": "^3.0.2", - "ts-jest": "28.0.5", + "ts-jest": "29.1.1", "ts-node": "10.9.1", "typescript": "~4.8.4" }, diff --git a/packages/core/.babelrc.js b/packages/core/.babelrc.js index b59cdc35..34a00f68 100644 --- a/packages/core/.babelrc.js +++ b/packages/core/.babelrc.js @@ -19,6 +19,7 @@ module.exports = (api) => { return { presets: isESM ? esmPresets : commonjsPresets, - plugins: ['@babel/plugin-transform-runtime'] + plugins: ['@babel/plugin-transform-runtime'], + ignore: ['**/*.spec.ts', '**/*.spec.tsx', '**/*.spec.js', '**/*.spec.jsx', '**/__tests__/**/*', '**/__mocks__/**/*'] }; }; diff --git a/packages/core/jest.config.ts b/packages/core/jest.config.ts index 7949acc3..eb5871df 100644 --- a/packages/core/jest.config.ts +++ b/packages/core/jest.config.ts @@ -1,6 +1,6 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: 'ts-jest', - testEnvironment: 'jsdom', - testPathIgnorePatterns: ['node_modules', 'dist'], + preset: 'ts-jest', + testEnvironment: 'jsdom', + testPathIgnorePatterns: ['node_modules', 'dist'] }; diff --git a/packages/core/package.json b/packages/core/package.json index d6ae1639..37d5ebf4 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -10,8 +10,8 @@ "prebuild": "rimraf dist", "build": "yarn build:types && yarn build:cjs && yarn build:esm && yarn build:prettier", "build:types": "tsc --project tsconfig.declarations.json", - "build:cjs": "BABEL_ENV=cjs babel src --out-dir dist/cjs --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files", - "build:esm": "BABEL_ENV=esm babel src --out-dir dist/esm --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files", + "build:cjs": "BABEL_ENV=cjs babel src --out-dir dist/cjs --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files --no-copy-ignored", + "build:esm": "BABEL_ENV=esm babel src --out-dir dist/esm --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files --no-copy-ignored", "build:prettier": "prettier --write 'dist/**/*.js'", "test": "jest" }, @@ -41,8 +41,8 @@ "@ethersproject/keccak256": "^5.7.0", "@keplr-wallet/types": "^0.11.41", "@sei-js/proto": "^3.1.0", + "bech32": "^2.0.0", "buffer": "^6.0.3", - "crypto-js": "^4.1.1", "elliptic": "^6.5.4", "process": "^0.11.10", "readonly-date": "^1.0.0", @@ -54,7 +54,6 @@ "@babel/plugin-transform-runtime": "^7.22.15", "@babel/preset-env": "^7.22.20", "@babel/preset-typescript": "^7.22.15", - "@types/crypto-js": "^4.1.1", "@types/elliptic": "^6.4.14", "@types/sha.js": "^2.4.1" }, diff --git a/packages/core/src/lib/queryClient/__tests__/queryClient.spec.ts b/packages/core/src/lib/queryClient/__tests__/queryClient.spec.ts new file mode 100644 index 00000000..aa91c0e4 --- /dev/null +++ b/packages/core/src/lib/queryClient/__tests__/queryClient.spec.ts @@ -0,0 +1,21 @@ +import { seiprotocol } from '@sei-js/proto'; +import { getQueryClient } from '../queryClient'; + +// Mock the createLCDClient method +jest.mock('@sei-js/proto', () => ({ + seiprotocol: { + ClientFactory: { + createLCDClient: jest.fn() + } + } +})); + +describe('getQueryClient', () => { + it('should call createLCDClient with the correct argument and return the result', async () => { + const restEndpoint = 'http://rest.atlantic-2.provider.com'; + + await getQueryClient(restEndpoint); + + expect(seiprotocol.ClientFactory.createLCDClient).toHaveBeenCalledWith({ restEndpoint }); + }); +}); diff --git a/packages/core/src/lib/signingClient/__tests__/cosmWasmClient.spec.ts b/packages/core/src/lib/signingClient/__tests__/cosmWasmClient.spec.ts new file mode 100644 index 00000000..51e926d2 --- /dev/null +++ b/packages/core/src/lib/signingClient/__tests__/cosmWasmClient.spec.ts @@ -0,0 +1,41 @@ +import { CosmWasmClient, SigningCosmWasmClient } from '@cosmjs/cosmwasm-stargate'; +import { OfflineSigner } from '@cosmjs/proto-signing'; +import { getCosmWasmClient, getSigningCosmWasmClient } from '../cosmWasmClient'; + +jest.mock('@cosmjs/cosmwasm-stargate', () => ({ + CosmWasmClient: { + connect: jest.fn() + }, + SigningCosmWasmClient: { + connectWithSigner: jest.fn() + } +})); + +describe('getCosmWasmClient', () => { + it('should call CosmWasmClient.connect with the correct rpcEndpoint', async () => { + const rpcEndpoint = 'http://localhost:26657'; + + await getCosmWasmClient(rpcEndpoint); + + expect(CosmWasmClient.connect).toHaveBeenCalledWith(rpcEndpoint); + }); +}); + +describe('getSigningCosmWasmClient', () => { + it('should call SigningCosmWasmClient.connectWithSigner with the correct parameters', async () => { + const rpcEndpoint = 'http://localhost:26657'; + const signer = {} as OfflineSigner; + const options = {}; + + await getSigningCosmWasmClient(rpcEndpoint, signer, options); + + expect(SigningCosmWasmClient.connectWithSigner).toHaveBeenCalledWith( + rpcEndpoint, + signer, + expect.objectContaining({ + registry: expect.anything(), + aminoTypes: expect.anything() + }) + ); + }); +}); diff --git a/packages/core/src/lib/signingClient/__tests__/stargateClient.spec.ts b/packages/core/src/lib/signingClient/__tests__/stargateClient.spec.ts new file mode 100644 index 00000000..eada3fea --- /dev/null +++ b/packages/core/src/lib/signingClient/__tests__/stargateClient.spec.ts @@ -0,0 +1,69 @@ +import { StargateClient, SigningStargateClient, AminoTypes } from '@cosmjs/stargate'; +import { OfflineSigner, Registry } from '@cosmjs/proto-signing'; +import { createSeiAminoTypes, createSeiRegistry, getSigningClient, getStargateClient } from '../stargateClient'; + +jest.mock('@cosmjs/stargate', () => { + const originalModule = jest.requireActual('@cosmjs/stargate'); + + return { + ...originalModule, + StargateClient: { + ...originalModule.StargateClient, + connect: jest.fn() + }, + SigningStargateClient: { + ...originalModule.SigningStargateClient, + connectWithSigner: jest.fn() + } + }; +}); + +describe('stargateClient', () => { + afterEach(() => { + jest.restoreAllMocks(); + jest.clearAllMocks(); + }); + + describe('createSeiRegistry', () => { + it('should return a Registry instance', () => { + const registry = createSeiRegistry(); + expect(registry).toBeInstanceOf(Registry); + }); + }); + + describe('createSeiAminoTypes', () => { + it('should return an AminoTypes instance', () => { + const aminoTypes = createSeiAminoTypes(); + expect(aminoTypes).toBeInstanceOf(AminoTypes); + }); + }); + + describe('getStargateClient', () => { + it('should call StargateClient.connect with the correct rpcEndpoint', async () => { + const rpcEndpoint = 'http://localhost:26657'; + + await getStargateClient(rpcEndpoint); + + expect(StargateClient.connect).toHaveBeenCalledWith(rpcEndpoint, {}); + }); + }); + + describe('getSigningClient', () => { + it('should call SigningStargateClient.connectWithSigner with the correct parameters', async () => { + const rpcEndpoint = 'http://localhost:26657'; + const signer = {} as OfflineSigner; + const options = {}; + + await getSigningClient(rpcEndpoint, signer, options); + + expect(SigningStargateClient.connectWithSigner).toHaveBeenCalledWith( + rpcEndpoint, + signer, + expect.objectContaining({ + registry: createSeiRegistry(), + aminoTypes: createSeiAminoTypes() + }) + ); + }); + }); +}); diff --git a/packages/core/src/lib/utils/__tests__/address.spec.ts b/packages/core/src/lib/utils/__tests__/address.spec.ts new file mode 100644 index 00000000..01141781 --- /dev/null +++ b/packages/core/src/lib/utils/__tests__/address.spec.ts @@ -0,0 +1,85 @@ +import { describe, expect, it } from '@jest/globals'; +import { getAddressFromPubKey, isValidSeiAddress, pubKeyToBytes, pubKeyToKeyPair, verifyDigest32 } from '../address'; +import { randomBytes } from 'crypto'; + +const MOCK_PUB_KEY = new Uint8Array([ + 4, 116, 1, 101, 176, 186, 244, 209, 5, 209, 19, 132, 244, 147, 197, 29, 25, 163, 111, 176, 167, 12, 14, 132, 111, 54, 27, 175, 58, 222, 9, 164, 17, 238, 10, 125, + 251, 27, 86, 34, 144, 170, 53, 1, 39, 215, 43, 232, 73, 1, 141, 150, 35, 103, 128, 242, 240, 169, 107, 169, 102, 44, 226, 126, 14 +]); + +const MOCK_PUB_KEY_ADDRESS = new Uint8Array([78, 147, 198, 6, 144, 152, 234, 61, 25, 11, 200, 86, 12, 11, 124, 189, 203, 38, 208, 255]); + +describe('isValidSeiAddress', () => { + it('should return true for a valid SEI address', () => { + const validAddress = 'sei14ae4g3422thcyuxler2ws3w25fpesrh2uqmgm9'; + + const result = isValidSeiAddress(validAddress); + + expect(result).toBe(true); + }); + + it('should return false for an invalid SEI address', () => { + const invalidAddress = 'invalidSeiAddress'; + const result = isValidSeiAddress(invalidAddress); + expect(result).toBe(false); + }); + + it('should return false for a non-SEI Bech32 address', () => { + // Create a non-SEI Bech32 address + const nonSeiAddress = 'osmo1vx3456g8y9jqmg3yngw4thjc89ew6ukfcdr0hs'; + + const result = isValidSeiAddress(nonSeiAddress); + expect(result).toBe(false); + }); +}); + +describe('pubKeyToKeyPair', () => { + it('should return a valid key pair for a given public key', () => { + const keyPair = pubKeyToKeyPair(MOCK_PUB_KEY); + + expect(keyPair.getPublic('hex')).toBe(Buffer.from(MOCK_PUB_KEY).toString('hex')); + }); + + it('should throw an error for an invalid public key', () => { + expect(() => pubKeyToKeyPair('string pub key' as never)).toThrow(); + }); +}); + +describe('pubKeyToBytes', () => { + it('should return the same pubKey when uncompressed and length is 65', () => { + // Generate a random 65-byte Uint8Array as a mock uncompressed public key + const uncompressedPubKey = new Uint8Array(randomBytes(65)); + const result = pubKeyToBytes(uncompressedPubKey, true); + expect(result).toEqual(uncompressedPubKey); + }); + + it('should return the same pubKey when compressed and length is 33', () => { + // Generate a random 33-byte Uint8Array as a mock compressed public key + const compressedPubKey = new Uint8Array(randomBytes(33)); + const result = pubKeyToBytes(compressedPubKey, false); + expect(result).toEqual(compressedPubKey); + }); + + it('should return uncompressed pubKey when uncompressed is true', () => { + // Convert the public key to uncompressed format + const result = pubKeyToBytes(MOCK_PUB_KEY, true); + // The result should be 65 bytes long + expect(result.length).toBe(65); + }); + + it('should return compressed pubKey when uncompressed is false', () => { + // Convert the public key to compressed format + const result = pubKeyToBytes(MOCK_PUB_KEY, false); + // The result should be 33 bytes long + expect(result.length).toBe(33); + }); +}); + +describe('getAddressFromPubKey', () => { + it('should return a valid address from a given public key', () => { + const address = getAddressFromPubKey(MOCK_PUB_KEY); + + expect(address).toBeInstanceOf(Uint8Array); + expect(address).toEqual(MOCK_PUB_KEY_ADDRESS); + }); +}); diff --git a/packages/core/src/lib/utils/__tests__/bech32.spec.ts b/packages/core/src/lib/utils/__tests__/bech32.spec.ts new file mode 100644 index 00000000..4853dc73 --- /dev/null +++ b/packages/core/src/lib/utils/__tests__/bech32.spec.ts @@ -0,0 +1,22 @@ +import { toBech32 } from '../bech32'; + +describe('toBech32', () => { + it('should convert Uint8Array to Bech32 string', () => { + const mockUint8Array = new Uint8Array([175, 115, 84, 70, 170, 82, 239, 130, 112, 223, 200, 212, 232, 69, 202, 162, 67, 152, 14, 234]); + const result = toBech32(mockUint8Array); + expect(result).toBe('sei14ae4g3422thcyuxler2ws3w25fpesrh2uqmgm9'); + }); + + it('should return different Bech32 strings for different inputs', () => { + const mockUint8Array1 = new Uint8Array([175, 115, 84, 70, 170, 82, 239, 130, 112, 223, 200, 212, 232, 69, 202, 162, 67, 152, 14, 234]); + const mockUint8Array2 = new Uint8Array([275, 115, 84, 70, 170, 82, 239, 130, 112, 223, 200, 212, 232, 69, 202, 162, 67, 152, 14, 234]); + const result1 = toBech32(mockUint8Array1); + const result2 = toBech32(mockUint8Array2); + expect(result1).not.toBe(result2); + }); + + it('should throw an error when provided an empty Uint8Array', () => { + const emptyAddress = new Uint8Array([]); + expect(() => toBech32(emptyAddress)).toThrow('Invalid address length'); + }); +}); diff --git a/packages/core/src/lib/utils/__tests__/hash.spec.ts b/packages/core/src/lib/utils/__tests__/hash.spec.ts new file mode 100644 index 00000000..c2047dc1 --- /dev/null +++ b/packages/core/src/lib/utils/__tests__/hash.spec.ts @@ -0,0 +1,26 @@ +import { sha256 } from '../hash'; + +describe('sha256', () => { + it('should return a Uint8Array hash of the given data', () => { + const data = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + + const evalHash = sha256(data); + const expectedHash = new Uint8Array([ + 31, 130, 90, 162, 240, 2, 14, 247, 207, 145, 223, 163, 13, 164, 102, 141, 121, 28, 93, 72, 36, 252, 142, 65, 53, 75, 137, 236, 5, 121, 90, 179 + ]); + + expect(evalHash).toBeInstanceOf(Uint8Array); + expect(evalHash).toEqual(expectedHash); + }); + + it('should return different hashes for different data', () => { + const data1 = new Uint8Array([0, 1, 2, 3, 4, 5]); + const data2 = new Uint8Array([5, 4, 3, 2, 1, 0]); + + // When + const hash1 = sha256(data1); + const hash2 = sha256(data2); + + expect(hash1).not.toEqual(hash2); + }); +}); diff --git a/packages/core/src/lib/utils/address.ts b/packages/core/src/lib/utils/address.ts index 5da911a4..cce8e78c 100644 --- a/packages/core/src/lib/utils/address.ts +++ b/packages/core/src/lib/utils/address.ts @@ -1,6 +1,7 @@ import { fromBech32 } from '@cosmjs/encoding'; -import CryptoJS from 'crypto-js'; import { ec as EllipticCurve } from 'elliptic'; +import { sha256 } from './hash'; +import { ripemd160 } from '@cosmjs/crypto'; export const isValidSeiAddress = (address: string) => { try { @@ -35,10 +36,15 @@ export const pubKeyToBytes = (pubKey: Uint8Array, uncompressed?: boolean): Uint8 }; export const getAddressFromPubKey = (pubKey: Uint8Array): Uint8Array => { - let hash = CryptoJS.SHA256(CryptoJS.lib.WordArray.create(pubKeyToBytes(pubKey) as any)).toString(); - hash = CryptoJS.RIPEMD160(CryptoJS.enc.Hex.parse(hash)).toString(); + const shaHash = sha256(pubKeyToBytes(pubKey)); + let ripemdHash = ripemd160(shaHash); // Assuming ripemd160 takes Uint8Array and returns Uint8Array - return new Uint8Array(Buffer.from(hash, 'hex')); + // If ripemd160 returns a hex string, convert it to a Uint8Array + if (typeof ripemdHash === 'string') { + ripemdHash = new Uint8Array(Buffer.from(ripemdHash, 'hex')); + } + + return ripemdHash; }; export const verifyDigest32 = (digest: Uint8Array, signature: Uint8Array, pubKey: Uint8Array): boolean => { diff --git a/packages/core/src/lib/utils/bech32.ts b/packages/core/src/lib/utils/bech32.ts index 6e219410..bb6e45fc 100644 --- a/packages/core/src/lib/utils/bech32.ts +++ b/packages/core/src/lib/utils/bech32.ts @@ -1,6 +1,9 @@ -import bech32 from 'bech32'; +import { bech32 } from 'bech32'; export const toBech32 = (address: Uint8Array): string => { + if (!address.length) { + throw new Error('Invalid address length'); + } const words = bech32.toWords(address); return bech32.encode('sei', words); }; diff --git a/packages/core/src/lib/wallet/config.spec.ts b/packages/core/src/lib/wallet/__tests__/utils.spec.ts similarity index 87% rename from packages/core/src/lib/wallet/config.spec.ts rename to packages/core/src/lib/wallet/__tests__/utils.spec.ts index 943ad4aa..f9a61c5f 100644 --- a/packages/core/src/lib/wallet/config.spec.ts +++ b/packages/core/src/lib/wallet/__tests__/utils.spec.ts @@ -1,8 +1,4 @@ -import { TextEncoder } from 'util'; -import { getChainSuggest } from './config'; - -// Needed to generate an offline signer -global.TextEncoder = TextEncoder; +import { getChainSuggest } from '../utils'; describe('getChainSuggest', () => { it('should return a chain config', async () => { diff --git a/packages/core/src/lib/wallet/__tests__/wallet.spec.ts b/packages/core/src/lib/wallet/__tests__/wallet.spec.ts new file mode 100644 index 00000000..b80263cd --- /dev/null +++ b/packages/core/src/lib/wallet/__tests__/wallet.spec.ts @@ -0,0 +1,80 @@ +import { stringToPath } from '@cosmjs/crypto'; +import { generateWallet, getHdPath, restoreWallet } from '../wallet'; +import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; + +jest.mock('@cosmjs/proto-signing', () => { + const originalModule = jest.requireActual('@cosmjs/proto-signing'); + + return { + ...originalModule, + DirectSecp256k1HdWallet: { + ...originalModule.DirectSecp256k1HdWallet, + fromMnemonic: jest.fn(), + generate: jest.fn() + } + }; +}); + +describe('getHdPath', () => { + it('should return the correct HdPath for default accountIndex', () => { + const expectedStringPath = "m/44'/118'/0'/0/0"; + const expectedHdPath = stringToPath(expectedStringPath); + + const result = getHdPath(); + + expect(result).toEqual(expectedHdPath); + }); + + it('should return the correct HdPath for a specified accountIndex', () => { + const accountIndex = 7; + const expectedStringPath = `m/44'/118'/0'/0/${accountIndex}`; + const expectedHdPath = stringToPath(expectedStringPath); + + const result = getHdPath(accountIndex); + + expect(result).toEqual(expectedHdPath); + }); +}); + +describe('Wallet functions', () => { + it('should generate a wallet', async () => { + const mockWallet = {}; + (DirectSecp256k1HdWallet.generate as jest.Mock).mockResolvedValue(mockWallet); + + const wallet = await generateWallet(12, 0); + + expect(wallet).toBe(mockWallet); + expect(DirectSecp256k1HdWallet.generate).toHaveBeenCalledWith(12, { + prefix: 'sei', + hdPaths: [getHdPath(0)] + }); + }); + + it('should generate a wallet with index 7', async () => { + const mockWallet = {}; + (DirectSecp256k1HdWallet.generate as jest.Mock).mockResolvedValue(mockWallet); + + const wallet = await generateWallet(12, 7); + + expect(wallet).toBe(mockWallet); + expect(DirectSecp256k1HdWallet.generate).toHaveBeenCalledWith(12, { + prefix: 'sei', + hdPaths: [getHdPath(7)] + }); + }); + + it('should restore a wallet from a seed phrase', async () => { + const mockWallet = {}; + const seedPhrase = 'test seed phrase'; + + (DirectSecp256k1HdWallet.fromMnemonic as jest.Mock).mockResolvedValue(mockWallet); + + const wallet = await restoreWallet(seedPhrase, 0); + + expect(wallet).toBe(mockWallet); + expect(DirectSecp256k1HdWallet.fromMnemonic).toHaveBeenCalledWith(seedPhrase, { + prefix: 'sei', + hdPaths: [getHdPath(0)] + }); + }); +}); diff --git a/packages/core/src/lib/wallet/config.ts b/packages/core/src/lib/wallet/config.ts index 76452829..896d604b 100644 --- a/packages/core/src/lib/wallet/config.ts +++ b/packages/core/src/lib/wallet/config.ts @@ -1,24 +1,4 @@ -import { ChainConfig, ChainInfo, Currency } from './types'; -import { AccountData, OfflineSigner } from '@cosmjs/proto-signing'; -import { OfflineAminoSigner, StdSignature } from '@cosmjs/amino'; - -export interface SeiWallet { - walletInfo: { - windowKey: string; - name: string; - icon: string; - website: string; - }; - getOfflineSigner: (chainId: string) => Promise; - getOfflineSignerAmino: (chainId: string) => Promise; - getAccounts: (chainId: string) => Promise; - connect: (chainId: string) => Promise; - disconnect: (chainId: string) => Promise; - suggestChain?: (config: ChainConfig) => Promise; - signArbitrary?: (chainId: string, signer: string, message: string) => Promise; - verifyArbitrary?: (chainId: string, signingAddress: string, data: string, signature: StdSignature) => Promise; - isMobileSupported: boolean; -} +import { ChainConfig, ChainInfo, Currency, SeiWallet } from './types'; export const FIN_WALLET: SeiWallet = { getAccounts: async (chainId) => { @@ -103,60 +83,3 @@ export const LEAP_WALLET: SeiWallet = { }; export const SUPPORTED_WALLETS: SeiWallet[] = [COMPASS_WALLET, FIN_WALLET, LEAP_WALLET, KEPLR_WALLET]; - -const DEFAULT_CHAIN_INFO = { - chainName: 'Sei', - chainId: 'pacific-1', - restUrl: 'https://rest.wallet.pacific-1.sei.io/', - rpcUrl: 'https://rpc.wallet.pacific-1.sei.io/', - gasPriceStep: { low: 0.1, average: 0.2, high: 0.3 } -}; - -export const getChainSuggest = (chainInfo: ChainInfo = {}, currencies: Currency[] = []): ChainConfig => { - const prefix = 'sei'; - const { chainId, chainName, rpcUrl, restUrl, gasPriceStep } = { - ...DEFAULT_CHAIN_INFO, - ...chainInfo - }; - - return { - chainId: chainId, - chainName: chainName, - rpc: rpcUrl, - rest: restUrl, - bip44: { - coinType: 118 - }, - bech32Config: { - bech32PrefixAccAddr: prefix, - bech32PrefixAccPub: `${prefix}pub`, - bech32PrefixValAddr: `${prefix}valoper`, - bech32PrefixValPub: `${prefix}valoperpub`, - bech32PrefixConsAddr: `${prefix}valcons`, - bech32PrefixConsPub: `${prefix}valconspub` - }, - currencies: [ - { - coinDenom: 'SEI', - coinMinimalDenom: 'usei', - coinDecimals: 6 - }, - ...currencies - ], - feeCurrencies: [ - { - coinDenom: 'SEI', - coinMinimalDenom: 'usei', - coinDecimals: 6, - gasPriceStep - } - ], - stakeCurrency: { - coinDenom: 'SEI', - coinMinimalDenom: 'usei', - coinDecimals: 6 - }, - coinType: 118, - features: ['stargate', 'ibc-transfer', 'cosmwasm'] - }; -}; diff --git a/packages/core/src/lib/wallet/index.ts b/packages/core/src/lib/wallet/index.ts index b49aa8e9..31dbdd31 100644 --- a/packages/core/src/lib/wallet/index.ts +++ b/packages/core/src/lib/wallet/index.ts @@ -1,3 +1,4 @@ export * from './config'; export * from './types'; export * from './wallet'; +export * from './utils'; diff --git a/packages/core/src/lib/wallet/types.ts b/packages/core/src/lib/wallet/types.ts index 2f0b71fe..e38cb002 100644 --- a/packages/core/src/lib/wallet/types.ts +++ b/packages/core/src/lib/wallet/types.ts @@ -1,3 +1,24 @@ +import { AccountData, OfflineSigner } from '@cosmjs/proto-signing'; +import { OfflineAminoSigner, StdSignature } from '@cosmjs/amino'; + +export interface SeiWallet { + walletInfo: { + windowKey: string; + name: string; + icon: string; + website: string; + }; + getOfflineSigner: (chainId: string) => Promise; + getOfflineSignerAmino: (chainId: string) => Promise; + getAccounts: (chainId: string) => Promise; + connect: (chainId: string) => Promise; + disconnect: (chainId: string) => Promise; + suggestChain?: (config: ChainConfig) => Promise; + signArbitrary?: (chainId: string, signer: string, message: string) => Promise; + verifyArbitrary?: (chainId: string, signingAddress: string, data: string, signature: StdSignature) => Promise; + isMobileSupported: boolean; +} + type GasPriceStep = { low: number; average: number; diff --git a/packages/core/src/lib/wallet/utils.ts b/packages/core/src/lib/wallet/utils.ts new file mode 100644 index 00000000..a4bd51b3 --- /dev/null +++ b/packages/core/src/lib/wallet/utils.ts @@ -0,0 +1,58 @@ +import { ChainConfig, ChainInfo, Currency } from './types'; + +const DEFAULT_CHAIN_INFO = { + chainName: 'Sei', + chainId: 'pacific-1', + restUrl: 'https://rest.wallet.pacific-1.sei.io/', + rpcUrl: 'https://rpc.wallet.pacific-1.sei.io/', + gasPriceStep: { low: 0.1, average: 0.2, high: 0.3 } +}; + +export const getChainSuggest = (chainInfo: ChainInfo = {}, currencies: Currency[] = []): ChainConfig => { + const prefix = 'sei'; + const { chainId, chainName, rpcUrl, restUrl, gasPriceStep } = { + ...DEFAULT_CHAIN_INFO, + ...chainInfo + }; + + return { + chainId: chainId, + chainName: chainName, + rpc: rpcUrl, + rest: restUrl, + bip44: { + coinType: 118 + }, + bech32Config: { + bech32PrefixAccAddr: prefix, + bech32PrefixAccPub: `${prefix}pub`, + bech32PrefixValAddr: `${prefix}valoper`, + bech32PrefixValPub: `${prefix}valoperpub`, + bech32PrefixConsAddr: `${prefix}valcons`, + bech32PrefixConsPub: `${prefix}valconspub` + }, + currencies: [ + { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6 + }, + ...currencies + ], + feeCurrencies: [ + { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6, + gasPriceStep + } + ], + stakeCurrency: { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6 + }, + coinType: 118, + features: ['stargate', 'ibc-transfer', 'cosmwasm'] + }; +}; diff --git a/packages/core/src/lib/wallet/wallet.ts b/packages/core/src/lib/wallet/wallet.ts index 06730650..c022d5c7 100644 --- a/packages/core/src/lib/wallet/wallet.ts +++ b/packages/core/src/lib/wallet/wallet.ts @@ -1,7 +1,7 @@ import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; import { HdPath, stringToPath } from '@cosmjs/crypto'; -const getHdPath = (accountIndex = 0): HdPath => { +export const getHdPath = (accountIndex = 0): HdPath => { const stringPath = `m/44'/118'/0'/0/${accountIndex}`; return stringToPath(stringPath); }; diff --git a/packages/core/tsconfig.declarations.json b/packages/core/tsconfig.declarations.json index 40ea07df..27727eea 100644 --- a/packages/core/tsconfig.declarations.json +++ b/packages/core/tsconfig.declarations.json @@ -5,5 +5,10 @@ "emitDeclarationOnly": true }, "include": ["src"], - "exclude": ["node_modules", "**/*.test.ts"] + "exclude": [ + "node_modules", + "**/*.spec.ts", + "**/*.test.ts", + "**/__tests__/**/*" + ] } diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index b88683f9..267c6859 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -15,5 +15,10 @@ ] }, "include": ["src"], - "exclude": ["node_modules"] + "exclude": [ + "node_modules", + "**/*.spec.ts", + "**/*.test.ts", + "**/__tests__/**/*" + ] } diff --git a/packages/react/.babelrc.js b/packages/react/.babelrc.js index a54a87ec..d198392e 100644 --- a/packages/react/.babelrc.js +++ b/packages/react/.babelrc.js @@ -12,14 +12,29 @@ module.exports = (api) => { modules: 'commonjs' } ], - '@babel/preset-react', + [ + '@babel/preset-react', + { + runtime: 'automatic' + } + ], '@babel/preset-typescript' ]; - const esmPresets = ['@babel/preset-react', '@babel/preset-env', '@babel/preset-typescript']; + const esmPresets = [ + [ + '@babel/preset-react', + { + runtime: 'automatic' + } + ], + '@babel/preset-env', + '@babel/preset-typescript' + ]; return { presets: isESM ? esmPresets : commonjsPresets, - plugins: ['@babel/plugin-transform-runtime'] + plugins: ['@babel/plugin-transform-runtime'], + ignore: ['**/*.spec.ts', '**/*.spec.tsx', '**/*.spec.js', '**/*.spec.jsx', '**/__tests__/**/*', '**/__mocks__/**/*'] }; }; diff --git a/packages/react/__mocks__/context.ts b/packages/react/__mocks__/context.ts new file mode 100644 index 00000000..4a067e10 --- /dev/null +++ b/packages/react/__mocks__/context.ts @@ -0,0 +1,18 @@ +import { COMPASS_WALLET, FIN_WALLET, KEPLR_WALLET } from '@sei-js/core'; + +export const ATLANTIC_2_CONFIG = { rpcUrl: 'https://rpc.atlantic-2.seinetwork.io', restUrl: 'https://rest.atlantic-2.seinetwork.io', chainId: 'atlantic-2' }; + +export const DEFAULT_TEST_CONTEXT = { + offlineSigner: undefined, + rpcUrl: ATLANTIC_2_CONFIG.rpcUrl, + restUrl: ATLANTIC_2_CONFIG.restUrl, + chainId: ATLANTIC_2_CONFIG.chainId, + setConnectionError: jest.fn(), + accounts: [], + setTargetWallet: jest.fn(), + showConnectModal: true, + setShowConnectModal: jest.fn(), + connect: jest.fn(), + wallets: [COMPASS_WALLET, FIN_WALLET, KEPLR_WALLET], + disconnect: jest.fn() +}; diff --git a/packages/react/__mocks__/styleMock.ts b/packages/react/__mocks__/styleMock.ts new file mode 100644 index 00000000..f053ebf7 --- /dev/null +++ b/packages/react/__mocks__/styleMock.ts @@ -0,0 +1 @@ +module.exports = {}; diff --git a/packages/react/__mocks__/wallets.ts b/packages/react/__mocks__/wallets.ts new file mode 100644 index 00000000..a1988b23 --- /dev/null +++ b/packages/react/__mocks__/wallets.ts @@ -0,0 +1,25 @@ +import { SeiWallet } from '@sei-js/core'; +import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing'; + +export const createTestWallet = (offlineSigner?: DirectSecp256k1HdWallet): SeiWallet => { + return { + getAccounts: async (chainId) => { + const offlineSigner = await window?.['customWallet']?.getOfflineSignerAuto(chainId); + return offlineSigner?.getAccounts() || []; + }, + connect: jest.fn(), + disconnect: jest.fn(), + getOfflineSigner: offlineSigner ? async (_chainId) => offlineSigner : jest.fn(), + getOfflineSignerAmino: jest.fn(), + signArbitrary: jest.fn(), + verifyArbitrary: jest.fn(), + suggestChain: jest.fn(), + walletInfo: { + windowKey: 'customWallet', + name: 'Custom Wallet', + website: 'https://www.example.com', + icon: 'https://example.com/icon.png' + }, + isMobileSupported: false + }; +}; diff --git a/packages/react/babel.config.json b/packages/react/babel.config.json deleted file mode 100644 index f9f15f62..00000000 --- a/packages/react/babel.config.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "env": { - "cjs": { - "presets": [ - ["@babel/preset-env", { - "modules": "commonjs" - }], - "@babel/preset-react", - "@babel/preset-typescript" - ], - "plugins": [ - "@babel/plugin-transform-runtime" - ] - }, - "esm": { - "presets": [ - ["@babel/preset-env", { - "modules": false - }], - "@babel/preset-react", - "@babel/preset-typescript" - ], - "plugins": [ - "@babel/plugin-transform-runtime" - ] - } - } -} diff --git a/packages/react/jest.config.ts b/packages/react/jest.config.ts index b9148150..308eade8 100644 --- a/packages/react/jest.config.ts +++ b/packages/react/jest.config.ts @@ -1,5 +1,9 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { - preset: 'ts-jest', - testEnvironment: 'jsdom', + preset: 'ts-jest', + testEnvironment: 'jsdom', + setupFilesAfterEnv: ['/jest.setup.ts'], + moduleNameMapper: { + '\\.css$': '/__mocks__/styleMock.ts' + } }; diff --git a/packages/react/jest.setup.ts b/packages/react/jest.setup.ts new file mode 100644 index 00000000..f05fd24f --- /dev/null +++ b/packages/react/jest.setup.ts @@ -0,0 +1,2 @@ +import { TextEncoder, TextDecoder } from 'util'; +Object.assign(global, { TextDecoder, TextEncoder }); diff --git a/packages/react/package.json b/packages/react/package.json index e1f98ffe..ae735db8 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -10,8 +10,8 @@ "prebuild": "rimraf dist", "build": "yarn build:types && yarn build:cjs && yarn build:esm && yarn build:prettier", "build:types": "tsc --project tsconfig.declarations.json", - "build:cjs": "BABEL_ENV=cjs babel src --out-dir dist/cjs --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files", - "build:esm": "BABEL_ENV=esm babel src --out-dir dist/esm --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files", + "build:cjs": "BABEL_ENV=cjs babel src --out-dir dist/cjs --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files --no-copy-ignored" , + "build:esm": "BABEL_ENV=esm babel src --out-dir dist/esm --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files --no-copy-ignored", "build:prettier": "prettier --write 'dist/**/*.js'", "test": "jest" }, @@ -30,10 +30,9 @@ }, "dependencies": { "@react-icons/all-files": "^4.1.0", - "@sei-js/core": "3.1.0", + "@sei-js/core": "^3.1.0", "buffer": "^6.0.3", - "process": "^0.11.10", - "react-outside-click-handler": "^1.3.0" + "process": "^0.11.10" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0", @@ -45,10 +44,18 @@ "@babel/preset-env": "^7.22.20", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.22.15", - "@types/react": "^17.0.0 || ^18.0.0", - "prettier": "^3.0.0", - "react": "^17.0.0 || ^18.0.0", - "typescript": "5.1.6" + "@testing-library/jest-dom": "^6.1.3", + "@testing-library/react": "^14.0.0", + "@testing-library/react-hooks": "^8.0.1", + "@types/jest": "^29.5.5", + "@types/react": "^18.2.25", + "@types/react-dom": "^18.2.10", + "jest": "^29.7.0", + "prettier": "^3.0.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "ts-jest": "^29.1.1", + "typescript": "5.2.2" }, "exports": { ".": { diff --git a/packages/react/src/lib/components/WalletConnectButton/WalletConnectButton.tsx b/packages/react/src/lib/components/WalletConnectButton/WalletConnectButton.tsx index 605d9c19..a4b7b283 100644 --- a/packages/react/src/lib/components/WalletConnectButton/WalletConnectButton.tsx +++ b/packages/react/src/lib/components/WalletConnectButton/WalletConnectButton.tsx @@ -7,8 +7,7 @@ import { IoLogOutOutline } from '@react-icons/all-files/io5/IoLogOutOutline'; import { IoCopyOutline } from '@react-icons/all-files/io5/IoCopyOutline'; import { SeiWalletContext } from '../../provider'; import { isValidCSSColor } from '../../utils'; - -export const truncateAddress = (address: string) => `${address.slice(0, 3)}....${address.slice(address.length - 5)}`; +import { truncateAddress } from '../../utils/address'; const WalletConnectButton = ({ buttonClassName, primaryColor, secondaryColor, backgroundColor }: WalletConnectButtonProps) => { const [showMenu, setShowMenu] = useState(false); diff --git a/packages/react/src/lib/components/WalletSelectModal/WalletSelectModal.tsx b/packages/react/src/lib/components/WalletSelectModal/WalletSelectModal.tsx index 8bbecb9e..780673e2 100644 --- a/packages/react/src/lib/components/WalletSelectModal/WalletSelectModal.tsx +++ b/packages/react/src/lib/components/WalletSelectModal/WalletSelectModal.tsx @@ -67,6 +67,7 @@ const WalletSelectModal = ({ wallets: inputWallets }: WalletSelectModalProps) => return (
}; return ( -
+
e.stopPropagation()} className='modal__card'> {renderContent()} {renderMobileHelper()} diff --git a/packages/react/src/lib/components/__tests__/WalletSelectModal.spec.tsx b/packages/react/src/lib/components/__tests__/WalletSelectModal.spec.tsx new file mode 100644 index 00000000..d6619abc --- /dev/null +++ b/packages/react/src/lib/components/__tests__/WalletSelectModal.spec.tsx @@ -0,0 +1,67 @@ +// @ts-ignore +import React from 'react'; +import { render } from '@testing-library/react'; +import { WalletSelectModal } from '../WalletSelectModal'; +import { SeiWalletContext } from '../../provider'; +import { COMPASS_WALLET, FIN_WALLET, generateWallet, KEPLR_WALLET } from '@sei-js/core'; +import '@testing-library/jest-dom'; +import { createTestWallet } from '../../../../__mocks__/wallets'; +import { DEFAULT_TEST_CONTEXT } from '../../../../__mocks__/context'; + +describe('WalletSelectModal', () => { + it('should not render modal when showConnectModal is false', async () => { + const generatedWallet = await generateWallet(12); + + const originalContext = { + offlineSigner: generatedWallet, + rpcUrl: 'https://rpc.atlantic-2.seinetwork.io', + restUrl: 'https://rest.atlantic-2.seinetwork.io', + chainId: 'atlantic-2', + setConnectionError: jest.fn(), + accounts: [], + setTargetWallet: jest.fn(), + showConnectModal: false, + setShowConnectModal: jest.fn(), + connect: jest.fn(), + wallets: [], + disconnect: jest.fn() + }; + + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId('modal__background')).toBeNull(); + }); + + it('should render modal when showConnectModal is true', async () => { + const offlineSigner = await generateWallet(12); + + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId('modal__background')).toBeInTheDocument(); + }); + + it('renders correct values from useQueryClient', async () => { + const offlineSigner = await generateWallet(12); + + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId('Compass')).toBeInTheDocument(); + expect(queryByTestId('Fin')).toBeInTheDocument(); + expect(queryByTestId('Keplr')).toBeInTheDocument(); + expect(queryByTestId('Custom Wallet')).toBeInTheDocument(); + expect(queryByTestId('Falcon')).not.toBeInTheDocument(); + }); +}); diff --git a/packages/react/src/lib/hooks/__tests__/useCosmWasmClient.spec.tsx b/packages/react/src/lib/hooks/__tests__/useCosmWasmClient.spec.tsx new file mode 100644 index 00000000..2306c9f8 --- /dev/null +++ b/packages/react/src/lib/hooks/__tests__/useCosmWasmClient.spec.tsx @@ -0,0 +1,36 @@ +import * as React from 'react'; +import { render, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; + +import { useCosmWasmClient } from '../useCosmWasmClient'; +import { SeiWalletProvider } from '../../provider'; +import { ATLANTIC_2_CONFIG } from '../../../../__mocks__/context'; + +const TestComponent: React.FC = () => { + const { isLoading, cosmWasmClient } = useCosmWasmClient(); + return ( +
+ {`isLoading: ${isLoading}`} + {`Client: ${cosmWasmClient}`} +
+ ); +}; + +describe('useCosmWasmClient', () => { + it('renders correct values from useCosmWasmClient', async () => { + const { findByText } = render( + + + + ); + + expect(await findByText('isLoading: true')).toBeInTheDocument(); + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 3500)); + }); + + expect(await findByText('isLoading: false')).toBeInTheDocument(); + expect(await findByText('Client: [object Object]')).toBeInTheDocument(); + }); +}); diff --git a/packages/react/src/lib/hooks/__tests__/useQueryClient.spec.tsx b/packages/react/src/lib/hooks/__tests__/useQueryClient.spec.tsx new file mode 100644 index 00000000..f317c154 --- /dev/null +++ b/packages/react/src/lib/hooks/__tests__/useQueryClient.spec.tsx @@ -0,0 +1,39 @@ +import * as React from 'react'; +import { render, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; + +import { SeiWalletProvider } from '../../provider'; +import { useQueryClient } from '../useQueryClient'; +import { ATLANTIC_2_CONFIG } from '../../../../__mocks__/context'; + +const TestComponent: React.FC = () => { + const { isLoading, queryClient } = useQueryClient(); + + const isQueryClient = queryClient?.seiprotocol?.seichain !== undefined; + + return ( +
+ {`isLoading: ${isLoading}`} + {`isQueryClient: ${isQueryClient}`} +
+ ); +}; + +describe('useQueryClient', () => { + it('renders correct values from useQueryClient', async () => { + const { findByText } = render( + + + + ); + + expect(await findByText('isLoading: true')).toBeInTheDocument(); + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 0)); + }); + + expect(await findByText('isLoading: false')).toBeInTheDocument(); + expect(await findByText('isQueryClient: true')).toBeInTheDocument(); + }); +}); diff --git a/packages/react/src/lib/hooks/__tests__/useSelectWallet.spec.tsx b/packages/react/src/lib/hooks/__tests__/useSelectWallet.spec.tsx new file mode 100644 index 00000000..4d71abfa --- /dev/null +++ b/packages/react/src/lib/hooks/__tests__/useSelectWallet.spec.tsx @@ -0,0 +1,31 @@ +import * as React from 'react'; +import { useContext } from 'react'; +import { render } from '@testing-library/react'; +import { useSelectWallet } from '../useSelectWallet'; + +jest.mock('react', () => ({ + ...jest.requireActual('react'), + useContext: jest.fn() +})); + +const TestComponent: React.FC = () => { + const { openModal, closeModal } = useSelectWallet(); + openModal(); + closeModal(); + return
; +}; + +describe('useSelectWallet', () => { + it('calls setShowConnectModal with correct arguments', () => { + const setShowConnectModal = jest.fn(); + + (useContext as jest.Mock).mockImplementation(() => ({ + setShowConnectModal + })); + + render(); + + expect(setShowConnectModal).toHaveBeenCalledWith(true); + expect(setShowConnectModal).toHaveBeenCalledWith(false); + }); +}); diff --git a/packages/react/src/lib/hooks/__tests__/useSigningClient.spec.tsx b/packages/react/src/lib/hooks/__tests__/useSigningClient.spec.tsx new file mode 100644 index 00000000..2101c318 --- /dev/null +++ b/packages/react/src/lib/hooks/__tests__/useSigningClient.spec.tsx @@ -0,0 +1,39 @@ +import * as React from 'react'; +import { render, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { generateWallet } from '@sei-js/core'; + +import { useSigningClient } from '../useSigningClient'; +import { SeiWalletContext } from '../../provider'; +import { DEFAULT_TEST_CONTEXT } from '../../../../__mocks__/context'; + +describe('useSigningClient', () => { + it('renders correct values from useSigningClient', async () => { + const offlineSigner = await generateWallet(12); + + const TestComponent: React.FC = () => { + const { isLoading, signingClient } = useSigningClient(); + return ( +
+ {`isLoading: ${isLoading}`} + {`Client: ${signingClient}`} +
+ ); + }; + + const { findByText } = render( + + + + ); + + expect(await findByText('isLoading: true')).toBeInTheDocument(); + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 3500)); + }); + + expect(await findByText('isLoading: false')).toBeInTheDocument(); + expect(await findByText('Client: [object Object]')).toBeInTheDocument(); + }); +}); diff --git a/packages/react/src/lib/hooks/__tests__/useSigningCosmWasmClient.spec.tsx b/packages/react/src/lib/hooks/__tests__/useSigningCosmWasmClient.spec.tsx new file mode 100644 index 00000000..7786d070 --- /dev/null +++ b/packages/react/src/lib/hooks/__tests__/useSigningCosmWasmClient.spec.tsx @@ -0,0 +1,39 @@ +import * as React from 'react'; +import { render, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { generateWallet } from '@sei-js/core'; + +import { SeiWalletContext } from '../../provider'; +import { useSigningCosmWasmClient } from '../useSigningCosmWasmClient'; +import { DEFAULT_TEST_CONTEXT } from '../../../../__mocks__/context'; + +describe('useSigningCosmWasmClient', () => { + it('renders correct values from useSigningCosmWasmClientClient', async () => { + const offlineSigner = await generateWallet(12); + + const TestComponent: React.FC = () => { + const { isLoading, signingCosmWasmClient } = useSigningCosmWasmClient(); + return ( +
+ {`isLoading: ${isLoading}`} + {`Client: ${signingCosmWasmClient}`} +
+ ); + }; + + const { findByText } = render( + + + + ); + + expect(await findByText('isLoading: true')).toBeInTheDocument(); + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 3500)); + }); + + expect(await findByText('isLoading: false')).toBeInTheDocument(); + expect(await findByText('Client: [object Object]')).toBeInTheDocument(); + }); +}); diff --git a/packages/react/src/lib/hooks/__tests__/useStargateClient.spec.tsx b/packages/react/src/lib/hooks/__tests__/useStargateClient.spec.tsx new file mode 100644 index 00000000..2954a2bc --- /dev/null +++ b/packages/react/src/lib/hooks/__tests__/useStargateClient.spec.tsx @@ -0,0 +1,40 @@ +// @ts-ignore +import React from 'react'; +import { render, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { SeiWalletProvider } from '../../provider'; +import { useStargateClient } from '../useStargateClient'; + +const TestComponent: React.FC = () => { + const { isLoading, stargateClient } = useStargateClient(); + + const isStargateClient = stargateClient?.broadcastTx !== undefined; + + return ( +
+ {`Is Loading: ${isLoading}`} + {`isStargateClient: ${isStargateClient}`} +
+ ); +}; + +describe('useStargateClient', () => { + it('renders correct values from useStargateClient', async () => { + const { findByText } = render( + + + + ); + + expect(await findByText('Is Loading: true')).toBeInTheDocument(); + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 3500)); + }); + + expect(await findByText('Is Loading: false')).toBeInTheDocument(); + expect(await findByText('isStargateClient: true')).toBeInTheDocument(); + }); +}); diff --git a/packages/react/src/lib/hooks/useSigningClient/useSigningClient.ts b/packages/react/src/lib/hooks/useSigningClient/useSigningClient.ts index 4044efb5..b2f0006f 100644 --- a/packages/react/src/lib/hooks/useSigningClient/useSigningClient.ts +++ b/packages/react/src/lib/hooks/useSigningClient/useSigningClient.ts @@ -23,7 +23,7 @@ const useSigningClient = (customRpcUrl?: string): UseSigningClient => { const client = await getSigningClient(customRpcUrl || rpcUrl, offlineSigner); setSigningClient(client); setIsLoading(false); - } catch { + } catch (e: any) { console.error('Error creating signing client'); } }; diff --git a/packages/react/src/lib/provider/SeiWalletProvider.tsx b/packages/react/src/lib/provider/SeiWalletProvider.tsx index 02973d70..bd46a761 100644 --- a/packages/react/src/lib/provider/SeiWalletProvider.tsx +++ b/packages/react/src/lib/provider/SeiWalletProvider.tsx @@ -50,7 +50,7 @@ const SeiWalletProvider = ({ children, chainConfiguration, wallets, autoConnect return; } - const enableResponse = await targetWallet.connect(chainConfiguration.chainId); + await targetWallet.connect(chainConfiguration.chainId); const fetchedOfflineSigner = await targetWallet.getOfflineSigner(chainConfiguration.chainId); if (!fetchedOfflineSigner) { diff --git a/packages/react/src/lib/provider/__tests__/helpers.ts b/packages/react/src/lib/provider/__tests__/helpers.spec.ts similarity index 100% rename from packages/react/src/lib/provider/__tests__/helpers.ts rename to packages/react/src/lib/provider/__tests__/helpers.spec.ts diff --git a/packages/react/src/lib/provider/__tests__/keplrVerification.spec.ts b/packages/react/src/lib/provider/__tests__/keplrVerification.spec.ts new file mode 100644 index 00000000..42f5363f --- /dev/null +++ b/packages/react/src/lib/provider/__tests__/keplrVerification.spec.ts @@ -0,0 +1,52 @@ +import { getVerifiedSuggestChain } from '../keplrVerification'; + +describe('getVerifiedSuggestChain function', () => { + it('should return the correct chain data for a given chainId', () => { + const chainId = 'testchain'; + const expectedOutput = { + chainId: 'testchain', + chainName: 'Sei (testchain)', + rpc: 'https://rpc.wallet.testchain.sei.io', + rest: 'https://rest.wallet.testchain.sei.io', + bip44: { + coinType: 118 + }, + bech32Config: { + bech32PrefixAccAddr: 'sei', + bech32PrefixAccPub: 'seipub', + bech32PrefixValAddr: 'seivaloper', + bech32PrefixValPub: 'seivaloperpub', + bech32PrefixConsAddr: 'seivalcons', + bech32PrefixConsPub: 'seivalconspub' + }, + currencies: [ + { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6 + } + ], + feeCurrencies: [ + { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6, + gasPriceStep: { + low: 0.001, + average: 0.02, + high: 0.03 + } + } + ], + stakeCurrency: { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6 + }, + coinType: 118, + features: ['stargate', 'ibc-transfer', 'cosmwasm'] + }; + + expect(getVerifiedSuggestChain(chainId)).toEqual(expectedOutput); + }); +}); diff --git a/packages/react/src/lib/provider/keplrVerification.ts b/packages/react/src/lib/provider/keplrVerification.ts index b26327cf..fd2aa09c 100644 --- a/packages/react/src/lib/provider/keplrVerification.ts +++ b/packages/react/src/lib/provider/keplrVerification.ts @@ -1,53 +1,43 @@ export const getVerifiedSuggestChain = (chainId: string) => ({ - chainId: chainId, - chainName: `Sei (${chainId})`, - rpc: `https://rpc.wallet.${chainId}.sei.io`, - rest: `https://rest.wallet.${chainId}.sei.io`, - bip44: { - coinType: 118, - }, - bech32Config: { - bech32PrefixAccAddr: 'sei', - bech32PrefixAccPub: `seipub`, - bech32PrefixValAddr: `seivaloper`, - bech32PrefixValPub: `seivaloperpub`, - bech32PrefixConsAddr: `seivalcons`, - bech32PrefixConsPub: `seivalconspub`, - }, - currencies: [ - { - coinDenom: 'SEI', - coinMinimalDenom: 'usei', - coinDecimals: 6, - }, - ], - feeCurrencies: [ - { - coinDenom: 'SEI', - coinMinimalDenom: 'usei', - coinDecimals: 6, - gasPriceStep: { - low: 0.001, - average: 0.02, - high: 0.03, - }, - }, - ], - stakeCurrency: { - coinDenom: 'SEI', - coinMinimalDenom: 'usei', - coinDecimals: 6, - }, - coinType: 118, - features: ['stargate', 'ibc-transfer', 'cosmwasm'], + chainId: chainId, + chainName: `Sei (${chainId})`, + rpc: `https://rpc.wallet.${chainId}.sei.io`, + rest: `https://rest.wallet.${chainId}.sei.io`, + bip44: { + coinType: 118 + }, + bech32Config: { + bech32PrefixAccAddr: 'sei', + bech32PrefixAccPub: `seipub`, + bech32PrefixValAddr: `seivaloper`, + bech32PrefixValPub: `seivaloperpub`, + bech32PrefixConsAddr: `seivalcons`, + bech32PrefixConsPub: `seivalconspub` + }, + currencies: [ + { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6 + } + ], + feeCurrencies: [ + { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6, + gasPriceStep: { + low: 0.001, + average: 0.02, + high: 0.03 + } + } + ], + stakeCurrency: { + coinDenom: 'SEI', + coinMinimalDenom: 'usei', + coinDecimals: 6 + }, + coinType: 118, + features: ['stargate', 'ibc-transfer', 'cosmwasm'] }); - -export const checkKeplrForChain = async (chainId: string) => { - const keplrChainInformation = await window[ - 'keplr' - ]?.getChainInfosWithoutEndpoints(); - const chainInfo = keplrChainInformation?.find( - (chainInfo) => chainInfo.chainId === chainId - ); - return !!chainInfo; -}; diff --git a/packages/react/src/lib/utils/__tests__/address.spec.ts b/packages/react/src/lib/utils/__tests__/address.spec.ts new file mode 100644 index 00000000..fa563834 --- /dev/null +++ b/packages/react/src/lib/utils/__tests__/address.spec.ts @@ -0,0 +1,26 @@ +import { truncateAddress } from '../address'; + +describe('truncateAddress', () => { + it('should return the truncated address with first 3 and last 5 characters for valid sei account addresses', () => { + const address = 'sei14ae4g3422thcyuxler2ws3w25fpesrh2uqmgm9'; + const truncatedAddress = truncateAddress(address); + expect(truncatedAddress).toBe('sei....qmgm9'); + }); + + it('should return the truncated address with first 3 and last 5 characters for valid sei contract addresses', () => { + const address = 'sei1v02xglfgtf4dk6jf8xa92my49zs4395zjnf4hzpzrs944znzdztq56zrr0'; + const truncatedAddress = truncateAddress(address); + expect(truncatedAddress).toBe('sei....6zrr0'); + }); + + it('should return the input address for invalid sei addresses', () => { + const ethAddress = '0x32Be343B94f860124dC4fEe278FDCBD38C102D88'; + expect(truncateAddress(ethAddress)).toBe(ethAddress); + + const shortAddress = 'sei14ae4g3422thcyuxler2ws3w25fpesrh'; + expect(truncateAddress(shortAddress)).toBe(shortAddress); + + const osmoAddress = 'osmo14ae4g3422thcyuxler2ws3w25fpesrh2uqmgm9'; + expect(truncateAddress(osmoAddress)).toBe(osmoAddress); + }); +}); diff --git a/packages/react/src/lib/utils/__tests__/css.ts b/packages/react/src/lib/utils/__tests__/css.spec.ts similarity index 100% rename from packages/react/src/lib/utils/__tests__/css.ts rename to packages/react/src/lib/utils/__tests__/css.spec.ts diff --git a/packages/react/src/lib/utils/__tests__/shouldUseTm34Client.ts b/packages/react/src/lib/utils/__tests__/shouldUseTm34Client.spec.ts similarity index 100% rename from packages/react/src/lib/utils/__tests__/shouldUseTm34Client.ts rename to packages/react/src/lib/utils/__tests__/shouldUseTm34Client.spec.ts diff --git a/packages/react/src/lib/utils/address.ts b/packages/react/src/lib/utils/address.ts new file mode 100644 index 00000000..702242c2 --- /dev/null +++ b/packages/react/src/lib/utils/address.ts @@ -0,0 +1,8 @@ +import { isValidSeiAddress } from '@sei-js/core'; + +export const truncateAddress = (address: string) => { + if (!isValidSeiAddress(address)) { + return address; + } + return `${address.slice(0, 3)}....${address.slice(address.length - 5)}`; +}; diff --git a/packages/react/tsconfig.declarations.json b/packages/react/tsconfig.declarations.json index 40ea07df..5cb709c5 100644 --- a/packages/react/tsconfig.declarations.json +++ b/packages/react/tsconfig.declarations.json @@ -5,5 +5,12 @@ "emitDeclarationOnly": true }, "include": ["src"], - "exclude": ["node_modules", "**/*.test.ts"] + "exclude": [ + "node_modules", + "**/*.spec.ts", + "**/*.spec.js", + "**/*.test.ts", + "**/*.test.js", + "**/__tests__/**/*" + ] } diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index a308e5d6..c5364236 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -17,8 +17,16 @@ "ScriptHost", "ES2016.Array.Include" ], - "jsx": "react", + "jsx": "react-jsx", + "jsxImportSource": "react" }, "include": ["src"], - "exclude": ["node_modules"] + "exclude": [ + "node_modules", + "**/*.spec.ts", + "**/*.spec.js", + "**/*.test.ts", + "**/*.test.js", + "**/__tests__/**/*" + ] } diff --git a/packages/testing/.eslintignore b/packages/testing/.eslintignore deleted file mode 100644 index 76add878..00000000 --- a/packages/testing/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist \ No newline at end of file diff --git a/packages/testing/.eslintrc.json b/packages/testing/.eslintrc.json deleted file mode 100644 index 8efdd5f0..00000000 --- a/packages/testing/.eslintrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], - "root": true -} diff --git a/packages/testing/.npmignore b/packages/testing/.npmignore deleted file mode 100644 index ba49d743..00000000 --- a/packages/testing/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -src -node_modules diff --git a/packages/testing/README.md b/packages/testing/README.md deleted file mode 100644 index 1150c758..00000000 --- a/packages/testing/README.md +++ /dev/null @@ -1,161 +0,0 @@ -# @sei-js/react - -A React helper library for [@sei-js/core](https://www.npmjs.com/package/@sei-js/core) written in Typescript. - -## Tutorial - -For an in depth tutorial, please see [our documentation](https://docs.seinetwork.io/front-end-development/react-tutorial). - -## Installation - -```shell -yarn add @sei-js/react -``` - -# WalletProvider -The first step is to wrap your entire application in a Sei wallet provider and pass in a chainId, rest url, and rpc url. -```javascript - - - -``` - -# Hooks - -| Hook | Params | -|-----------------------------------------------|-----------------------| -| [useWallet](#useWallet) | --- | -| [useQueryClient](#useQueryClient) | (rpcAddress?: string) | -| [useSigningClient](#useSigningClient) | (rpcAddress?: string) | -| [useSeiCosmWasmClient](#useSeiCosmWasmClient) | --- | - -## useWallet - -A hook to connect one of our supported wallets to your application. - - -```javascript -import { useWallet } from '@sei-js/react'; - -const { offlineSigner, accounts, connectedWallet } = useWallet(); -``` - -### Return Values - -| Property | Type | Description | -|------------------|-----------|---------------------------------------------------------| -| connectedWallet | string? | The currently connected wallet | -| chainId | string | Sei chain id | -| restUrl | string | The rest url associated with the connected wallet | -| rpcUrl | string | The rpc url associated with the connected wallet | -| offlineSigner | object? | The offline signer associated with the connected wallet | -| accounts | object[]? | The accounts associated with the connected wallet | - -## useQueryClient - -```javascript -import { useQueryClient } from '@sei-js/react'; - -const { queryClient, isLoading } = useQueryClient(); -``` - -| Property | Type | Description | -|-------------|------------------------|---------------------------------------------------------| -| queryClient | StargateSigningClient? | A stargate signing client. | -| isLoading | boolean | Boolean value for when the initial loading is happening | - -## useSigningClient - -```javascript -import { useSigningClient } from '@sei-js/react'; - -const { signingClient, isLoading } = useSigningClient(); -``` - -| Property | Type | Description | -|---------------|------------------------|---------------------------------------------------------| -| signingClient | StargateSigningClient? | A stargate signing client. | -| isLoading | boolean | Boolean value for when the initial loading is happening | - -## useSeiCosmWasmClient - -```javascript -import { useSeiCosmWasmClient } from '@sei-js/react'; - -const { cosmWasmClient } = useSeiCosmWasmClient(); -``` - -| Property | Type | Description | -|----------------|-----------------|-----------------------------------------| -| cosmWasmClient | CosmWasmClient? | A cosm wasm client for smart contracts. | - -# UI Components -This package contains two helpful UI components for connecting to a wallet provider. - -## \ -This component renders a button that will open a modal to connect to a wallet provider. - -```javascript -import React from "react"; -import {useWallet, WalletConnectButton} from "../lib"; - -const Component = () => { - const { connectedWallet } = useWallet(); - - return ( -
- -

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

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

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

-
- ); -}; - -export default Component; - -``` - -### Other helpful packages - -- [@sei-js/core](https://www.npmjs.com/package/@sei-js/core) - TypeScript library containing helper functions for wallet connection, transaction sig -ning, and RPC querying. -- [@sei-js/proto](https://www.npmjs.com/package/@sei-js/proto) - TypeScript library for Sei protobufs generated using Telescope diff --git a/packages/testing/babel.config.json b/packages/testing/babel.config.json deleted file mode 100644 index f057b7fe..00000000 --- a/packages/testing/babel.config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "presets": [ - "@babel/preset-env", - "@babel/preset-react", - "@babel/preset-typescript" - ], - "plugins": [ - "@babel/plugin-transform-runtime" - ] -} diff --git a/packages/testing/jest.config.ts b/packages/testing/jest.config.ts deleted file mode 100644 index b9148150..00000000 --- a/packages/testing/jest.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'jsdom', -}; diff --git a/packages/testing/package.json b/packages/testing/package.json deleted file mode 100644 index 52c0fac0..00000000 --- a/packages/testing/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "@sei-js/testing", - "version": "3.0.2", - "description": "React library for helping with writing great tests for your Sei projects.", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "scripts": { - "prebuild": "rimraf dist", - "build": "yarn build:types && yarn build:js && yarn build:prettier", - "build:types": "tsc --project tsconfig.declarations.json", - "build:js": "babel src --out-dir dist --extensions '.js,.jsx,.ts,.tsx' --source-maps --copy-files", - "build:prettier": "prettier --write dist" - }, - "homepage": "https://github.com/sei-protocol/sei-js#readme", - "keywords": [ - "sei", - "javascript", - "typescript", - "react", - "jest", - "selenium" - ], - "repository": "git@github.com:sei-protocol/sei-js.git", - "license": "MIT", - "private": false, - "dependencies": { - "adm-zip": "^0.5.10", - "chromedriver": "^117.0.3", - "selenium-webdriver": "^4.13.0", - "ts-node": "^10.9.1" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "devDependencies": { - "@babel/core": "^7.22.9", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@types/adm-zip": "^0.5.1", - "@types/react": "^17.0.0 || ^18.0.0", - "@types/react-outside-click-handler": "^1.3.1", - "@types/selenium-webdriver": "^4.1.16", - "prettier": "^3.0.0", - "react": "^17.0.0 || ^18.0.0", - "typescript": "5.1.6" - } -} diff --git a/packages/testing/src/index.ts b/packages/testing/src/index.ts deleted file mode 100644 index b303bc8e..00000000 --- a/packages/testing/src/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import * as process from 'process'; -import { Buffer } from 'buffer'; - -// Polyfill process and buffer for browser -Object.assign(self, { - process, - global: self, - Buffer -}); - -export * from './lib'; diff --git a/packages/testing/src/lib/index.ts b/packages/testing/src/lib/index.ts deleted file mode 100644 index 9a616300..00000000 --- a/packages/testing/src/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './selenium'; diff --git a/packages/testing/src/lib/selenium/compass.crx b/packages/testing/src/lib/selenium/compass.crx deleted file mode 100644 index 0c469dd5..00000000 Binary files a/packages/testing/src/lib/selenium/compass.crx and /dev/null differ diff --git a/packages/testing/src/lib/selenium/compass.ts b/packages/testing/src/lib/selenium/compass.ts deleted file mode 100644 index 8dbcaa6c..00000000 --- a/packages/testing/src/lib/selenium/compass.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { By, Locator, until, WebDriver } from 'selenium-webdriver'; - -const WAIT_TIME = 50000; -const INITIAL_LOAD_TIME = 1500; -const INTERACTION_DELAY_TIME = 250; - -const naturallyFindAndClick = async (driver: WebDriver, locator: Locator) => { - const item = await driver.wait(until.elementLocated(locator), WAIT_TIME); - await driver.wait(until.elementIsVisible(item), WAIT_TIME); - await driver.sleep(INTERACTION_DELAY_TIME); - await item.click(); - return item; -}; - -export const setupWallet = async (driver: WebDriver, extensionId: string, seedPhrase: string, password: string) => { - await driver.sleep(INITIAL_LOAD_TIME); - - await naturallyFindAndClick(driver, By.css("[data-testing-id='import-seed-phrase']")); - - const seedPhraseInput = await naturallyFindAndClick(driver, By.css("[data-testing-id='enter-phrase']")); - await seedPhraseInput.sendKeys(seedPhrase); - - await naturallyFindAndClick(driver, By.css("[data-testing-id='btn-import-wallet']")); - - await naturallyFindAndClick(driver, By.css("[data-testing-id='wallet-1']")); - - await naturallyFindAndClick(driver, By.css("[data-testing-id='btn-select-wallet-proceed']")); - - const passwordInput = await naturallyFindAndClick(driver, By.css("[data-testing-id='input-password']")); - await passwordInput.sendKeys(password); - - const confirmPasswordInput = await naturallyFindAndClick(driver, By.css("[data-testing-id='input-confirm-password']")); - await confirmPasswordInput.sendKeys(password); - - await naturallyFindAndClick(driver, By.css("[data-testing-id='btn-password-proceed']")); - - driver.wait(until.elementLocated(By.css("[data-testing-id='ready-wallet-ele']")), WAIT_TIME); -}; - -export const connectToApp = async (driver: WebDriver, connect = true) => { - if (connect) { - return await naturallyFindAndClick(driver, By.xpath("//*[contains(text(), 'Connect')]")); - } else { - return await naturallyFindAndClick(driver, By.xpath("//*[contains(text(), 'Cancel')]")); - } -}; - -export const confirmTransaction = async (driver: WebDriver, confirm = true) => { - //Confirm or reject transaction -}; - -export const unlockWallet = async (driver: WebDriver, password: string) => { - //Unlock wallet with password -}; diff --git a/packages/testing/src/lib/selenium/fin.crx b/packages/testing/src/lib/selenium/fin.crx deleted file mode 100644 index 3cff533d..00000000 Binary files a/packages/testing/src/lib/selenium/fin.crx and /dev/null differ diff --git a/packages/testing/src/lib/selenium/fin.ts b/packages/testing/src/lib/selenium/fin.ts deleted file mode 100644 index 7e73a5fe..00000000 --- a/packages/testing/src/lib/selenium/fin.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { By, Locator, until, WebDriver } from 'selenium-webdriver'; - -const WAIT_TIME = 5000; -const INITIAL_LOAD_TIME = 4500; -const INTERACTION_DELAY_TIME = 300; - -const naturallyFindAndClick = async (driver: WebDriver, locator: Locator) => { - const item = await driver.wait(until.elementLocated(locator), WAIT_TIME); - await driver.wait(until.elementIsVisible(item), WAIT_TIME); - await driver.sleep(INTERACTION_DELAY_TIME); - await item.click(); - await driver.sleep(INTERACTION_DELAY_TIME); - return item; -}; - -export const setupWallet = async (driver: WebDriver, extensionId: string, seedPhrase: string, password: string) => { - await driver.get(`chrome-extension://${extensionId}/tabs/welcome.html`); - await driver.sleep(INITIAL_LOAD_TIME); - - await naturallyFindAndClick(driver, By.xpath("//*[contains(text(), 'Restore a wallet')]")); - - const passwordInput = await naturallyFindAndClick(driver, By.xpath("//input[@placeholder='Enter your new password']")); - await passwordInput.sendKeys(password); - - const confirmPasswordInput = await naturallyFindAndClick(driver, By.xpath("//input[@placeholder='Re-enter your new password']")); - await confirmPasswordInput.sendKeys(password); - - await naturallyFindAndClick(driver, By.xpath('//*[@id="__plasmo"]/main/div/div/div[2]/form/div[3]/div/div')); - - await naturallyFindAndClick(driver, By.xpath("//*[contains(text(), 'Create Password')]")); - - await naturallyFindAndClick(driver, By.xpath("//*[contains(text(), 'Using a passphrase / private key')]")); - - const seedPhraseInput = await naturallyFindAndClick(driver, By.xpath("//textarea[@placeholder='cake pizza cat...']")); - await seedPhraseInput.sendKeys(seedPhrase); - - await naturallyFindAndClick(driver, By.xpath("//button[contains(text(), 'Restore')]")); - - await naturallyFindAndClick(driver, By.xpath("//*[contains(text(), 'Clear')]")); - - const nameInput = await naturallyFindAndClick(driver, By.xpath("//input[@value='']")); - await nameInput.sendKeys('Automated Wallet'); - - await naturallyFindAndClick(driver, By.xpath("//button[contains(text(), 'Start Using')]")); -}; - -export const connectToApp = async (driver: WebDriver, connect = true) => { - if (connect) { - return await naturallyFindAndClick(driver, By.xpath("//button[contains(text(), 'Connect')]")); - } else { - return await naturallyFindAndClick(driver, By.xpath("//button[contains(text(), 'Reject')]")); - } -}; - -export const confirmTransaction = async (driver: WebDriver, confirm = true) => { - //Confirm or reject transaction -}; - -export const unlockWallet = async (driver: WebDriver, password: string) => { - //Unlock wallet with password -}; diff --git a/packages/testing/src/lib/selenium/index.ts b/packages/testing/src/lib/selenium/index.ts deleted file mode 100644 index 3c5958cf..00000000 --- a/packages/testing/src/lib/selenium/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './wallet'; diff --git a/packages/testing/src/lib/selenium/registry.ts b/packages/testing/src/lib/selenium/registry.ts deleted file mode 100644 index b4ca9804..00000000 --- a/packages/testing/src/lib/selenium/registry.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type Extension = { id?: string; path: string; provider: 'compass' | 'fin'; name: 'Compass' | 'Fin' }; - -export const COMPASS_LATEST_RELEASE: Extension = { provider: 'compass', path: './compass.crx', name: 'Compass' }; -export const FIN_LATEST_RELEASE: Extension = { provider: 'fin', path: './fin.crx', name: 'Fin' }; diff --git a/packages/testing/src/lib/selenium/wallet.ts b/packages/testing/src/lib/selenium/wallet.ts deleted file mode 100644 index e16ae200..00000000 --- a/packages/testing/src/lib/selenium/wallet.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { Builder, By, until, WebDriver } from 'selenium-webdriver'; -import chrome from 'selenium-webdriver/chrome'; -import { connectToApp as connectAppToCompass, setupWallet as setupCompassWallet } from './compass'; -import { connectToApp as connectAppToFin, setupWallet as setupFinWallet } from './fin'; -import { COMPASS_LATEST_RELEASE, Extension, FIN_LATEST_RELEASE } from './registry'; -import * as path from 'path'; -import { promises as fs } from 'fs'; - -export const initializeWallet = async (driver: WebDriver, extension: Extension) => { - if (!extension.id) { - throw new Error('Extension id not found'); - } - - switch (extension.provider) { - case 'compass': - let handles = await driver.getAllWindowHandles(); - while (handles.length < 2) { - await driver.sleep(100); - handles = await driver.getAllWindowHandles(); - } - await driver.close(); // Close the original tab - await driver.switchTo().window(handles[1]); // Switch to the new tab - - await setupCompassWallet(driver, extension.id, 'betray knock armed museum gesture visit vapor text curious stove bomb rate', 'password1234'); - return; - case 'fin': - await setupFinWallet(driver, extension.id, 'betray knock armed museum gesture visit vapor text curious stove bomb rate', 'password1234'); - return; - } -}; - -export const approveAppConnection = async (driver: WebDriver, extension: Extension) => { - try { - switch (extension.provider) { - case 'compass': - return await connectAppToCompass(driver, true); - case 'fin': - return await connectAppToFin(driver, true); - } - } catch (e) { - console.log('error', e); - } -}; - -export const switchToExtensionWindow = async (driver: WebDriver) => { - const originalWindow = await driver.getWindowHandle(); - - // Wait for the new window or tab - await driver.wait(async () => (await driver.getAllWindowHandles()).length > 1, 10000, 'New window did not open in time'); - await driver.sleep(2000); - - // Loop through until we find a new window handle - let handles = await driver.getAllWindowHandles(); - for (const handle of handles) { - if (handle !== originalWindow) { - await driver.switchTo().window(handle); - break; - } - } -}; - -const createTempDir = async (dirPath: string): Promise => { - try { - await fs.mkdir(dirPath, { recursive: true }); - } catch (err) { - console.error(`Failed to create directory: ${err}`); - } -}; - -const fileExists = async (filePath: string): Promise => { - try { - const stats = await fs.stat(filePath); - return stats.isDirectory(); - } catch (err) { - return false; - } -}; - -const getExtensionIds = async (userDataDir: string): Promise => { - const extensionsDir = path.join(userDataDir, 'Default', 'Local Extension Settings'); - let extensionIds: string[] = []; - - try { - const doesDirExist = await fileExists(extensionsDir); - if (doesDirExist) { - extensionIds = await fs.readdir(extensionsDir); - } - } catch (err) { - console.error(`Could not read directory: ${err}`); - } - - return extensionIds; -}; - -const test = async (extension: Extension) => { - const dirPath = path.resolve(__dirname, './instance-data'); - await fs.rm(dirPath, { recursive: true, force: true }); - - const userDataDir = path.resolve(__dirname, './instance-data'); - - await createTempDir(userDataDir); - let options = new chrome.Options(); - - options.addExtensions(extension.path); - options.addArguments(`user-data-dir=${userDataDir}`); - let driver = await new Builder().forBrowser('chrome').setChromeOptions(options).build(); - - let extensionIds = await getExtensionIds(userDataDir); - while (extensionIds.length === 0) { - await driver.sleep(250); - extensionIds = await getExtensionIds(userDataDir); - } - - extension.id = extensionIds[0]; - - try { - await initializeWallet(driver, extension); - - await driver.get('https://app.sei.io'); - - const checkbox = await driver.wait(until.elementLocated(By.xpath("//input[@type='checkbox']")), 100000); - await driver.wait(until.elementIsVisible(checkbox), 5000); - await checkbox.click(); - - const agreeButton = await driver.wait(until.elementLocated(By.xpath("//button[contains(text(), 'Agree')]")), 100000); - await driver.wait(until.elementIsVisible(agreeButton), 5000); - await agreeButton.click(); - - const connectWalletButton = await driver.wait(until.elementLocated(By.xpath("//button[contains(text(), 'connect wallet')]")), 100000); - await driver.wait(until.elementIsVisible(connectWalletButton), 5000); - await connectWalletButton.click(); - - const finButton = await driver.wait(until.elementLocated(By.xpath(`//p[contains(text(), '${extension.name}')]`)), 100000); - await driver.wait(until.elementIsVisible(finButton), 5000); - await finButton.click(); - - await switchToExtensionWindow(driver); - - await approveAppConnection(driver, extension); - await driver.switchTo().defaultContent(); - } catch (e) { - console.error('ERROR', e); - } finally { - console.log('FINALLY'); - await driver.sleep(10000); - } -}; - -test(FIN_LATEST_RELEASE); diff --git a/packages/testing/tsconfig.declarations.json b/packages/testing/tsconfig.declarations.json deleted file mode 100644 index 40ea07df..00000000 --- a/packages/testing/tsconfig.declarations.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": true, - "emitDeclarationOnly": true - }, - "include": ["src"], - "exclude": ["node_modules", "**/*.test.ts"] -} diff --git a/packages/testing/tsconfig.json b/packages/testing/tsconfig.json deleted file mode 100644 index de119117..00000000 --- a/packages/testing/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES6", - "module": "commonjs", - "declaration": true, - "outDir": "./dist", - "strict": true, - "allowSyntheticDefaultImports": true, - "skipLibCheck": true, - "noImplicitAny": false, - "esModuleInterop": true, - "types": ["node"], - "lib": [ - "ES5", - "DOM", - "ES6", - "DOM.Iterable", - "ScriptHost", - "ES2016.Array.Include" - ], - "jsx": "react", - }, - "include": ["src"], - "exclude": ["node_modules"] -} diff --git a/yarn.lock b/yarn.lock index 193ec2d9..58f25178 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@adobe/css-tools@^4.3.0": + version "4.3.1" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" + integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== + "@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": version "2.2.0" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -33,14 +38,7 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.5": - 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/code-frame@^7.22.13": +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -48,6 +46,13 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" +"@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.5": + 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.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.20.5": version "7.21.0" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" @@ -131,7 +136,7 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.23.0": +"@babel/core@^7.22.9", "@babel/core@^7.23.0": version "7.23.0" resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== @@ -1086,9 +1091,9 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.22.5": +"@babel/plugin-syntax-jsx@^7.22.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" + resolved "https://registry.npmjs.org/@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" @@ -1839,7 +1844,7 @@ babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" -"@babel/plugin-transform-runtime@^7.22.15": +"@babel/plugin-transform-runtime@^7.22.15", "@babel/plugin-transform-runtime@^7.22.9": version "7.22.15" resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== @@ -2160,7 +2165,7 @@ core-js-compat "^3.25.1" semver "^6.3.0" -"@babel/preset-env@^7.22.20": +"@babel/preset-env@^7.22.20", "@babel/preset-env@^7.22.9": version "7.22.20" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== @@ -2266,7 +2271,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.22.15": +"@babel/preset-react@^7.22.15", "@babel/preset-react@^7.22.5": version "7.22.15" resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== @@ -2298,7 +2303,7 @@ "@babel/plugin-transform-modules-commonjs" "^7.22.5" "@babel/plugin-transform-typescript" "^7.22.5" -"@babel/preset-typescript@^7.22.15": +"@babel/preset-typescript@^7.22.15", "@babel/preset-typescript@^7.22.5": version "7.23.0" resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz#cc6602d13e7e5b2087c811912b87cf937a9129d9" integrity sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== @@ -2340,6 +2345,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2": + version "7.23.1" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.21.0": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" @@ -2406,7 +2418,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.18.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.18.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": version "7.21.2" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== @@ -3107,54 +3119,53 @@ resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^28.1.1", "@jest/core@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" - integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: - "@jest/console" "^28.1.3" - "@jest/reporters" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^28.1.3" - jest-config "^28.1.3" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-resolve-dependencies "^28.1.3" - jest-runner "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - jest-watcher "^28.1.3" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - pretty-format "^28.1.3" - rimraf "^3.0.0" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^28.1.1", "@jest/environment@^28.1.3": +"@jest/environment@^28.1.1": version "28.1.3" resolved "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== @@ -3164,12 +3175,15 @@ "@types/node" "*" jest-mock "^28.1.3" -"@jest/expect-utils@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" - integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - jest-get-type "^28.0.2" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" "@jest/expect-utils@^29.4.3": version "29.4.3" @@ -3178,13 +3192,20 @@ dependencies: jest-get-type "^29.4.3" -"@jest/expect@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" - integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - expect "^28.1.3" - jest-snapshot "^28.1.3" + expect "^29.7.0" + jest-snapshot "^29.7.0" "@jest/fake-timers@^28.1.1", "@jest/fake-timers@^28.1.3": version "28.1.3" @@ -3198,26 +3219,39 @@ jest-mock "^28.1.3" jest-util "^28.1.3" -"@jest/globals@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" - integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/reporters@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" - integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -3225,17 +3259,16 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - jest-worker "^28.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" "@jest/schemas@^28.1.3": @@ -3252,33 +3285,40 @@ dependencies: "@sinclair/typebox" "^0.25.16" -"@jest/source-map@^28.1.2": - version "28.1.2" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" - integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@jridgewell/trace-mapping" "^0.3.13" + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" - integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^28.1.3" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" + jest-haste-map "^29.7.0" slash "^3.0.0" "@jest/transform@28.1.3", "@jest/transform@^28.1.3": @@ -3302,6 +3342,27 @@ slash "^3.0.0" write-file-atomic "^4.0.1" +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^28.1.1", "@jest/types@^28.1.3": version "28.1.3" resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" @@ -3326,6 +3387,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -3348,6 +3421,11 @@ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -3358,6 +3436,11 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -3374,6 +3457,14 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@jridgewell/trace-mapping@^0.3.18": + version "0.3.19" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" @@ -3821,6 +3912,11 @@ resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -3828,6 +3924,20 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" @@ -3840,6 +3950,51 @@ resolved "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz#fbb68696899d7b8c1b9b891eded9c04fe2cd5529" integrity sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A== +"@testing-library/dom@^9.0.0": + version "9.3.3" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz#108c23a5b0ef51121c26ae92eb3179416b0434f5" + integrity sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^6.1.3": + version "6.1.3" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.3.tgz#443118c9e4043f96396f120de2c7122504a079c5" + integrity sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ== + dependencies: + "@adobe/css-tools" "^4.3.0" + "@babel/runtime" "^7.9.2" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react-hooks@^8.0.1": + version "8.0.1" + resolved "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz#0924bbd5b55e0c0c0502d1754657ada66947ca12" + integrity sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g== + dependencies: + "@babel/runtime" "^7.12.5" + react-error-boundary "^3.1.0" + +"@testing-library/react@^14.0.0": + version "14.0.0" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c" + integrity sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^9.0.0" + "@types/react-dom" "^18.0.0" + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -3872,6 +4027,11 @@ dependencies: "@types/node" "*" +"@types/aria-query@^5.0.1": + version "5.0.2" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.2.tgz#6f1225829d89794fd9f891989c9ce667422d7f64" + integrity sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ== + "@types/babel__core@^7.1.14": version "7.20.0" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" @@ -3912,11 +4072,6 @@ dependencies: "@types/node" "*" -"@types/crypto-js@^4.1.1": - version "4.1.1" - resolved "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" - integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== - "@types/elliptic@^6.4.14": version "6.4.14" resolved "https://registry.npmjs.org/@types/elliptic/-/elliptic-6.4.14.tgz#7bbaad60567a588c1f08b10893453e6b9b4de48e" @@ -3965,10 +4120,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.4.0": - version "29.4.0" - resolved "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" - integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== +"@types/jest@^29.5.5": + version "29.5.5" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" + integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -4017,6 +4172,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz#c076ed1d7b6095078ad3cf21dfeea951842778b1" integrity sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA== +"@types/node@20.8.2": + version "20.8.2" + resolved "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz#d76fb80d87d0d8abfe334fc6d292e83e5524efc4" + integrity sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w== + "@types/node@^12.7.1": version "12.20.55" resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" @@ -4037,7 +4197,7 @@ resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== -"@types/prettier@^2.1.5", "@types/prettier@^2.6.1": +"@types/prettier@^2.6.1": version "2.7.2" resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== @@ -4047,6 +4207,29 @@ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.10": + version "18.2.10" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.10.tgz#06247cb600e39b63a0a385f6a5014c44bab296f2" + integrity sha512-5VEC5RgXIk1HHdyN1pHlg0cOqnxHzvPGpMMyGAP5qSaDRmyZNDaQ0kkVAkK6NYlDhP6YBID3llaXlmAS/mdgCA== + dependencies: + "@types/react" "*" + +"@types/react-outside-click-handler@^1.3.1": + version "1.3.1" + resolved "https://registry.npmjs.org/@types/react-outside-click-handler/-/react-outside-click-handler-1.3.1.tgz#e4772ba550e1a548468203194d2615d8f06acdf9" + integrity sha512-0BNan5zIIDyO5k9LFSG+60ZxQ/0wf+LTF9BJx3oOUdOaJlZk6RCe52jRB75mlvLLJx2YLa61+NidOwBfptWMKw== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.2.25": + version "18.2.25" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.25.tgz#99fa44154132979e870ff409dc5b6e67f06f0199" + integrity sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/react@^17.0.0 || ^18.0.0": version "18.0.37" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.37.tgz#7a784e2a8b8f83abb04dc6b9ed9c9b4c0aee9be7" @@ -4391,6 +4574,13 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -4399,6 +4589,21 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" +aria-query@^5.0.0: + version "5.3.0" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" @@ -4537,7 +4742,7 @@ babel-core@7.0.0-bridge.0: resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== -babel-jest@28.1.3, babel-jest@^28.1.3: +babel-jest@28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== @@ -4550,6 +4755,19 @@ babel-jest@28.1.3, babel-jest@^28.1.3: graceful-fs "^4.2.9" slash "^3.0.0" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -4571,6 +4789,16 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-polyfill-corejs2@^0.3.2, babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" @@ -4653,6 +4881,14 @@ babel-preset-jest@^28.1.3: babel-plugin-jest-hoist "^28.1.3" babel-preset-current-node-syntax "^1.0.0" +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + babel-watch@^7.0.0: version "7.7.2" resolved "https://registry.npmjs.org/babel-watch/-/babel-watch-7.7.2.tgz#9e4ff39f03dc344b0b9b462ba899c91e95ff0e56" @@ -4684,6 +4920,11 @@ bech32@^1.1.4: resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bech32@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" + integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== + better-path-resolve@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" @@ -4909,6 +5150,14 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -5204,6 +5453,19 @@ cosmjs-types@^0.5.2: long "^4.0.0" protobufjs "~6.11.2" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -5234,10 +5496,10 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto-js@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" - integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== cssom@^0.5.0: version "0.5.0" @@ -5359,10 +5621,34 @@ decimal.js@^10.3.1: resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + +deep-equal@^2.0.5: + version "2.2.2" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" + integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.1" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" @@ -5391,6 +5677,15 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -5404,11 +5699,25 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + detect-indent@^6.0.0: version "6.1.0" resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" @@ -5419,16 +5728,16 @@ detect-newline@^3.0.0: resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== - diff-sequences@^29.4.3: version "29.4.3" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + diff@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -5455,6 +5764,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + domexception@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" @@ -5517,10 +5831,10 @@ elliptic@^6.5.3, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" @@ -5597,6 +5911,21 @@ es-array-method-boxes-properly@^1.0.0: resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-set-tostringtag@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" @@ -5932,17 +6261,6 @@ exit@^0.1.2: resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" - integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== - dependencies: - "@jest/expect-utils" "^28.1.3" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - expect@^29.0.0: version "29.4.3" resolved "https://registry.npmjs.org/expect/-/expect-29.4.3.tgz#5e47757316df744fe3b8926c3ae8a3ebdafff7fe" @@ -5954,6 +6272,17 @@ expect@^29.0.0: jest-message-util "^29.4.3" jest-util "^29.4.3" +expect@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + ext@^1.1.2: version "1.7.0" resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" @@ -6027,7 +6356,7 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -6258,7 +6587,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -6287,6 +6616,16 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has "^1.0.3" has-symbols "^1.0.3" +get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -6711,6 +7050,14 @@ ip-regex@^4.1.0: resolved "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-array-buffer@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" @@ -6720,6 +7067,15 @@ is-array-buffer@^3.0.1: get-intrinsic "^1.1.3" is-typed-array "^1.1.10" +is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -6766,7 +7122,7 @@ is-core-module@^2.11.0, is-core-module@^2.8.1, is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -6805,6 +7161,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -6857,6 +7218,11 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -6906,6 +7272,11 @@ is-url@^1.2.4: resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -6913,6 +7284,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6934,6 +7313,11 @@ is2@^2.0.6: ip-regex "^4.1.0" is-url "^1.2.4" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -6959,7 +7343,7 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.npmjs.org/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: +istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -6970,6 +7354,17 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -7015,95 +7410,86 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jest-changed-files@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" - integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" + jest-util "^29.7.0" p-limit "^3.1.0" -jest-circus@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" - integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - dedent "^0.7.0" + dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" p-limit "^3.1.0" - pretty-format "^28.1.3" + pretty-format "^29.7.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^28.1.1: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" - integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" -jest-config@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" - integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.3" - "@jest/types" "^28.1.3" - babel-jest "^28.1.3" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.3" - jest-environment-node "^28.1.3" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-runner "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.3" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== - dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - jest-diff@^29.4.3: version "29.4.3" resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.3.tgz#42f4eb34d0bf8c0fb08b0501069b87e8e84df347" @@ -7114,23 +7500,33 @@ jest-diff@^29.4.3: jest-get-type "^29.4.3" pretty-format "^29.4.3" -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" - integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.3" - pretty-format "^28.1.3" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" jest-environment-jsdom@28.1.1: version "28.1.1" @@ -7146,28 +7542,28 @@ jest-environment-jsdom@28.1.1: jest-util "^28.1.1" jsdom "^19.0.0" -jest-environment-node@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" - integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" - -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + jest-mock "^29.7.0" + jest-util "^29.7.0" jest-get-type@^29.4.3: version "29.4.3" resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + jest-haste-map@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" @@ -7187,28 +7583,37 @@ jest-haste-map@^28.1.3: optionalDependencies: fsevents "^2.3.2" +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + jest-in-case@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/jest-in-case/-/jest-in-case-1.0.2.tgz#56744b5af33222bd0abab70cf919f1d170ab75cc" integrity sha512-2DE6Gdwnh5jkCYTePWoQinF+zne3lCADibXoYJEt8PS84JaRug0CyAOrEgzMxbzln3YcSY2PBeru7ct4tbflYA== -jest-leak-detector@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" - integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-matcher-utils@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" - integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== - dependencies: - chalk "^4.0.0" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-matcher-utils@^29.4.3: version "29.4.3" @@ -7220,6 +7625,16 @@ jest-matcher-utils@^29.4.3: jest-get-type "^29.4.3" pretty-format "^29.4.3" +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + jest-message-util@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" @@ -7250,6 +7665,21 @@ jest-message-util@^29.4.3: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^28.1.1, jest-mock@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" @@ -7258,6 +7688,15 @@ jest-mock@^28.1.1, jest-mock@^28.1.3: "@jest/types" "^28.1.3" "@types/node" "*" +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" @@ -7268,114 +7707,116 @@ jest-regex-util@^28.0.2: resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-resolve-dependencies@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" - integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.3" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" - integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" - integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/console" "^28.1.3" - "@jest/environment" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - emittery "^0.10.2" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.3" - jest-haste-map "^28.1.3" - jest-leak-detector "^28.1.3" - jest-message-util "^28.1.3" - jest-resolve "^28.1.3" - jest-runtime "^28.1.3" - jest-util "^28.1.3" - jest-watcher "^28.1.3" - jest-worker "^28.1.3" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" - integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/globals" "^28.1.3" - "@jest/source-map" "^28.1.2" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" - integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^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.3.3" - "@jest/expect-utils" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^28.1.3" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^28.1.3" - semver "^7.3.5" + pretty-format "^29.7.0" + semver "^7.5.3" -jest-util@^28.0.0, jest-util@^28.1.1, jest-util@^28.1.3: +jest-util@^28.1.1, jest-util@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== @@ -7387,6 +7828,18 @@ jest-util@^28.0.0, jest-util@^28.1.1, jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-util@^29.4.3: version "29.4.3" resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz#851a148e23fc2b633c55f6dad2e45d7f4579f496" @@ -7399,30 +7852,30 @@ jest-util@^29.4.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" - integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^28.0.2" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^28.1.3" + pretty-format "^29.7.0" -jest-watcher@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" + emittery "^0.13.1" + jest-util "^29.7.0" string-length "^4.0.1" jest-worker@^28.1.3: @@ -7434,15 +7887,25 @@ jest-worker@^28.1.3: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@28.1.1: - version "28.1.1" - resolved "https://registry.npmjs.org/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e" - integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: - "@jest/core" "^28.1.1" - "@jest/types" "^28.1.1" + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@29.7.0, jest@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^28.1.1" + jest-cli "^29.7.0" js-sdsl@^4.1.4: version "4.3.0" @@ -7722,7 +8185,7 @@ lodash.startcase@^4.4.0: resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== -lodash@^4.17.12, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0: +lodash@^4.17.12, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7783,6 +8246,11 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -8155,6 +8623,14 @@ object-inspect@^1.12.2, object-inspect@^1.9.0: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -8487,6 +8963,20 @@ prettier@^3.0.0: resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz#e7b19f691245a21d618c68bc54dc06122f6105ae" integrity sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g== +prettier@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" + integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + pretty-format@^28.1.3: version "28.1.3" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" @@ -8506,6 +8996,15 @@ pretty-format@^29.0.0, pretty-format@^29.4.3: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -8580,6 +9079,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -8595,17 +9099,37 @@ quick-lru@^4.0.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-error-boundary@^3.1.0: + version "3.1.4" + resolved "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" + integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== + dependencies: + "@babel/runtime" "^7.12.5" + react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0: version "18.2.0" resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -"react@^17.0.0 || ^18.0.0": +"react@^17.0.0 || ^18.0.0", react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -8707,6 +9231,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7: resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -8730,6 +9259,15 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" +regexp.prototype.flags@^1.5.0: + version "1.5.1" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -8786,10 +9324,10 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" - integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: version "1.22.1" @@ -8906,6 +9444,13 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + selenium-webdriver@^4.13.0: version "4.13.0" resolved "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.13.0.tgz#1e06bab7adedb308e3635131bc75bd32038261d5" @@ -8927,13 +9472,6 @@ semver@7.3.4: dependencies: lru-cache "^6.0.0" -semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -8944,11 +9482,34 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.7: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -9115,6 +9676,13 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-transform@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" @@ -9306,7 +9874,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -9320,14 +9888,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -9379,14 +9939,6 @@ term-size@^2.1.0: resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -9481,18 +10033,18 @@ trim-newlines@^3.0.0: resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -ts-jest@28.0.5: - version "28.0.5" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-28.0.5.tgz#31776f768fba6dfc8c061d488840ed0c8eeac8b9" - integrity sha512-Sx9FyP9pCY7pUzQpy4FgRZf2bhHY3za576HMKJFs+OnQ9jS96Du5vNsDKkyedQkik+sEabbKAnCliv9BEsHZgQ== +ts-jest@29.1.1, ts-jest@^29.1.1: + version "29.1.1" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" - jest-util "^28.0.0" - json5 "^2.2.1" + jest-util "^29.0.0" + json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" - semver "7.x" + semver "^7.5.3" yargs-parser "^21.0.1" ts-node@10.9.1, ts-node@^10.9.1: @@ -9631,6 +10183,11 @@ typescript@5.1.6: resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== +typescript@5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== + typescript@~4.8.4: version "4.8.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" @@ -9853,6 +10410,16 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -9938,7 +10505,7 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.1: +write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==