From d0d9321e792031467f8e95f62c077703f3800887 Mon Sep 17 00:00:00 2001 From: Gao Sun Date: Tue, 22 Nov 2022 00:31:25 +0800 Subject: [PATCH] refactor: use esm (batch 5) --- packages/cli/jest.config.ts | 12 + packages/cli/jest.setup.ts | 19 + packages/cli/package.json | 2 +- .../src/commands/database/alteration/index.ts | 9 +- .../commands/database/alteration/meta-url.ts | 4 + packages/cli/src/meta-url.ts | 4 + packages/cli/src/utilities.ts | 4 +- packages/cli/tsconfig.json | 2 +- packages/cli/tsconfig.test.json | 1 + packages/console/package.json | 1 + .../{svgo.config.js => svgo.config.cjs} | 0 packages/core/jest.setup.ts | 21 + packages/core/package.json | 1 - packages/core/src/connectors/index.ts | 5 +- packages/core/src/connectors/meta-url.ts | 4 + .../src/connectors/utilities/index.test.ts | 2 +- .../lib/sign-in-experience/sign-up.test.ts | 2 +- .../routes/phrase.content-language.test.ts | 2 +- packages/core/src/routes/phrase.test.ts | 2 +- .../routes/session/forgot-password.test.ts | 4 +- .../core/src/routes/session/password.test.ts | 2 +- .../src/routes/session/passwordless.test.ts | 2 +- .../core/src/routes/session/profile.test.ts | 4 +- .../routes/session/social.bind-social.test.ts | 2 +- .../core/src/routes/session/social.test.ts | 2 +- .../routes/sign-in-experience.guard.test.ts | 2 +- .../src/routes/sign-in-experience.test.ts | 2 +- packages/ui/package.json | 1 + pnpm-lock.yaml | 799 +++++++++++++++++- 29 files changed, 884 insertions(+), 33 deletions(-) create mode 100644 packages/cli/jest.setup.ts create mode 100644 packages/cli/src/commands/database/alteration/meta-url.ts create mode 100644 packages/cli/src/meta-url.ts rename packages/console/{svgo.config.js => svgo.config.cjs} (100%) create mode 100644 packages/core/src/connectors/meta-url.ts diff --git a/packages/cli/jest.config.ts b/packages/cli/jest.config.ts index c3f953f6f..3ea7eb21f 100644 --- a/packages/cli/jest.config.ts +++ b/packages/cli/jest.config.ts @@ -2,10 +2,22 @@ import type { Config } from '@silverhand/jest-config'; import { merge } from '@silverhand/jest-config'; const config: Config.InitialOptions = merge({ + // Preset: 'ts-jest/presets/default-esm', + // TransformIgnorePatterns: ['schemas'], + setupFilesAfterEnv: ['./jest.setup.ts'], roots: ['./src'], moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1', }, + globals: { + 'ts-jest': { + useESM: true, + diagnostics: { + ignoreCodes: [1343], + }, + }, + }, + // ExtensionsToTreatAsEsm: ['.ts', '.tsx'], }); export default config; diff --git a/packages/cli/jest.setup.ts b/packages/cli/jest.setup.ts new file mode 100644 index 000000000..7ed7c3aaa --- /dev/null +++ b/packages/cli/jest.setup.ts @@ -0,0 +1,19 @@ +/** + * Mocking `import.meta.url` and `got` here since they inevitably needs native ESM, but jest is sticking with CJS. + * Will figure out a way to run tests in native ESM mode. + */ + +jest.mock('./src/commands/database/alteration/meta-url.js', () => ({ + metaUrl: 'file:///', +})); + +jest.mock('./src/meta-url.js', () => ({ + metaUrl: 'file:///', +})); + +jest.mock('got', () => ({ + got: {}, +})); + +// Make lint-staged happy +export {}; diff --git a/packages/cli/package.json b/packages/cli/package.json index d93c6aff8..b77996a3a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -75,7 +75,7 @@ "@types/tar": "^6.1.2", "@types/yargs": "^17.0.13", "eslint": "^8.21.0", - "jest": "^29.1.2", + "jest": "^29.3.1", "lint-staged": "^13.0.0", "prettier": "^2.7.1", "rimraf": "^3.0.2", diff --git a/packages/cli/src/commands/database/alteration/index.ts b/packages/cli/src/commands/database/alteration/index.ts index 9daa8ca35..61dd31262 100644 --- a/packages/cli/src/commands/database/alteration/index.ts +++ b/packages/cli/src/commands/database/alteration/index.ts @@ -1,5 +1,5 @@ +import { fileURLToPath } from 'node:url'; import path from 'path'; -import { fileURLToPath } from 'url'; import type { AlterationScript } from '@logto/schemas/lib/types/alteration.js'; import { findPackage } from '@logto/shared'; @@ -15,10 +15,11 @@ import { updateDatabaseTimestamp, } from '../../../queries/logto-config.js'; import { getPathInModule, log } from '../../../utilities.js'; +import { metaUrl } from './meta-url.js'; import type { AlterationFile } from './type.js'; import { chooseAlterationsByVersion } from './version.js'; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const currentDirname = path.dirname(fileURLToPath(metaUrl)); const { copy, existsSync, remove, readdir } = fsExtra; const alterationFilenameRegex = /-(\d+)-?.*\.js$/; @@ -48,10 +49,10 @@ export const getAlterationFiles = async (): Promise => { * since they need a proper context that includes required dependencies (such as slonik) in `node_modules/`. * While the original `@logto/schemas` may remove them in production. */ - const packageDirectory = await findPackage(__dirname); + const packageDirectory = await findPackage(currentDirname); const localAlterationDirectory = path.resolve( - packageDirectory ?? __dirname, + packageDirectory ?? currentDirname, 'alteration-scripts' ); diff --git a/packages/cli/src/commands/database/alteration/meta-url.ts b/packages/cli/src/commands/database/alteration/meta-url.ts new file mode 100644 index 000000000..740bd697b --- /dev/null +++ b/packages/cli/src/commands/database/alteration/meta-url.ts @@ -0,0 +1,4 @@ +// Have to define this in a separate file since Jest sticks with CJS +// We need to mock this before running tests +// https://github.com/facebook/jest/issues/12952 +export const metaUrl = import.meta.url; diff --git a/packages/cli/src/meta-url.ts b/packages/cli/src/meta-url.ts new file mode 100644 index 000000000..740bd697b --- /dev/null +++ b/packages/cli/src/meta-url.ts @@ -0,0 +1,4 @@ +// Have to define this in a separate file since Jest sticks with CJS +// We need to mock this before running tests +// https://github.com/facebook/jest/issues/12952 +export const metaUrl = import.meta.url; diff --git a/packages/cli/src/utilities.ts b/packages/cli/src/utilities.ts index 0d303efd1..96483a899 100644 --- a/packages/cli/src/utilities.ts +++ b/packages/cli/src/utilities.ts @@ -14,6 +14,8 @@ import inquirer from 'inquirer'; import ora from 'ora'; import { z } from 'zod'; +import { metaUrl } from './meta-url.js'; + export const safeExecSync = (command: string) => { try { return execSync(command, { encoding: 'utf8', stdio: 'pipe' }); @@ -84,7 +86,7 @@ export const downloadFile = async (url: string, destination: string) => { export const getPathInModule = (moduleName: string, relativePath = '/') => // https://stackoverflow.com/a/49455609/12514940 path.join( - path.dirname(createRequire(import.meta.url).resolve(`${moduleName}/package.json`)), + path.dirname(createRequire(metaUrl).resolve(`${moduleName}/package.json`)), relativePath ); diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index ee7f21474..8378efdc2 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -10,7 +10,7 @@ }, "include": [ "src", - "jest.config.ts" + "jest.*.ts" ], "exclude": ["**/alteration-scripts"] } diff --git a/packages/cli/tsconfig.test.json b/packages/cli/tsconfig.test.json index c68416b04..aa0bf1ab7 100644 --- a/packages/cli/tsconfig.test.json +++ b/packages/cli/tsconfig.test.json @@ -1,6 +1,7 @@ { "extends": "./tsconfig", "compilerOptions": { + "isolatedModules": false, "allowJs": true } } diff --git a/packages/console/package.json b/packages/console/package.json index 40e5cabbe..7b50bca22 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -5,6 +5,7 @@ "author": "Silverhand Inc. ", "homepage": "https://github.com/logto-io/logto#readme", "license": "MPL-2.0", + "type": "module", "private": true, "scripts": { "precommit": "lint-staged", diff --git a/packages/console/svgo.config.js b/packages/console/svgo.config.cjs similarity index 100% rename from packages/console/svgo.config.js rename to packages/console/svgo.config.cjs diff --git a/packages/core/jest.setup.ts b/packages/core/jest.setup.ts index 50a32e5f8..2e91af71d 100644 --- a/packages/core/jest.setup.ts +++ b/packages/core/jest.setup.ts @@ -11,3 +11,24 @@ jest.mock('#src/env-set/check-alteration-state.js'); (async () => { await envSet.load(); })(); + +/** + * Mocking `import.meta.url` and `got` here since they inevitably needs native ESM, but jest is sticking with CJS. + * Will figure out a way to run tests in native ESM mode. + */ + +jest.mock('./src/connectors/meta-url.js', () => ({ + metaUrl: 'file:///', +})); + +jest.mock('../cli/lib/meta-url.js', () => ({ + metaUrl: 'file:///', +})); + +jest.mock('../cli/lib/commands/database/alteration/meta-url.js', () => ({ + metaUrl: 'file:///', +})); + +jest.mock('got', () => ({ + got: {}, +})); diff --git a/packages/core/package.json b/packages/core/package.json index e9af67321..ef861647f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -42,7 +42,6 @@ "etag": "^1.8.1", "find-up": "^5.0.0", "fs-extra": "^10.1.0", - "got": "^11.8.5", "hash-wasm": "^4.9.0", "i18next": "^21.8.16", "iconv-lite": "0.6.3", diff --git a/packages/core/src/connectors/index.ts b/packages/core/src/connectors/index.ts index d0eb3f0d2..5b8f6694e 100644 --- a/packages/core/src/connectors/index.ts +++ b/packages/core/src/connectors/index.ts @@ -13,10 +13,11 @@ import RequestError from '#src/errors/RequestError/index.js'; import { findAllConnectors, insertConnector } from '#src/queries/connector.js'; import { defaultConnectorMethods } from './consts.js'; +import { metaUrl } from './meta-url.js'; import type { VirtualConnector, LogtoConnector } from './types.js'; import { getConnectorConfig, readUrl, validateConnectorModule } from './utilities/index.js'; -const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const currentDirname = path.dirname(fileURLToPath(metaUrl)); // eslint-disable-next-line @silverhand/fp/no-let let cachedVirtualConnectors: VirtualConnector[] | undefined; @@ -25,7 +26,7 @@ export const loadVirtualConnectors = async () => { return cachedVirtualConnectors; } - const coreDirectory = await findPackage(__dirname); + const coreDirectory = await findPackage(currentDirname); const directory = coreDirectory && path.join(coreDirectory, connectorDirectory); if (!directory || !existsSync(directory)) { diff --git a/packages/core/src/connectors/meta-url.ts b/packages/core/src/connectors/meta-url.ts new file mode 100644 index 000000000..740bd697b --- /dev/null +++ b/packages/core/src/connectors/meta-url.ts @@ -0,0 +1,4 @@ +// Have to define this in a separate file since Jest sticks with CJS +// We need to mock this before running tests +// https://github.com/facebook/jest/issues/12952 +export const metaUrl = import.meta.url; diff --git a/packages/core/src/connectors/utilities/index.test.ts b/packages/core/src/connectors/utilities/index.test.ts index b9e1ddfe2..648623a75 100644 --- a/packages/core/src/connectors/utilities/index.test.ts +++ b/packages/core/src/connectors/utilities/index.test.ts @@ -19,7 +19,7 @@ const connectors: Connector[] = [ const findAllConnectors = jest.fn(async () => connectors); jest.mock('#src/queries/connector.js', () => ({ - ...jest.requireActual('@/queries/connector'), + ...jest.requireActual('#src/queries/connector.js'), findAllConnectors: async () => findAllConnectors(), })); diff --git a/packages/core/src/lib/sign-in-experience/sign-up.test.ts b/packages/core/src/lib/sign-in-experience/sign-up.test.ts index 06ef4c503..54bf4745c 100644 --- a/packages/core/src/lib/sign-in-experience/sign-up.test.ts +++ b/packages/core/src/lib/sign-in-experience/sign-up.test.ts @@ -8,7 +8,7 @@ import { validateSignUp } from './sign-up.js'; const enabledConnectors = [mockAliyunDmConnector, mockAliyunSmsConnector]; jest.mock('#src/lib/session.js', () => ({ - ...jest.requireActual('@/lib/session'), + ...jest.requireActual('#src/lib/session.js'), getApplicationIdFromInteraction: jest.fn(), })); diff --git a/packages/core/src/routes/phrase.content-language.test.ts b/packages/core/src/routes/phrase.content-language.test.ts index fd5fa9fc8..39e01b79c 100644 --- a/packages/core/src/routes/phrase.content-language.test.ts +++ b/packages/core/src/routes/phrase.content-language.test.ts @@ -39,7 +39,7 @@ jest.mock('#src/queries/custom-phrase.js', () => ({ })); jest.mock('#src/lib/phrase.js', () => ({ - ...jest.requireActual('@/lib/phrase'), + ...jest.requireActual('#src/lib/phrase.js'), getPhrase: jest.fn().mockResolvedValue(en), })); diff --git a/packages/core/src/routes/phrase.test.ts b/packages/core/src/routes/phrase.test.ts index b741caf54..03a1a21aa 100644 --- a/packages/core/src/routes/phrase.test.ts +++ b/packages/core/src/routes/phrase.test.ts @@ -53,7 +53,7 @@ jest.mock('#src/queries/custom-phrase.js', () => ({ const getPhrase = jest.fn(async (language: string, customLanguages: string[]) => zhCN); jest.mock('#src/lib/phrase.js', () => ({ - ...jest.requireActual('@/lib/phrase'), + ...jest.requireActual('#src/lib/phrase.js'), getPhrase: async (language: string, customLanguages: string[]) => getPhrase(language, customLanguages), })); diff --git a/packages/core/src/routes/session/forgot-password.test.ts b/packages/core/src/routes/session/forgot-password.test.ts index f5f8ecc88..f24680685 100644 --- a/packages/core/src/routes/session/forgot-password.test.ts +++ b/packages/core/src/routes/session/forgot-password.test.ts @@ -24,12 +24,12 @@ const getYesterdayDate = () => subDays(Date.now(), 1); const getTomorrowDate = () => addDays(Date.now(), 1); jest.mock('#src/lib/user.js', () => ({ - ...jest.requireActual('@/lib/user'), + ...jest.requireActual('#src/lib/user.js'), encryptUserPassword: async (password: string) => encryptUserPassword(password), })); jest.mock('#src/queries/user.js', () => ({ - ...jest.requireActual('@/queries/user'), + ...jest.requireActual('#src/queries/user.js'), hasUserWithPhone: async (phone: string) => phone === '13000000000', findUserByPhone: async () => ({ userId: 'id' }), hasUserWithEmail: async (email: string) => email === 'a@a.com', diff --git a/packages/core/src/routes/session/password.test.ts b/packages/core/src/routes/session/password.test.ts index 90302a7c9..d3d6353eb 100644 --- a/packages/core/src/routes/session/password.test.ts +++ b/packages/core/src/routes/session/password.test.ts @@ -52,7 +52,7 @@ jest.mock('#src/lib/user.js', () => ({ })); jest.mock('#src/lib/session.js', () => ({ - ...jest.requireActual('@/lib/session'), + ...jest.requireActual('#src/lib/session.js'), getApplicationIdFromInteraction: jest.fn(), })); diff --git a/packages/core/src/routes/session/passwordless.test.ts b/packages/core/src/routes/session/passwordless.test.ts index 55faa4f01..37175c97f 100644 --- a/packages/core/src/routes/session/passwordless.test.ts +++ b/packages/core/src/routes/session/passwordless.test.ts @@ -35,7 +35,7 @@ jest.mock('#src/lib/user.js', () => ({ })); jest.mock('#src/lib/session.js', () => ({ - ...jest.requireActual('@/lib/session'), + ...jest.requireActual('#src/lib/session.js'), getApplicationIdFromInteraction: jest.fn(), })); diff --git a/packages/core/src/routes/session/profile.test.ts b/packages/core/src/routes/session/profile.test.ts index b57690936..0ae2492cb 100644 --- a/packages/core/src/routes/session/profile.test.ts +++ b/packages/core/src/routes/session/profile.test.ts @@ -42,7 +42,7 @@ jest.mock('oidc-provider', () => ({ })); jest.mock('#src/lib/user.js', () => ({ - ...jest.requireActual('@/lib/user'), + ...jest.requireActual('#src/lib/user.js'), encryptUserPassword: async (password: string) => encryptUserPassword(password), })); @@ -69,7 +69,7 @@ jest.mock('#src/lib/social', () => ({ })); jest.mock('#src/queries/user.js', () => ({ - ...jest.requireActual('@/queries/user'), + ...jest.requireActual('#src/queries/user.js'), findUserById: async () => mockFindUserById(), hasUser: async () => mockHasUser(), hasUserWithEmail: async () => mockHasUserWithEmail(), diff --git a/packages/core/src/routes/session/social.bind-social.test.ts b/packages/core/src/routes/session/social.bind-social.test.ts index c39170d00..6d33e5fcc 100644 --- a/packages/core/src/routes/session/social.bind-social.test.ts +++ b/packages/core/src/routes/session/social.bind-social.test.ts @@ -15,7 +15,7 @@ const findSocialRelatedUser = jest.fn(async () => [ { id: 'user1', identities: {}, isSuspended: false }, ]); jest.mock('#src/lib/social.js', () => ({ - ...jest.requireActual('@/lib/social'), + ...jest.requireActual('#src/lib/social.js'), findSocialRelatedUser: async () => findSocialRelatedUser(), async getUserInfoByAuthCode(connectorId: string, data: { code: string }) { if (connectorId === '_connectorId') { diff --git a/packages/core/src/routes/session/social.test.ts b/packages/core/src/routes/session/social.test.ts index f72ddd3ce..1a357cf83 100644 --- a/packages/core/src/routes/session/social.test.ts +++ b/packages/core/src/routes/session/social.test.ts @@ -15,7 +15,7 @@ const findSocialRelatedUser = jest.fn(async () => [ { id: 'user1', identities: {}, isSuspended: false }, ]); jest.mock('#src/lib/social.js', () => ({ - ...jest.requireActual('@/lib/social'), + ...jest.requireActual('#src/lib/social.js'), findSocialRelatedUser: async () => findSocialRelatedUser(), async getUserInfoByAuthCode(connectorId: string, data: { code: string }) { if (connectorId === '_connectorId') { diff --git a/packages/core/src/routes/sign-in-experience.guard.test.ts b/packages/core/src/routes/sign-in-experience.guard.test.ts index 46f76ea23..b76b8df00 100644 --- a/packages/core/src/routes/sign-in-experience.guard.test.ts +++ b/packages/core/src/routes/sign-in-experience.guard.test.ts @@ -28,7 +28,7 @@ jest.mock('#src/connectors.js', () => ({ const validateLanguageInfo = jest.fn(async (languageInfo: LanguageInfo): Promise => {}); jest.mock('#src/lib/sign-in-experience.js', () => ({ - ...jest.requireActual('@/lib/sign-in-experience'), + ...jest.requireActual('#src/lib/sign-in-experience.js'), validateLanguageInfo: async (languageInfo: LanguageInfo) => validateLanguageInfo(languageInfo), })); diff --git a/packages/core/src/routes/sign-in-experience.test.ts b/packages/core/src/routes/sign-in-experience.test.ts index 2013be3aa..3accf634e 100644 --- a/packages/core/src/routes/sign-in-experience.test.ts +++ b/packages/core/src/routes/sign-in-experience.test.ts @@ -32,7 +32,7 @@ const getLogtoConnectors = jest.fn(async () => logtoConnectors); jest.mock('#src/connectors.js', () => { return { - ...jest.requireActual('@/connectors'), + ...jest.requireActual('#src/connectors.js'), getLogtoConnectors: jest.fn(async () => getLogtoConnectors()), }; }); diff --git a/packages/ui/package.json b/packages/ui/package.json index c1f930d4d..02a93d607 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -2,6 +2,7 @@ "name": "@logto/ui", "version": "1.0.0-beta.14", "license": "MPL-2.0", + "type": "module", "private": true, "scripts": { "precommit": "lint-staged", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f61400bb2..c333830ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ importers: got: ^12.5.3 hpagent: ^1.2.0 inquirer: ^8.2.2 - jest: ^29.1.2 + jest: ^29.3.1 lint-staged: ^13.0.0 nanoid: ^3.3.4 ora: ^5.0.0 @@ -85,7 +85,7 @@ importers: zod: 3.19.1 devDependencies: '@silverhand/eslint-config': 1.3.0_swk2g7ygmfleszo5c33j4vooni - '@silverhand/jest-config': 1.2.2_zapogttls25djihwjkusccjjym + '@silverhand/jest-config': 1.2.2_wkdujqsgbnfnnp5xidismkcn6e '@silverhand/ts-config': 1.2.1_typescript@4.7.4 '@types/fs-extra': 9.0.13 '@types/inquirer': 8.2.1 @@ -95,7 +95,7 @@ importers: '@types/tar': 6.1.2 '@types/yargs': 17.0.13 eslint: 8.21.0 - jest: 29.1.2_k5ytkvaprncdyzidqqws5bqksq + jest: 29.3.1_k5ytkvaprncdyzidqqws5bqksq lint-staged: 13.0.0 prettier: 2.7.1 rimraf: 3.0.2 @@ -290,7 +290,6 @@ importers: etag: ^1.8.1 find-up: ^5.0.0 fs-extra: ^10.1.0 - got: ^11.8.5 hash-wasm: ^4.9.0 http-errors: ^1.6.3 i18next: ^21.8.16 @@ -346,7 +345,6 @@ importers: etag: 1.8.1 find-up: 5.0.0 fs-extra: 10.1.0 - got: 11.8.5 hash-wasm: 4.9.0 i18next: 21.8.16 iconv-lite: 0.6.3 @@ -1247,7 +1245,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.17.12 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.19.3: @@ -1858,6 +1856,18 @@ packages: slash: 3.0.0 dev: true + /@jest/console/29.3.1: + resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + slash: 3.0.0 + dev: true + /@jest/core/29.1.2: resolution: {integrity: sha512-sCO2Va1gikvQU2ynDN8V4+6wB7iVrD2CvT0zaRst4rglf56yLly0NQ9nuRRAWFeimRf+tCdFsb1Vk1N9LrrMPA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1942,6 +1952,48 @@ packages: - ts-node dev: true + /@jest/core/29.3.1_ts-node@10.9.1: + resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.3.1 + '@jest/reporters': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.5.0 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 29.2.0 + jest-config: 29.3.1_hvivgrlmkyd4vgu6rkkmg6acly + jest-haste-map: 29.3.1 + jest-message-util: 29.3.1 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-resolve-dependencies: 29.3.1 + jest-runner: 29.3.1 + jest-runtime: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + jest-watcher: 29.3.1 + micromatch: 4.0.5 + pretty-format: 29.3.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + /@jest/environment/27.5.1: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -1962,6 +2014,16 @@ packages: jest-mock: 29.2.2 dev: true + /@jest/environment/29.3.1: + resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + jest-mock: 29.3.1 + dev: true + /@jest/expect-utils/29.1.2: resolution: {integrity: sha512-4a48bhKfGj/KAH39u0ppzNTABXQ8QPccWAFUFobWBaEMSMp+sB31Z2fK/l47c4a/Mu1po2ffmfAIPxXbVTXdtg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1969,6 +2031,13 @@ packages: jest-get-type: 29.0.0 dev: true + /@jest/expect-utils/29.3.1: + resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.2.0 + dev: true + /@jest/expect/29.1.2: resolution: {integrity: sha512-FXw/UmaZsyfRyvZw3M6POgSNqwmuOXJuzdNiMWW9LCYo0GRoRDhg+R5iq5higmRTHQY7hx32+j7WHwinRmoILQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1979,6 +2048,16 @@ packages: - supports-color dev: true + /@jest/expect/29.3.1: + resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.3.1 + jest-snapshot: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/fake-timers/27.5.1: resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2003,6 +2082,18 @@ packages: jest-util: 29.2.1 dev: true + /@jest/fake-timers/29.3.1: + resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@sinonjs/fake-timers': 9.1.2 + '@types/node': 17.0.23 + jest-message-util: 29.3.1 + jest-mock: 29.3.1 + jest-util: 29.3.1 + dev: true + /@jest/globals/29.1.2: resolution: {integrity: sha512-uMgfERpJYoQmykAd0ffyMq8wignN4SvLUG6orJQRe9WAlTRc9cdpCaE/29qurXixYJVZWUqIBXhSk8v5xN1V9g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2015,6 +2106,18 @@ packages: - supports-color dev: true + /@jest/globals/29.3.1: + resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/expect': 29.3.1 + '@jest/types': 29.3.1 + jest-mock: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/reporters/29.1.2: resolution: {integrity: sha512-X4fiwwyxy9mnfpxL0g9DD0KcTmEIqP0jUdnc2cfa9riHy+I6Gwwp5vOZiwyg0vZxfSDxrOlK9S4+340W4d+DAA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2053,6 +2156,43 @@ packages: - supports-color dev: true + /@jest/reporters/29.3.1: + resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@jridgewell/trace-mapping': 0.3.16 + '@types/node': 17.0.23 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + jest-worker: 29.3.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/schemas/29.0.0: resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2069,6 +2209,15 @@ packages: graceful-fs: 4.2.10 dev: true + /@jest/source-map/29.2.0: + resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.16 + callsites: 3.1.0 + graceful-fs: 4.2.10 + dev: true + /@jest/test-result/29.1.2: resolution: {integrity: sha512-jjYYjjumCJjH9hHCoMhA8PCl1OxNeGgAoZ7yuGYILRJX9NjgzTN0pCT5qAoYR4jfOP8htIByvAlz9vfNSSBoVg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2079,6 +2228,16 @@ packages: collect-v8-coverage: 1.0.1 dev: true + /@jest/test-result/29.3.1: + resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.3.1 + '@jest/types': 29.3.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + /@jest/test-sequencer/29.1.2: resolution: {integrity: sha512-fU6dsUqqm8sA+cd85BmeF7Gu9DsXVWFdGn9taxM6xN1cKdcP/ivSgXh5QucFRFz1oZxKv3/9DYYbq0ULly3P/Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2089,6 +2248,16 @@ packages: slash: 3.0.0 dev: true + /@jest/test-sequencer/29.3.1: + resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.3.1 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + slash: 3.0.0 + dev: true + /@jest/transform/29.1.2: resolution: {integrity: sha512-2uaUuVHTitmkx1tHF+eBjb4p7UuzBG7SXIaA/hNIkaMP6K+gXYGxP38ZcrofzqN0HeZ7A90oqsOa97WU7WZkSw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2112,6 +2281,29 @@ packages: - supports-color dev: true + /@jest/transform/29.3.1: + resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.19.3 + '@jest/types': 29.3.1 + '@jridgewell/trace-mapping': 0.3.16 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-regex-util: 29.2.0 + jest-util: 29.3.1 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/types/27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2147,6 +2339,18 @@ packages: chalk: 4.1.2 dev: true + /@jest/types/29.3.1: + resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 17.0.23 + '@types/yargs': 17.0.13 + chalk: 4.1.2 + dev: true + /@jridgewell/gen-mapping/0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} @@ -2161,7 +2365,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.15 + '@jridgewell/trace-mapping': 0.3.16 dev: true /@jridgewell/resolve-uri/3.1.0: @@ -3475,6 +3679,26 @@ packages: lodash.orderby: 4.6.0 lodash.pick: 4.4.0 + /@silverhand/jest-config/1.2.2_wkdujqsgbnfnnp5xidismkcn6e: + resolution: {integrity: sha512-sCOIHN3kIG9nyySkDao8nz6HK8VhGoUV4WG1CCriDDeGTqbHs4IprzTp1p+ChFdC8JGBCElQC0cIFrWYTFnTAQ==} + engines: {node: ^16.0.0 || ^18.0.0} + peerDependencies: + jest: ^29.0.0 || ^29.1.2 + dependencies: + '@jest/types': 29.1.2 + deepmerge: 4.2.2 + identity-obj-proxy: 3.0.0 + jest: 29.3.1_k5ytkvaprncdyzidqqws5bqksq + jest-matcher-specific-error: 1.0.0 + jest-transform-stub: 2.0.0 + ts-jest: 29.0.3_o3wtcjdhyxuv43bggxcaucanwu + transitivePeerDependencies: + - '@babel/core' + - babel-jest + - esbuild + - typescript + dev: true + /@silverhand/jest-config/1.2.2_zapogttls25djihwjkusccjjym: resolution: {integrity: sha512-sCOIHN3kIG9nyySkDao8nz6HK8VhGoUV4WG1CCriDDeGTqbHs4IprzTp1p+ChFdC8JGBCElQC0cIFrWYTFnTAQ==} engines: {node: ^16.0.0 || ^18.0.0} @@ -3484,7 +3708,7 @@ packages: '@jest/types': 29.1.2 deepmerge: 4.2.2 identity-obj-proxy: 3.0.0 - jest: 29.1.2_k5ytkvaprncdyzidqqws5bqksq + jest: 29.1.2_@types+node@16.11.12 jest-matcher-specific-error: 1.0.0 jest-transform-stub: 2.0.0 ts-jest: 29.0.3_37jxomqt5oevoqzq6g3r6n3ili @@ -4719,6 +4943,24 @@ packages: - supports-color dev: true + /babel-jest/29.3.1_@babel+core@7.19.3: + resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.19.3 + '@jest/transform': 29.3.1 + '@types/babel__core': 7.1.19 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.2.0_@babel+core@7.19.3 + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-apply-mdx-type-prop/1.6.22_@babel+core@7.12.9: resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} peerDependencies: @@ -4758,6 +5000,16 @@ packages: '@types/babel__traverse': 7.18.2 dev: true + /babel-plugin-jest-hoist/29.2.0: + resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.19.4 + '@types/babel__core': 7.1.19 + '@types/babel__traverse': 7.18.2 + dev: true + /babel-plugin-macros/2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: @@ -4797,6 +5049,17 @@ packages: babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.3 dev: true + /babel-preset-jest/29.2.0_@babel+core@7.19.3: + resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.19.3 + babel-plugin-jest-hoist: 29.2.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.3 + dev: true + /bail/1.0.5: resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} dev: true @@ -5409,6 +5672,10 @@ packages: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true + /convert-source-map/2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + /cookiejar/2.1.3: resolution: {integrity: sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==} dev: true @@ -5926,6 +6193,11 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /diff-sequences/29.3.1: + resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -6063,6 +6335,11 @@ packages: engines: {node: '>=12'} dev: true + /emittery/0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + /emoji-regex/7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} dev: false @@ -6759,6 +7036,17 @@ packages: jest-util: 29.2.1 dev: true + /expect/29.3.1: + resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.3.1 + jest-get-type: 29.2.0 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + dev: true + /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: true @@ -8334,6 +8622,14 @@ packages: p-limit: 3.1.0 dev: true + /jest-changed-files/29.2.0: + resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + /jest-circus/29.1.2: resolution: {integrity: sha512-ajQOdxY6mT9GtnfJRZBRYS7toNIJayiiyjDyoZcnvPRUPwJ58JX0ci0PKAKUo2C1RyzlHw0jabjLGKksO42JGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8361,6 +8657,33 @@ packages: - supports-color dev: true + /jest-circus/29.3.1: + resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/expect': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.3.1 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-runtime: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + p-limit: 3.1.0 + pretty-format: 29.3.1 + slash: 3.0.0 + stack-utils: 2.0.5 + transitivePeerDependencies: + - supports-color + dev: true + /jest-cli/29.1.2: resolution: {integrity: sha512-vsvBfQ7oS2o4MJdAH+4u9z76Vw5Q8WBQF5MchDbkylNknZdrPTX1Ix7YRJyTlOWqRaS7ue/cEAn+E4V1MWyMzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8445,6 +8768,34 @@ packages: - ts-node dev: true + /jest-cli/29.3.1_k5ytkvaprncdyzidqqws5bqksq: + resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.3.1_ts-node@10.9.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 29.3.1_k5ytkvaprncdyzidqqws5bqksq + jest-util: 29.3.1 + jest-validate: 29.3.1 + prompts: 2.4.2 + yargs: 17.6.0 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest-config/29.1.2: resolution: {integrity: sha512-EC3Zi86HJUOz+2YWQcJYQXlf0zuBhJoeyxLM6vb6qJsVmpP7KcCP1JnyF0iaqTaXdBP8Rlwsvs7hnKWQWWLwwA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8641,6 +8992,86 @@ packages: - supports-color dev: true + /jest-config/29.3.1_hvivgrlmkyd4vgu6rkkmg6acly: + resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.19.3 + '@jest/test-sequencer': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + babel-jest: 29.3.1_@babel+core@7.19.3 + chalk: 4.1.2 + ci-info: 3.5.0 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 29.3.1 + jest-environment-node: 29.3.1 + jest-get-type: 29.2.0 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-runner: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.3.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1_ccwudyfw5se7hgalwgkzhn2yp4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-config/29.3.1_k5ytkvaprncdyzidqqws5bqksq: + resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.19.3 + '@jest/test-sequencer': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 16.11.12 + babel-jest: 29.3.1_@babel+core@7.19.3 + chalk: 4.1.2 + ci-info: 3.5.0 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 29.3.1 + jest-environment-node: 29.3.1 + jest-get-type: 29.2.0 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-runner: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.3.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1_ccwudyfw5se7hgalwgkzhn2yp4 + transitivePeerDependencies: + - supports-color + dev: true + /jest-dev-server/6.1.1: resolution: {integrity: sha512-z5LnaGDvlIkdMv/rppSO4+rq+GyQKf1xI9oiBxf9/2EBeN2hxRaWiMvaLNDnHPZj2PAhBXsycrKslDDoZO2Xtw==} dependencies: @@ -8666,6 +9097,16 @@ packages: pretty-format: 29.1.2 dev: true + /jest-diff/29.3.1: + resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + /jest-docblock/29.0.0: resolution: {integrity: sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8673,6 +9114,13 @@ packages: detect-newline: 3.1.0 dev: true + /jest-docblock/29.2.0: + resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + /jest-each/29.1.2: resolution: {integrity: sha512-AmTQp9b2etNeEwMyr4jc0Ql/LIX/dhbgP21gHAizya2X6rUspHn2gysMXaj6iwWuOJ2sYRgP8c1P4cXswgvS1A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8684,6 +9132,17 @@ packages: pretty-format: 29.2.1 dev: true + /jest-each/29.3.1: + resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + chalk: 4.1.2 + jest-get-type: 29.2.0 + jest-util: 29.3.1 + pretty-format: 29.3.1 + dev: true + /jest-environment-jsdom/29.2.2: resolution: {integrity: sha512-5mNtTcky1+RYv9kxkwMwt7fkzyX4EJUarV7iI+NQLigpV4Hz4sgfOdP4kOpCHXbkRWErV7tgXoXLm2CKtucr+A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8731,6 +9190,18 @@ packages: jest-util: 29.2.1 dev: true + /jest-environment-node/29.3.1: + resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/fake-timers': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + jest-mock: 29.3.1 + jest-util: 29.3.1 + dev: true + /jest-environment-puppeteer/6.1.1: resolution: {integrity: sha512-Ces37g8Gdj7QaVxszeoXlvmsZxcEJN9EPUdJt8fGMLA+6ARVFKyVmFgP9xVeGyjTvzsXdtIiJdeOKMLMeD8r2A==} dependencies: @@ -8749,6 +9220,11 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-get-type/29.2.0: + resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /jest-haste-map/29.1.2: resolution: {integrity: sha512-xSjbY8/BF11Jh3hGSPfYTa/qBFrm3TPM7WU8pU93m2gqzORVLkHFWvuZmFsTEBPRKndfewXhMOuzJNHyJIZGsw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8768,6 +9244,25 @@ packages: fsevents: 2.3.2 dev: true + /jest-haste-map/29.3.1: + resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/graceful-fs': 4.1.5 + '@types/node': 17.0.23 + anymatch: 3.1.2 + fb-watchman: 2.0.2 + graceful-fs: 4.2.10 + jest-regex-util: 29.2.0 + jest-util: 29.3.1 + jest-worker: 29.3.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /jest-leak-detector/29.1.2: resolution: {integrity: sha512-TG5gAZJpgmZtjb6oWxBLf2N6CfQ73iwCe6cofu/Uqv9iiAm6g502CAnGtxQaTfpHECBdVEMRBhomSXeLnoKjiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8776,6 +9271,14 @@ packages: pretty-format: 29.2.1 dev: true + /jest-leak-detector/29.3.1: + resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + /jest-matcher-specific-error/1.0.0: resolution: {integrity: sha512-thJdy9ibhDo8k+0arFalNCQBJ0u7eqTfpTzS2MzL3iCLmbRCkI+yhhKSiAxEi55e5ZUyf01ySa0fMqzF+sblAw==} dev: true @@ -8790,6 +9293,16 @@ packages: pretty-format: 29.1.2 dev: true + /jest-matcher-utils/29.3.1: + resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + /jest-message-util/27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -8835,6 +9348,21 @@ packages: stack-utils: 2.0.5 dev: true + /jest-message-util/29.3.1: + resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 29.3.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 29.3.1 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: true + /jest-mock/27.5.1: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -8852,6 +9380,15 @@ packages: jest-util: 29.2.1 dev: true + /jest-mock/29.3.1: + resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + jest-util: 29.3.1 + dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@29.1.2: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} @@ -8864,6 +9401,18 @@ packages: jest-resolve: 29.1.2 dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@29.3.1: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.3.1 + dev: true + /jest-puppeteer/6.1.1_puppeteer@19.2.2: resolution: {integrity: sha512-cBOszleUpyipDMNYmcmH3x+687x03ZvOVz7W8X5y5TgD+j4MK+BcumwGdE1YwVS21kPLjJUu1pIdEzEDuFEBfA==} peerDependencies: @@ -8882,6 +9431,11 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-regex-util/29.2.0: + resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /jest-resolve-dependencies/29.1.2: resolution: {integrity: sha512-44yYi+yHqNmH3OoWZvPgmeeiwKxhKV/0CfrzaKLSkZG9gT973PX8i+m8j6pDrTYhhHoiKfF3YUFg/6AeuHw4HQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8892,6 +9446,16 @@ packages: - supports-color dev: true + /jest-resolve-dependencies/29.3.1: + resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.2.0 + jest-snapshot: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-resolve/29.1.2: resolution: {integrity: sha512-7fcOr+k7UYSVRJYhSmJHIid3AnDBcLQX3VmT9OSbPWsWz1MfT7bcoerMhADKGvKCoMpOHUQaDHtQoNp/P9JMGg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8907,6 +9471,21 @@ packages: slash: 3.0.0 dev: true + /jest-resolve/29.3.1: + resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-pnp-resolver: 1.2.2_jest-resolve@29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + resolve: 1.22.1 + resolve.exports: 1.1.0 + slash: 3.0.0 + dev: true + /jest-runner/29.1.2: resolution: {integrity: sha512-yy3LEWw8KuBCmg7sCGDIqKwJlULBuNIQa2eFSVgVASWdXbMYZ9H/X0tnXt70XFoGf92W2sOQDOIFAA6f2BG04Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8936,6 +9515,35 @@ packages: - supports-color dev: true + /jest-runner/29.3.1: + resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.3.1 + '@jest/environment': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.10 + jest-docblock: 29.2.0 + jest-environment-node: 29.3.1 + jest-haste-map: 29.3.1 + jest-leak-detector: 29.3.1 + jest-message-util: 29.3.1 + jest-resolve: 29.3.1 + jest-runtime: 29.3.1 + jest-util: 29.3.1 + jest-watcher: 29.3.1 + jest-worker: 29.3.1 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + /jest-runtime/29.1.2: resolution: {integrity: sha512-jr8VJLIf+cYc+8hbrpt412n5jX3tiXmpPSYTGnwcvNemY+EOuLNiYnHJ3Kp25rkaAcTWOEI4ZdOIQcwYcXIAZw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8966,6 +9574,36 @@ packages: - supports-color dev: true + /jest-runtime/29.3.1: + resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/fake-timers': 29.3.1 + '@jest/globals': 29.3.1 + '@jest/source-map': 29.2.0 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-message-util: 29.3.1 + jest-mock: 29.3.1 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /jest-snapshot/29.1.2: resolution: {integrity: sha512-rYFomGpVMdBlfwTYxkUp3sjD6usptvZcONFYNqVlaz4EpHPnDvlWjvmOQ9OCSNKqYZqLM2aS3wq01tWujLg7gg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8998,6 +9636,38 @@ packages: - supports-color dev: true + /jest-snapshot/29.3.1: + resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.19.3 + '@babel/generator': 7.19.5 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.3 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.19.3 + '@babel/traverse': 7.19.4 + '@babel/types': 7.19.4 + '@jest/expect-utils': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/babel__traverse': 7.18.2 + '@types/prettier': 2.7.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.19.3 + chalk: 4.1.2 + expect: 29.3.1 + graceful-fs: 4.2.10 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + jest-haste-map: 29.3.1 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + natural-compare: 1.4.0 + pretty-format: 29.3.1 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + /jest-transform-stub/2.0.0: resolution: {integrity: sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==} dev: true @@ -9036,6 +9706,18 @@ packages: picomatch: 2.3.1 dev: true + /jest-util/29.3.1: + resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + chalk: 4.1.2 + ci-info: 3.5.0 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + /jest-validate/29.1.2: resolution: {integrity: sha512-k71pOslNlV8fVyI+mEySy2pq9KdXdgZtm7NHrBX8LghJayc3wWZH0Yr0mtYNGaCU4F1OLPXRkwZR0dBm/ClshA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9048,6 +9730,18 @@ packages: pretty-format: 29.2.1 dev: true + /jest-validate/29.3.1: + resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.2.0 + leven: 3.1.0 + pretty-format: 29.3.1 + dev: true + /jest-watcher/29.1.2: resolution: {integrity: sha512-6JUIUKVdAvcxC6bM8/dMgqY2N4lbT+jZVsxh0hCJRbwkIEnbr/aPjMQ28fNDI5lB51Klh00MWZZeVf27KBUj5w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9062,6 +9756,20 @@ packages: string-length: 4.0.2 dev: true + /jest-watcher/29.3.1: + resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 17.0.23 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.3.1 + string-length: 4.0.2 + dev: true + /jest-worker/29.1.2: resolution: {integrity: sha512-AdTZJxKjTSPHbXT/AIOjQVmoFx0LHFcVabWu0sxI7PAy7rFf8c0upyvgBKgguVXdM4vY74JdwkyD4hSmpTW8jA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9072,6 +9780,16 @@ packages: supports-color: 8.1.1 dev: true + /jest-worker/29.3.1: + resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 17.0.23 + jest-util: 29.3.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + /jest/29.1.2: resolution: {integrity: sha512-5wEIPpCezgORnqf+rCaYD1SK+mNN7NsstWzIsuvsnrhR/hSxXWd82oI7DkrbJ+XTD28/eG8SmxdGvukrGGK6Tw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9132,6 +9850,26 @@ packages: - ts-node dev: true + /jest/29.3.1_k5ytkvaprncdyzidqqws5bqksq: + resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.3.1_ts-node@10.9.1 + '@jest/types': 29.3.1 + import-local: 3.1.0 + jest-cli: 29.3.1_k5ytkvaprncdyzidqqws5bqksq + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /joi/17.6.0: resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==} dependencies: @@ -11541,6 +12279,15 @@ packages: react-is: 18.2.0 dev: true + /pretty-format/29.3.1: + resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /pretty-ms/6.0.1: resolution: {integrity: sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw==} engines: {node: '>=10'} @@ -13583,7 +14330,41 @@ packages: '@jest/types': 29.1.2 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.1.2_k5ytkvaprncdyzidqqws5bqksq + jest: 29.1.2_@types+node@16.11.12 + jest-util: 29.2.1 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.8 + typescript: 4.7.4 + yargs-parser: 21.1.1 + dev: true + + /ts-jest/29.0.3_o3wtcjdhyxuv43bggxcaucanwu: + resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 || ^29.1.2 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@jest/types': 29.1.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.3.1_k5ytkvaprncdyzidqqws5bqksq jest-util: 29.2.1 json5: 2.2.1 lodash.memoize: 4.1.2