diff --git a/.github/workflows/core-main.yml b/.github/workflows/core-main.yml index 88b5f8f84..eee668052 100644 --- a/.github/workflows/core-main.yml +++ b/.github/workflows/core-main.yml @@ -37,6 +37,10 @@ jobs: working-directory: packages/core run: pnpm lint + - name: Test + working-directory: packages/core + run: pnpm test + - name: Build working-directory: packages/core run: pnpm build diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js new file mode 100644 index 000000000..adc71677f --- /dev/null +++ b/packages/core/jest.config.js @@ -0,0 +1,10 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.test.json', + }, + }, +}; diff --git a/packages/core/package.json b/packages/core/package.json index 02ca46d4e..58c22ec2f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -12,7 +12,8 @@ "build": "rm -rf build/ && tsc", "lint": "eslint --format pretty --ext .ts src", "dev": "rm -rf build/ && tsc-watch --preserveWatchOutput --onSuccess \"node ./build/index.js\"", - "start": "NODE_ENV=production node build/index.js" + "start": "NODE_ENV=production node build/index.js", + "test": "jest" }, "dependencies": { "@logto/essentials": "^1.1.0-rc.2", @@ -41,8 +42,9 @@ "zod": "^3.2.0" }, "devDependencies": { - "@logto/eslint-config": "^0.1.0-rc.14", - "@logto/ts-config": "^0.1.0-rc.14", + "@logto/eslint-config": "^0.1.0-rc.17", + "@logto/ts-config": "^0.1.0-rc.17", + "@types/jest": "^27.0.1", "@types/koa": "^2.13.3", "@types/koa-logger": "^3.1.1", "@types/koa-mount": "^4.0.0", @@ -53,9 +55,11 @@ "@types/oidc-provider": "^7.4.1", "eslint": "^7.30.0", "eslint-formatter-pretty": "^4.1.0", + "jest": "^27.0.6", "lint-staged": "^11.1.1", "openapi-types": "^9.1.0", "prettier": "^2.3.2", + "ts-jest": "^27.0.5", "tsc-watch": "^4.4.0", "typescript": "^4.3.5" }, diff --git a/packages/core/src/utils/env.test.ts b/packages/core/src/utils/env.test.ts new file mode 100644 index 000000000..03487703d --- /dev/null +++ b/packages/core/src/utils/env.test.ts @@ -0,0 +1,32 @@ +import { AssertionError } from 'assert'; +import { assertEnv, getEnv } from './env'; + +describe('getEnv()', () => { + beforeAll(() => { + process.env = { FOO: 'bar' }; + }); + + it('returns correct env value', () => { + expect(getEnv('FOO')).toEqual('bar'); + }); + + it("returns fallback if env doesn't exist", () => { + expect(getEnv('BAR', '123')).toEqual('123'); + }); +}); + +describe('assertEnv()', () => { + beforeAll(() => { + process.env = { FOO: 'bar' }; + }); + + it('returns correct env value', () => { + expect(assertEnv('FOO')).toEqual('bar'); + }); + + it("throws an error if env doesn't exist", () => { + expect(() => assertEnv('BAR')).toThrow( + new AssertionError({ message: 'env variable BAR not found' }) + ); + }); +}); diff --git a/packages/core/tsconfig.base.json b/packages/core/tsconfig.base.json new file mode 100644 index 000000000..8a0bfafd6 --- /dev/null +++ b/packages/core/tsconfig.base.json @@ -0,0 +1,12 @@ +{ + "extends": "@logto/ts-config/tsconfig.base", + "compilerOptions": { + "outDir": "build", + "baseUrl": ".", + "paths": { + "@/*": [ + "src/*" + ] + } + } +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 34b9cee54..a34d12e20 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,15 +1,9 @@ { - "extends": "@logto/ts-config/tsconfig.base", - "compilerOptions": { - "outDir": "build", - "baseUrl": ".", - "paths": { - "@/*": [ - "src/*" - ] - } - }, + "extends": "./tsconfig.base", "include": [ "src" + ], + "exclude": [ + "src/**/*.test.ts" ] } diff --git a/packages/core/tsconfig.test.json b/packages/core/tsconfig.test.json new file mode 100644 index 000000000..eeb84b623 --- /dev/null +++ b/packages/core/tsconfig.test.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base", + "compilerOptions": { + "isolatedModules": false + }, + "include": [ + "src/**/*.test.ts" + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 154ef1d5c..2ff683da2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,11 +18,12 @@ importers: packages/core: specifiers: - '@logto/eslint-config': ^0.1.0-rc.14 + '@logto/eslint-config': ^0.1.0-rc.17 '@logto/essentials': ^1.1.0-rc.2 '@logto/phrases': ^0.1.0 '@logto/schemas': ^0.1.0 - '@logto/ts-config': ^0.1.0-rc.14 + '@logto/ts-config': ^0.1.0-rc.17 + '@types/jest': ^27.0.1 '@types/koa': ^2.13.3 '@types/koa-logger': ^3.1.1 '@types/koa-mount': ^4.0.0 @@ -39,6 +40,7 @@ importers: formidable: ^1.2.2 got: ^11.8.2 i18next: ^20.3.5 + jest: ^27.0.6 jose: ^3.14.3 koa: ^2.13.1 koa-body: ^4.2.0 @@ -56,6 +58,7 @@ importers: prettier: ^2.3.2 slonik: ^23.8.3 slonik-interceptor-preset: ^1.2.10 + ts-jest: ^27.0.5 tsc-watch: ^4.4.0 typescript: ^4.3.5 zod: ^3.2.0 @@ -85,8 +88,9 @@ importers: slonik-interceptor-preset: 1.2.10 zod: 3.5.1 devDependencies: - '@logto/eslint-config': 0.1.0-rc.14_aa6010e91de57dec3f7388187c7addf8 - '@logto/ts-config': 0.1.0-rc.14_f847e35c67ce67b1737c27c823675243 + '@logto/eslint-config': 0.1.0-rc.17_aa6010e91de57dec3f7388187c7addf8 + '@logto/ts-config': 0.1.0-rc.17_8c4a247d0b588b2b71b71a86d42a9731 + '@types/jest': 27.0.1 '@types/koa': 2.13.4 '@types/koa-logger': 3.1.1 '@types/koa-mount': 4.0.0 @@ -97,9 +101,11 @@ importers: '@types/oidc-provider': 7.4.2 eslint: 7.31.0 eslint-formatter-pretty: 4.1.0 + jest: 27.0.6 lint-staged: 11.1.1 openapi-types: 9.1.0 prettier: 2.3.2 + ts-jest: 27.0.5_92306e36c1a4cf876b1cd4839a977b9c tsc-watch: 4.4.0_typescript@4.3.5 typescript: 4.3.5 @@ -1728,6 +1734,18 @@ packages: slash: 3.0.0 dev: true + /@jest/console/27.0.6: + resolution: {integrity: sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + chalk: 4.1.2 + jest-message-util: 27.0.6 + jest-util: 27.0.6 + slash: 3.0.0 + dev: true + /@jest/core/26.6.3: resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} engines: {node: '>= 10.14.2'} @@ -1768,6 +1786,52 @@ packages: - utf-8-validate dev: true + /@jest/core/27.0.6: + resolution: {integrity: sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.0.6 + '@jest/reporters': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.6 + jest-changed-files: 27.0.6 + jest-config: 27.0.6 + jest-haste-map: 27.0.6 + jest-message-util: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-resolve-dependencies: 27.0.6 + jest-runner: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 + jest-watcher: 27.0.6 + micromatch: 4.0.4 + p-each-series: 2.2.0 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /@jest/environment/26.6.2: resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} engines: {node: '>= 10.14.2'} @@ -1778,6 +1842,16 @@ packages: jest-mock: 26.6.2 dev: true + /@jest/environment/27.0.6: + resolution: {integrity: sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + jest-mock: 27.0.6 + dev: true + /@jest/fake-timers/26.6.2: resolution: {integrity: sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==} engines: {node: '>= 10.14.2'} @@ -1790,6 +1864,18 @@ packages: jest-util: 26.6.2 dev: true + /@jest/fake-timers/27.0.6: + resolution: {integrity: sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + '@sinonjs/fake-timers': 7.1.2 + '@types/node': 16.4.7 + jest-message-util: 27.0.6 + jest-mock: 27.0.6 + jest-util: 27.0.6 + dev: true + /@jest/globals/26.6.2: resolution: {integrity: sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==} engines: {node: '>= 10.14.2'} @@ -1799,6 +1885,15 @@ packages: expect: 26.6.2 dev: true + /@jest/globals/27.0.6: + resolution: {integrity: sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.0.6 + '@jest/types': 27.0.6 + expect: 27.0.6 + dev: true + /@jest/reporters/26.6.2: resolution: {integrity: sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==} engines: {node: '>= 10.14.2'} @@ -1833,6 +1928,43 @@ packages: - supports-color dev: true + /@jest/reporters/27.0.6: + resolution: {integrity: sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.1.7 + graceful-fs: 4.2.6 + istanbul-lib-coverage: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.0 + istanbul-reports: 3.0.2 + jest-haste-map: 27.0.6 + jest-resolve: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/source-map/26.6.2: resolution: {integrity: sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==} engines: {node: '>= 10.14.2'} @@ -1842,6 +1974,15 @@ packages: source-map: 0.6.1 dev: true + /@jest/source-map/27.0.6: + resolution: {integrity: sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.6 + source-map: 0.6.1 + dev: true + /@jest/test-result/26.6.2: resolution: {integrity: sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==} engines: {node: '>= 10.14.2'} @@ -1852,6 +1993,16 @@ packages: collect-v8-coverage: 1.0.1 dev: true + /@jest/test-result/27.0.6: + resolution: {integrity: sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.0.6 + '@jest/types': 27.0.6 + '@types/istanbul-lib-coverage': 2.0.3 + collect-v8-coverage: 1.0.1 + dev: true + /@jest/test-sequencer/26.6.3: resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} engines: {node: '>= 10.14.2'} @@ -1869,6 +2020,18 @@ packages: - utf-8-validate dev: true + /@jest/test-sequencer/27.0.6: + resolution: {integrity: sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.0.6 + graceful-fs: 4.2.6 + jest-haste-map: 27.0.6 + jest-runtime: 27.0.6 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/transform/26.6.2: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} engines: {node: '>= 10.14.2'} @@ -1892,15 +2055,38 @@ packages: - supports-color dev: true + /@jest/transform/27.0.6: + resolution: {integrity: sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.14.8 + '@jest/types': 27.0.6 + babel-plugin-istanbul: 6.0.0 + chalk: 4.1.2 + convert-source-map: 1.8.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.6 + jest-haste-map: 27.0.6 + jest-regex-util: 27.0.6 + jest-util: 27.0.6 + micromatch: 4.0.4 + pirates: 4.0.1 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/types/26.6.2: resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} engines: {node: '>= 10.14.2'} dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 16.4.6 + '@types/node': 16.4.7 '@types/yargs': 15.0.14 - chalk: 4.1.1 + chalk: 4.1.2 dev: true /@jest/types/27.0.6: @@ -1911,7 +2097,7 @@ packages: '@types/istanbul-reports': 3.0.1 '@types/node': 16.4.7 '@types/yargs': 16.0.4 - chalk: 4.1.1 + chalk: 4.1.2 dev: true /@koa/cors/3.1.0: @@ -2647,6 +2833,35 @@ packages: - supports-color dev: true + /@logto/eslint-config/0.1.0-rc.17_aa6010e91de57dec3f7388187c7addf8: + resolution: {integrity: sha512-6s5ZnEby/sKlQFgKkyF1yvm2z+RVOGjK/pKNEJUgmDwJqY1HeYC18J3NDKaXWEQMhPdEfRzFZIsQY71tO9WsVQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + eslint: ^7.30.0 + eslint-formatter-pretty: ^4.1.0 + prettier: ^2.3.2 + typescript: ^4.3.5 + dependencies: + '@typescript-eslint/eslint-plugin': 4.28.5_514553717ff968e20f6d1c6e521f8616 + '@typescript-eslint/parser': 4.28.5_eslint@7.31.0+typescript@4.3.5 + eslint: 7.31.0 + eslint-config-prettier: 8.3.0_eslint@7.31.0 + eslint-config-xo: 0.37.0_eslint@7.31.0 + eslint-config-xo-typescript: 0.43.0_6fd5a9364a943d2d4e6f2a7372de0670 + eslint-formatter-pretty: 4.1.0 + eslint-plugin-eslint-comments: 3.2.0_eslint@7.31.0 + eslint-plugin-import: 2.23.4_eslint@7.31.0 + eslint-plugin-no-use-extend-native: 0.5.0 + eslint-plugin-node: 11.1.0_eslint@7.31.0 + eslint-plugin-prettier: 3.4.0_19f511d6aa08b367b6cb59e8f50291ca + eslint-plugin-promise: 5.1.0_eslint@7.31.0 + eslint-plugin-unicorn: 34.0.1_eslint@7.31.0 + prettier: 2.3.2 + typescript: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: true + /@logto/essentials/1.1.0-rc.2: resolution: {integrity: sha512-MqmA566CFSg0HsvJwoR+mggHVoJ6WlpNLCYBLI93KImzAgk4ecnt41wTPw2/mqAkCLSJlecyXwTOzSaUj3ykZA==} engines: {node: '>=14.15.0', pnpm: '>=6'} @@ -2678,6 +2893,17 @@ packages: typescript: 4.3.5 dev: true + /@logto/ts-config/0.1.0-rc.17_8c4a247d0b588b2b71b71a86d42a9731: + resolution: {integrity: sha512-aiefHdl0+sXPmOAJzJEg2UscGbxF/9DBSZ7blJMQkaBPT/UznJzP1Otm4K1OsNHb1ASe8MMiA8MObnoNgN5iZQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + '@logto/eslint-config': ^0.1.0-rc.17 + typescript: ^4.3.5 + dependencies: + '@logto/eslint-config': 0.1.0-rc.17_aa6010e91de57dec3f7388187c7addf8 + typescript: 4.3.5 + dev: true + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2911,6 +3137,12 @@ packages: '@sinonjs/commons': 1.8.3 dev: true + /@sinonjs/fake-timers/7.1.2: + resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} + dependencies: + '@sinonjs/commons': 1.8.3 + dev: true + /@stylelint/postcss-css-in-js/0.37.2_2b33a41d320e3e2012e5b3b0fadc703b: resolution: {integrity: sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==} peerDependencies: @@ -3157,6 +3389,13 @@ packages: pretty-format: 26.6.2 dev: true + /@types/jest/27.0.1: + resolution: {integrity: sha512-HTLpVXHrY69556ozYkcq47TtQJXpcWAWfkoqz+ZGz2JnmZhzlRjprCIyFnetSy8gpDWwTTGBcRVv1J1I1vBrHw==} + dependencies: + jest-diff: 27.0.6 + pretty-format: 27.0.6 + dev: true + /@types/json-schema/7.0.8: resolution: {integrity: sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==} dev: true @@ -4130,6 +4369,25 @@ packages: - supports-color dev: true + /babel-jest/27.0.6_@babel+core@7.14.8: + resolution: {integrity: sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.14.8 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/babel__core': 7.1.15 + babel-plugin-istanbul: 6.0.0 + babel-preset-jest: 27.0.6_@babel+core@7.14.8 + chalk: 4.1.2 + graceful-fs: 4.2.6 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-loader/8.2.2_10b6a9815ffc7b4b1f51ac243f183029: resolution: {integrity: sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==} engines: {node: '>= 8.9'} @@ -4174,6 +4432,16 @@ packages: '@types/babel__traverse': 7.14.2 dev: true + /babel-plugin-jest-hoist/27.0.6: + resolution: {integrity: sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.14.5 + '@babel/types': 7.14.8 + '@types/babel__core': 7.1.15 + '@types/babel__traverse': 7.14.2 + dev: true + /babel-plugin-macros/2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: @@ -4265,6 +4533,17 @@ packages: babel-preset-current-node-syntax: 1.0.1_@babel+core@7.14.8 dev: true + /babel-preset-jest/27.0.6_@babel+core@7.14.8: + resolution: {integrity: sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.14.8 + babel-plugin-jest-hoist: 27.0.6 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.14.8 + dev: true + /babel-preset-razzle/4.0.5: resolution: {integrity: sha512-vgG9SUUKjVpqqkUseWsL37TN2TmTP4x/giGp6QIq3Kjpl5rSBQVUNZh8B/+pN5efSS6EiY20N+qILD5faG3lfw==} dependencies: @@ -4520,6 +4799,13 @@ packages: node-releases: 1.1.73 dev: true + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + /bser/2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: @@ -4904,6 +5190,10 @@ packages: resolution: {integrity: sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==} dev: true + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + /class-utils/0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -6033,6 +6323,11 @@ packages: engines: {node: '>= 10.14.2'} dev: true + /diff-sequences/27.0.6: + resolution: {integrity: sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -6244,6 +6539,11 @@ packages: engines: {node: '>=10'} dev: true + /emittery/0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: true + /emoji-regex/7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} @@ -6927,6 +7227,18 @@ packages: jest-regex-util: 26.0.0 dev: true + /expect/27.0.6: + resolution: {integrity: sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + ansi-styles: 5.2.0 + jest-get-type: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-regex-util: 27.0.6 + dev: true + /express/4.17.1: resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==} engines: {node: '>= 0.10.0'} @@ -8473,6 +8785,13 @@ packages: ci-info: 2.0.0 dev: true + /is-ci/3.0.0: + resolution: {integrity: sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==} + hasBin: true + dependencies: + ci-info: 3.2.0 + dev: true + /is-circular/1.0.2: resolution: {integrity: sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA==} dev: false @@ -8896,6 +9215,42 @@ packages: throat: 5.0.0 dev: true + /jest-changed-files/27.0.6: + resolution: {integrity: sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + execa: 5.1.1 + throat: 6.0.1 + dev: true + + /jest-circus/27.0.6: + resolution: {integrity: sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.0.6 + is-generator-fn: 2.1.0 + jest-each: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 + slash: 3.0.0 + stack-utils: 2.0.3 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-cli/26.6.3: resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} engines: {node: '>= 10.14.2'} @@ -8922,6 +9277,36 @@ packages: - utf-8-validate dev: true + /jest-cli/27.0.6: + resolution: {integrity: sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.6 + import-local: 3.0.2 + jest-config: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 + prompts: 2.4.1 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jest-config/26.6.3: resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} engines: {node: '>= 10.14.2'} @@ -8956,16 +9341,63 @@ packages: - utf-8-validate dev: true + /jest-config/27.0.6: + resolution: {integrity: sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.14.8 + '@jest/test-sequencer': 27.0.6 + '@jest/types': 27.0.6 + babel-jest: 27.0.6_@babel+core@7.14.8 + chalk: 4.1.2 + deepmerge: 4.2.2 + glob: 7.1.7 + graceful-fs: 4.2.6 + is-ci: 3.0.0 + jest-circus: 27.0.6 + jest-environment-jsdom: 27.0.6 + jest-environment-node: 27.0.6 + jest-get-type: 27.0.6 + jest-jasmine2: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-runner: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 + micromatch: 4.0.4 + pretty-format: 27.0.6 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /jest-diff/26.6.2: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} engines: {node: '>= 10.14.2'} dependencies: - chalk: 4.1.1 + chalk: 4.1.2 diff-sequences: 26.6.2 jest-get-type: 26.3.0 pretty-format: 26.6.2 dev: true + /jest-diff/27.0.6: + resolution: {integrity: sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.0.6 + jest-get-type: 27.0.6 + pretty-format: 27.0.6 + dev: true + /jest-docblock/26.0.0: resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} engines: {node: '>= 10.14.2'} @@ -8973,6 +9405,13 @@ packages: detect-newline: 3.1.0 dev: true + /jest-docblock/27.0.6: + resolution: {integrity: sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + /jest-each/26.6.2: resolution: {integrity: sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==} engines: {node: '>= 10.14.2'} @@ -8984,6 +9423,17 @@ packages: pretty-format: 26.6.2 dev: true + /jest-each/27.0.6: + resolution: {integrity: sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + chalk: 4.1.2 + jest-get-type: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 + dev: true + /jest-environment-jsdom/26.6.2: resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} engines: {node: '>= 10.14.2'} @@ -9002,6 +9452,24 @@ packages: - utf-8-validate dev: true + /jest-environment-jsdom/27.0.6: + resolution: {integrity: sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + jest-mock: 27.0.6 + jest-util: 27.0.6 + jsdom: 16.6.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /jest-environment-node/26.6.2: resolution: {integrity: sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==} engines: {node: '>= 10.14.2'} @@ -9014,11 +9482,28 @@ packages: jest-util: 26.6.2 dev: true + /jest-environment-node/27.0.6: + resolution: {integrity: sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + jest-mock: 27.0.6 + jest-util: 27.0.6 + dev: true + /jest-get-type/26.3.0: resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} engines: {node: '>= 10.14.2'} dev: true + /jest-get-type/27.0.6: + resolution: {integrity: sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + /jest-haste-map/26.6.2: resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} engines: {node: '>= 10.14.2'} @@ -9040,6 +9525,26 @@ packages: fsevents: 2.3.2 dev: true + /jest-haste-map/27.0.6: + resolution: {integrity: sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + '@types/graceful-fs': 4.1.5 + '@types/node': 16.4.7 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.6 + jest-regex-util: 27.0.6 + jest-serializer: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 + micromatch: 4.0.4 + walker: 1.0.7 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /jest-jasmine2/26.6.3: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} engines: {node: '>= 10.14.2'} @@ -9070,6 +9575,32 @@ packages: - utf-8-validate dev: true + /jest-jasmine2/27.0.6: + resolution: {integrity: sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/traverse': 7.14.8 + '@jest/environment': 27.0.6 + '@jest/source-map': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.0.6 + is-generator-fn: 2.1.0 + jest-each: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-leak-detector/26.6.2: resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} engines: {node: '>= 10.14.2'} @@ -9078,6 +9609,14 @@ packages: pretty-format: 26.6.2 dev: true + /jest-leak-detector/27.0.6: + resolution: {integrity: sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.0.6 + pretty-format: 27.0.6 + dev: true + /jest-matcher-utils/26.6.2: resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} engines: {node: '>= 10.14.2'} @@ -9088,6 +9627,16 @@ packages: pretty-format: 26.6.2 dev: true + /jest-matcher-utils/27.0.6: + resolution: {integrity: sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.0.6 + jest-get-type: 27.0.6 + pretty-format: 27.0.6 + dev: true + /jest-message-util/26.6.2: resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} engines: {node: '>= 10.14.2'} @@ -9103,6 +9652,21 @@ packages: stack-utils: 2.0.3 dev: true + /jest-message-util/27.0.6: + resolution: {integrity: sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.14.5 + '@jest/types': 27.0.6 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.6 + micromatch: 4.0.4 + pretty-format: 27.0.6 + slash: 3.0.0 + stack-utils: 2.0.3 + dev: true + /jest-mock/26.6.2: resolution: {integrity: sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==} engines: {node: '>= 10.14.2'} @@ -9111,6 +9675,14 @@ packages: '@types/node': 16.4.6 dev: true + /jest-mock/27.0.6: + resolution: {integrity: sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@26.6.2: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} @@ -9123,11 +9695,28 @@ packages: jest-resolve: 26.6.2 dev: true + /jest-pnp-resolver/1.2.2_jest-resolve@27.0.6: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.0.6 + dev: true + /jest-regex-util/26.0.0: resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} engines: {node: '>= 10.14.2'} dev: true + /jest-regex-util/27.0.6: + resolution: {integrity: sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + /jest-resolve-dependencies/26.6.3: resolution: {integrity: sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==} engines: {node: '>= 10.14.2'} @@ -9137,6 +9726,17 @@ packages: jest-snapshot: 26.6.2 dev: true + /jest-resolve-dependencies/27.0.6: + resolution: {integrity: sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + jest-regex-util: 27.0.6 + jest-snapshot: 27.0.6 + transitivePeerDependencies: + - supports-color + dev: true + /jest-resolve/26.6.2: resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} engines: {node: '>= 10.14.2'} @@ -9151,6 +9751,21 @@ packages: slash: 3.0.0 dev: true + /jest-resolve/27.0.6: + resolution: {integrity: sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + chalk: 4.1.2 + escalade: 3.1.1 + graceful-fs: 4.2.6 + jest-pnp-resolver: 1.2.2_jest-resolve@27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 + resolve: 1.20.0 + slash: 3.0.0 + dev: true + /jest-runner/26.6.3: resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} engines: {node: '>= 10.14.2'} @@ -9183,6 +9798,39 @@ packages: - utf-8-validate dev: true + /jest-runner/27.0.6: + resolution: {integrity: sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.0.6 + '@jest/environment': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.6 + jest-docblock: 27.0.6 + jest-environment-jsdom: 27.0.6 + jest-environment-node: 27.0.6 + jest-haste-map: 27.0.6 + jest-leak-detector: 27.0.6 + jest-message-util: 27.0.6 + jest-resolve: 27.0.6 + jest-runtime: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 + source-map-support: 0.5.19 + throat: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /jest-runtime/26.6.3: resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} engines: {node: '>= 10.14.2'} @@ -9223,6 +9871,40 @@ packages: - utf-8-validate dev: true + /jest-runtime/27.0.6: + resolution: {integrity: sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.0.6 + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/globals': 27.0.6 + '@jest/source-map': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/yargs': 16.0.4 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.1.7 + graceful-fs: 4.2.6 + jest-haste-map: 27.0.6 + jest-message-util: 27.0.6 + jest-mock: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 + slash: 3.0.0 + strip-bom: 4.0.0 + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /jest-serializer/26.6.2: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} @@ -9231,6 +9913,14 @@ packages: graceful-fs: 4.2.6 dev: true + /jest-serializer/27.0.6: + resolution: {integrity: sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 16.4.7 + graceful-fs: 4.2.6 + dev: true + /jest-snapshot/26.6.2: resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} engines: {node: '>= 10.14.2'} @@ -9253,6 +9943,38 @@ packages: semver: 7.3.5 dev: true + /jest-snapshot/27.0.6: + resolution: {integrity: sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.14.8 + '@babel/generator': 7.14.8 + '@babel/parser': 7.14.8 + '@babel/plugin-syntax-typescript': 7.14.5_@babel+core@7.14.8 + '@babel/traverse': 7.14.8 + '@babel/types': 7.14.8 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/babel__traverse': 7.14.2 + '@types/prettier': 2.3.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.14.8 + chalk: 4.1.2 + expect: 27.0.6 + graceful-fs: 4.2.6 + jest-diff: 27.0.6 + jest-get-type: 27.0.6 + jest-haste-map: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-resolve: 27.0.6 + jest-util: 27.0.6 + natural-compare: 1.4.0 + pretty-format: 27.0.6 + semver: 7.3.5 + transitivePeerDependencies: + - supports-color + dev: true + /jest-util/26.6.2: resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} engines: {node: '>= 10.14.2'} @@ -9265,6 +9987,18 @@ packages: micromatch: 4.0.4 dev: true + /jest-util/27.0.6: + resolution: {integrity: sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + chalk: 4.1.2 + graceful-fs: 4.2.6 + is-ci: 3.0.0 + picomatch: 2.3.0 + dev: true + /jest-validate/26.6.2: resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} engines: {node: '>= 10.14.2'} @@ -9277,6 +10011,18 @@ packages: pretty-format: 26.6.2 dev: true + /jest-validate/27.0.6: + resolution: {integrity: sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + camelcase: 6.2.0 + chalk: 4.1.2 + jest-get-type: 27.0.6 + leven: 3.1.0 + pretty-format: 27.0.6 + dev: true + /jest-watcher/26.6.2: resolution: {integrity: sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==} engines: {node: '>= 10.14.2'} @@ -9290,6 +10036,19 @@ packages: string-length: 4.0.2 dev: true + /jest-watcher/27.0.6: + resolution: {integrity: sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 16.4.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.0.6 + string-length: 4.0.2 + dev: true + /jest-worker/25.5.0: resolution: {integrity: sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==} engines: {node: '>= 8.3'} @@ -9307,6 +10066,15 @@ packages: supports-color: 7.2.0 dev: true + /jest-worker/27.0.6: + resolution: {integrity: sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 16.4.7 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + /jest/26.6.3: resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} engines: {node: '>= 10.14.2'} @@ -9323,6 +10091,27 @@ packages: - utf-8-validate dev: true + /jest/27.0.6: + resolution: {integrity: sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.0.6 + import-local: 3.0.2 + jest-cli: 27.0.6 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jose/3.14.3: resolution: {integrity: sha512-j1vO5oWqa6LmdpiZvhkM9NYxN3EuTrmzVIqSGWtJVP6BOByujZdefZZjSFGzxmbf4GLYWaXLZMKTyVPbm00S2Q==} dev: false @@ -14706,6 +15495,10 @@ packages: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} dev: true + /throat/6.0.1: + resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} + dev: true + /through/2.3.8: resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} dev: true @@ -14867,6 +15660,37 @@ packages: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} dev: true + /ts-jest/27.0.5_92306e36c1a4cf876b1cd4839a977b9c: + resolution: {integrity: sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + dependencies: + '@types/jest': 27.0.1 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.0.6 + jest-util: 27.0.6 + json5: 2.2.0 + lodash: 4.17.21 + make-error: 1.3.6 + semver: 7.3.5 + typescript: 4.3.5 + yargs-parser: 20.2.9 + dev: true + /ts-node/10.1.0_13403c2f2d9ddab699dd2f492f123cbf: resolution: {integrity: sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==} engines: {node: '>=12.0.0'} @@ -15317,6 +16141,15 @@ packages: source-map: 0.7.3 dev: true + /v8-to-istanbul/8.0.0: + resolution: {integrity: sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.3 + convert-source-map: 1.8.0 + source-map: 0.7.3 + dev: true + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: