diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ae99805904..395b1acec0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -82,7 +82,7 @@ jobs: - name: Install build artifact run: yarn workspace @reduxjs/toolkit add $(pwd)/package.tgz - - run: sed -i -e /@remap-prod-remove-line/d ./tsconfig.base.json ./jest.config.js ./src/tests/*.* ./src/query/tests/*.* + - run: sed -i -e /@remap-prod-remove-line/d ./tsconfig.base.json ./vitest.config.ts ./src/tests/*.* ./src/query/tests/*.* - name: Run tests, against dist run: yarn test @@ -121,7 +121,7 @@ jobs: - name: Install build artifact run: yarn add ./package.tgz - - run: sed -i -e /@remap-prod-remove-line/d ./tsconfig.base.json ./jest.config.js ./src/tests/*.* ./src/query/tests/*.* + - run: sed -i -e /@remap-prod-remove-line/d ./tsconfig.base.json ./vitest.config.ts ./src/tests/*.* ./src/query/tests/*.* - name: Test types run: | diff --git a/.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch b/.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch new file mode 100644 index 0000000000..74ee5988a2 --- /dev/null +++ b/.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch @@ -0,0 +1,41 @@ +diff --git a/src/index.js b/src/index.js +index 90ff7fa3d7d4fa62dbbf638958ae4e28abd089a8..28434687b5163b7472e86bdb11bed69e0868e660 100644 +--- a/src/index.js ++++ b/src/index.js +@@ -1,4 +1,4 @@ +-import { mockConsole, createConsole } from './pure'; ++import { mockConsole, createConsole } from './pure.js'; + + // Keep an instance of the original console and export it + const originalConsole = global.console; +diff --git a/src/pure.js b/src/pure.js +index b00ea2abbaea833e336676aa46e7ced2d59d6d88..42b83ed83fa16cf2234571500fe09868debd9f01 100644 +--- a/src/pure.js ++++ b/src/pure.js +@@ -228,10 +228,11 @@ export function restore() { + global.console = global.originalConsole; + } + ++/* + if (typeof expect === 'function' && typeof expect.extend === 'function') { + expect.extend({ + toMatchInlineSnapshot(received, ...args) { +- /* ------- Workaround for custom inline snapshot matchers ------- */ ++ // Workaround for custom inline snapshot matchers + const error = new Error(); + const stacks = error.stack.split('\n'); + +@@ -245,7 +246,6 @@ if (typeof expect === 'function' && typeof expect.extend === 'function') { + error.stack = stacks.join('\n'); + + const context = Object.assign(this, { error }); +- /* -------------------------------------------------------------- */ + + const testingConsoleInstance = + (received && received.testingConsole) || received; +@@ -270,3 +270,4 @@ if (typeof expect === 'function' && typeof expect.extend === 'function') { + }, + }); + } ++*/ +\ No newline at end of file diff --git a/package.json b/package.json index 8996f8c20a..f10cbc2265 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,8 @@ "@babel/helper-compilation-targets": "7.19.3", "@babel/traverse": "7.19.3", "@babel/types": "7.19.3", - "console-testing-library": "patch:console-testing-library@npm:0.3.1#.yarn/patches/console-testing-library__npm_0.3.1.patch", "esbuild": "0.17.0", + "jest-snapshot": "29.3.1", "msw": "patch:msw@npm:0.40.2#.yarn/patches/msw-npm-0.40.2-2107d48752", "jscodeshift": "0.13.1", "react-redux": "npm:8.0.2", @@ -63,7 +63,8 @@ "docs/react-dom": "npm:17.0.2", "docs/@types/react-dom": "npm:17.0.11", "docs/@types/react": "npm:17.0.11", - "type-fest": "2.19.0" + "type-fest": "2.19.0", + "console-testing-library@0.6.1": "patch:console-testing-library@npm%3A0.6.1#./.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch" }, "scripts": { "build": "yarn build:packages", diff --git a/packages/rtk-query-codegen-openapi/jest.config.js b/packages/rtk-query-codegen-openapi/jest.config.js index 4632bc4128..1be66fe00b 100644 --- a/packages/rtk-query-codegen-openapi/jest.config.js +++ b/packages/rtk-query-codegen-openapi/jest.config.js @@ -1,12 +1,13 @@ const { resolve } = require('path'); -const tsConfigPath = resolve('./test/tsconfig'); +const tsConfigPath = resolve('./test/tsconfig.json'); /** @typedef {import('ts-jest/dist/types')} */ /** @type {import('@jest/types').Config.InitialOptions} */ const config = { rootDir: './test', setupFilesAfterEnv: ['/jest.setup.ts'], + preset: 'ts-jest', globals: { 'ts-jest': { tsconfig: tsConfigPath, diff --git a/packages/rtk-query-codegen-openapi/package.json b/packages/rtk-query-codegen-openapi/package.json index 1fdd912502..59d0648f96 100644 --- a/packages/rtk-query-codegen-openapi/package.json +++ b/packages/rtk-query-codegen-openapi/package.json @@ -46,11 +46,11 @@ "esbuild": "~0.17", "esbuild-runner": "^2.2.1", "husky": "^4.3.6", - "jest": "^27", + "jest": "^29", "msw": "^0.40.2", "openapi-types": "^9.1.0", "pretty-quick": "^3.1.0", - "ts-jest": "^27", + "ts-jest": "^29", "ts-node": "^10.4.0", "yalc": "^1.0.0-pre.47" }, diff --git a/packages/rtk-query-codegen-openapi/test/cli.test.ts b/packages/rtk-query-codegen-openapi/test/cli.test.ts index 691a38e442..c6f25aaae0 100644 --- a/packages/rtk-query-codegen-openapi/test/cli.test.ts +++ b/packages/rtk-query-codegen-openapi/test/cli.test.ts @@ -70,7 +70,7 @@ Done expect(fromTs).toEqual(fromJs); expect(fromJson).toEqual(fromJs); - }, 25000); + }, 120000); test('missing parameters doesnt fail', async () => { const out = await cli([`./config.invalid-example.json`], __dirname); diff --git a/packages/rtk-query-codegen-openapi/test/jest.setup.ts b/packages/rtk-query-codegen-openapi/test/jest.setup.ts index 464008fbc3..daf436b230 100644 --- a/packages/rtk-query-codegen-openapi/test/jest.setup.ts +++ b/packages/rtk-query-codegen-openapi/test/jest.setup.ts @@ -1,3 +1,4 @@ +// @ts-ignore global.fetch = require('node-fetch'); const { format } = require('prettier'); const { server } = require('./mocks/server'); diff --git a/packages/rtk-query-codegen-openapi/test/tsconfig.json b/packages/rtk-query-codegen-openapi/test/tsconfig.json index 78e8e8d37e..499c1c5631 100644 --- a/packages/rtk-query-codegen-openapi/test/tsconfig.json +++ b/packages/rtk-query-codegen-openapi/test/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "lib": ["es2019"], "paths": { "@/*": ["./test/fixtures/*"], "@rtk-query/codegen-openapi": ["./src"] diff --git a/packages/toolkit/jest.config.js b/packages/toolkit/jest.config.js deleted file mode 100644 index b332f3a10d..0000000000 --- a/packages/toolkit/jest.config.js +++ /dev/null @@ -1,22 +0,0 @@ -export default { - testEnvironment: 'jest-environment-jsdom', - setupFilesAfterEnv: ['./jest.setup.js'], - testMatch: ['/src/**/*.(spec|test).[jt]s?(x)'], - moduleNameMapper: { - '^@reduxjs/toolkit$': '/src/index.ts', // @remap-prod-remove-line - '^@reduxjs/toolkit/query$': '/src/query/index.ts', // @remap-prod-remove-line - '^@reduxjs/toolkit/query/react$': '/src/query/react/index.ts', // @remap-prod-remove-line - // this mapping is disabled as we want `dist` imports in the tests only to be used for "type-only" imports which don't play a role for jest - //'^@reduxjs/toolkit/dist/(.*)$': '/src/*', - '^@internal/(.*)$': '/src/$1', - }, - preset: 'ts-jest', - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - diagnostics: { - ignoreCodes: [6133], - }, - }, - }, -} diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 003ebf295c..34997ef3ce 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -61,7 +61,7 @@ "@typescript-eslint/eslint-plugin": "^4.22.0", "@typescript-eslint/parser": "^4.22.0", "axios": "^0.19.2", - "console-testing-library": "^0.3.1", + "console-testing-library": "0.6.1", "convert-source-map": "^1.7.0", "esbuild": "~0.17", "eslint": "^7.25.0", @@ -75,7 +75,7 @@ "eslint-plugin-react-hooks": "^4.2.0", "fs-extra": "^9.1.0", "invariant": "^2.2.4", - "jest": "^27", + "jsdom": "^21.0.0", "json-stringify-safe": "^5.0.1", "magic-string": "^0.25.7", "merge-source-map": "^1.1.0", @@ -89,10 +89,10 @@ "size-limit": "^4.11.0", "source-map": "^0.7.3", "terser": "^5.6.1", - "ts-jest": "^27", "tslib": "^1.10.0", "tsx": "^3.12.2", "typescript": "~4.9", + "vitest": "^0.27.2", "yargs": "^15.3.1" }, "scripts": { @@ -104,7 +104,7 @@ "format": "prettier --write \"(src|examples)/**/*.{ts,tsx}\" \"**/*.md\"", "format:check": "prettier --list-different \"(src|examples)/**/*.{ts,tsx}\" \"docs/*/**.md\"", "lint": "eslint src examples", - "test": "jest --runInBand", + "test": "vitest", "type-tests": "yarn tsc -p src/tests/tsconfig.typetests.json && yarn tsc -p src/query/tests/tsconfig.typetests.json", "prepack": "npm run build-prepare" }, diff --git a/packages/toolkit/src/entities/tests/sorted_state_adapter.test.ts b/packages/toolkit/src/entities/tests/sorted_state_adapter.test.ts index c1a2ebaa88..c501d69a34 100644 --- a/packages/toolkit/src/entities/tests/sorted_state_adapter.test.ts +++ b/packages/toolkit/src/entities/tests/sorted_state_adapter.test.ts @@ -590,12 +590,10 @@ describe('Sorted State Adapter', () => { const result = createNextState(withTwo, (draft) => { adapter.removeAll(draft) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object {}, - "ids": Array [], - } - `) + expect(result).toEqual({ + entities: {}, + ids: [], + }) }) test('addOne', () => { @@ -603,19 +601,15 @@ describe('Sorted State Adapter', () => { adapter.addOne(draft, TheGreatGatsby) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'The Great Gatsby', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('addMany', () => { @@ -623,24 +617,19 @@ describe('Sorted State Adapter', () => { adapter.addMany(draft, [TheGreatGatsby, AnimalFarm]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', }, - "ids": Array [ - "af", - "tgg", - ], - } - `) + tgg: { + id: 'tgg', + title: 'The Great Gatsby', + }, + }, + ids: ['af', 'tgg'], + }) }) test('setAll', () => { @@ -648,24 +637,19 @@ describe('Sorted State Adapter', () => { adapter.setAll(draft, [TheGreatGatsby, AnimalFarm]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', + }, + tgg: { + id: 'tgg', + title: 'The Great Gatsby', }, - "ids": Array [ - "af", - "tgg", - ], - } - `) + }, + ids: ['af', 'tgg'], + }) }) test('updateOne', () => { @@ -678,19 +662,15 @@ describe('Sorted State Adapter', () => { }) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "A New Hope", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'A New Hope', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('updateMany', () => { @@ -713,49 +693,39 @@ describe('Sorted State Adapter', () => { ]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "aco": Object { - "id": "aco", - "title": "Third Change", - }, - "tgg": Object { - "id": "tgg", - "title": "Second Change", - }, - "th": Object { - "author": "Fourth Change", - "id": "th", - "title": "First Change", - }, + expect(result).toEqual({ + entities: { + aco: { + id: 'aco', + title: 'Third Change', + }, + tgg: { + id: 'tgg', + title: 'Second Change', }, - "ids": Array [ - "th", - "tgg", - "aco", - ], - } - `) + th: { + author: 'Fourth Change', + id: 'th', + title: 'First Change', + }, + }, + ids: ['th', 'tgg', 'aco'], + }) }) test('upsertOne (insert)', () => { const result = createNextState(state, (draft) => { adapter.upsertOne(draft, TheGreatGatsby) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'The Great Gatsby', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('upsertOne (update)', () => { @@ -766,19 +736,15 @@ describe('Sorted State Adapter', () => { title: 'A New Hope', }) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "A New Hope", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'A New Hope', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('upsertMany', () => { @@ -792,43 +758,34 @@ describe('Sorted State Adapter', () => { AnimalFarm, ]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, - "tgg": Object { - "id": "tgg", - "title": "A New Hope", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', }, - "ids": Array [ - "tgg", - "af", - ], - } - `) + tgg: { + id: 'tgg', + title: 'A New Hope', + }, + }, + ids: ['tgg', 'af'], + }) }) test('setOne (insert)', () => { const result = createNextState(state, (draft) => { adapter.setOne(draft, TheGreatGatsby) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'The Great Gatsby', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('setOne (update)', () => { @@ -839,19 +796,15 @@ describe('Sorted State Adapter', () => { title: 'Silmarillion', }) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "th": Object { - "id": "th", - "title": "Silmarillion", - }, + expect(result).toEqual({ + entities: { + th: { + id: 'th', + title: 'Silmarillion', }, - "ids": Array [ - "th", - ], - } - `) + }, + ids: ['th'], + }) }) test('setMany', () => { @@ -865,24 +818,19 @@ describe('Sorted State Adapter', () => { AnimalFarm, ]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, - "th": Object { - "id": "th", - "title": "Silmarillion", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', + }, + th: { + id: 'th', + title: 'Silmarillion', }, - "ids": Array [ - "af", - "th", - ], - } - `) + }, + ids: ['af', 'th'], + }) }) test('removeOne', () => { @@ -890,19 +838,15 @@ describe('Sorted State Adapter', () => { const result = createNextState(withTwo, (draft) => { adapter.removeOne(draft, TheGreatGatsby.id) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', }, - "ids": Array [ - "af", - ], - } - `) + }, + ids: ['af'], + }) }) test('removeMany', () => { @@ -914,19 +858,15 @@ describe('Sorted State Adapter', () => { const result = createNextState(withThree, (draft) => { adapter.removeMany(draft, [TheGreatGatsby.id, AnimalFarm.id]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "aco": Object { - "id": "aco", - "title": "A Clockwork Orange", - }, + expect(result).toEqual({ + entities: { + aco: { + id: 'aco', + title: 'A Clockwork Orange', }, - "ids": Array [ - "aco", - ], - } - `) + }, + ids: ['aco'], + }) }) }) }) diff --git a/packages/toolkit/src/entities/tests/unsorted_state_adapter.test.ts b/packages/toolkit/src/entities/tests/unsorted_state_adapter.test.ts index 092522fff5..13c49cf0ec 100644 --- a/packages/toolkit/src/entities/tests/unsorted_state_adapter.test.ts +++ b/packages/toolkit/src/entities/tests/unsorted_state_adapter.test.ts @@ -435,12 +435,10 @@ describe('Unsorted State Adapter', () => { const result = createNextState(withTwo, (draft) => { adapter.removeAll(draft) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object {}, - "ids": Array [], - } - `) + expect(result).toEqual({ + entities: {}, + ids: [], + }) }) test('addOne', () => { @@ -448,19 +446,15 @@ describe('Unsorted State Adapter', () => { adapter.addOne(draft, TheGreatGatsby) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'The Great Gatsby', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('addMany', () => { @@ -468,24 +462,19 @@ describe('Unsorted State Adapter', () => { adapter.addMany(draft, [TheGreatGatsby, AnimalFarm]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', }, - "ids": Array [ - "tgg", - "af", - ], - } - `) + tgg: { + id: 'tgg', + title: 'The Great Gatsby', + }, + }, + ids: ['tgg', 'af'], + }) }) test('setAll', () => { @@ -493,24 +482,19 @@ describe('Unsorted State Adapter', () => { adapter.setAll(draft, [TheGreatGatsby, AnimalFarm]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', + }, + tgg: { + id: 'tgg', + title: 'The Great Gatsby', }, - "ids": Array [ - "tgg", - "af", - ], - } - `) + }, + ids: ['tgg', 'af'], + }) }) test('updateOne', () => { @@ -523,19 +507,15 @@ describe('Unsorted State Adapter', () => { }) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "A New Hope", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'A New Hope', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('updateMany', () => { @@ -558,49 +538,39 @@ describe('Unsorted State Adapter', () => { ]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "aco": Object { - "id": "aco", - "title": "Third Change", - }, - "tgg": Object { - "id": "tgg", - "title": "Second Change", - }, - "th": Object { - "author": "Fourth Change", - "id": "th", - "title": "First Change", - }, + expect(result).toEqual({ + entities: { + aco: { + id: 'aco', + title: 'Third Change', + }, + tgg: { + id: 'tgg', + title: 'Second Change', }, - "ids": Array [ - "tgg", - "aco", - "th", - ], - } - `) + th: { + author: 'Fourth Change', + id: 'th', + title: 'First Change', + }, + }, + ids: ['tgg', 'aco', 'th'], + }) }) test('upsertOne (insert)', () => { const result = createNextState(state, (draft) => { adapter.upsertOne(draft, TheGreatGatsby) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'The Great Gatsby', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('upsertOne (update)', () => { @@ -611,19 +581,15 @@ describe('Unsorted State Adapter', () => { title: 'A New Hope', }) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "A New Hope", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'A New Hope', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('upsertMany', () => { @@ -637,43 +603,34 @@ describe('Unsorted State Adapter', () => { AnimalFarm, ]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, - "tgg": Object { - "id": "tgg", - "title": "A New Hope", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', }, - "ids": Array [ - "tgg", - "af", - ], - } - `) + tgg: { + id: 'tgg', + title: 'A New Hope', + }, + }, + ids: ['tgg', 'af'], + }) }) test('setOne (insert)', () => { const result = createNextState(state, (draft) => { adapter.setOne(draft, TheGreatGatsby) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "tgg": Object { - "id": "tgg", - "title": "The Great Gatsby", - }, + expect(result).toEqual({ + entities: { + tgg: { + id: 'tgg', + title: 'The Great Gatsby', }, - "ids": Array [ - "tgg", - ], - } - `) + }, + ids: ['tgg'], + }) }) test('setOne (update)', () => { @@ -684,19 +641,15 @@ describe('Unsorted State Adapter', () => { title: 'Silmarillion', }) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "th": Object { - "id": "th", - "title": "Silmarillion", - }, + expect(result).toEqual({ + entities: { + th: { + id: 'th', + title: 'Silmarillion', }, - "ids": Array [ - "th", - ], - } - `) + }, + ids: ['th'], + }) }) test('setMany', () => { @@ -710,24 +663,19 @@ describe('Unsorted State Adapter', () => { AnimalFarm, ]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, - "th": Object { - "id": "th", - "title": "Silmarillion", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', + }, + th: { + id: 'th', + title: 'Silmarillion', }, - "ids": Array [ - "th", - "af", - ], - } - `) + }, + ids: ['th', 'af'], + }) }) test('removeOne', () => { @@ -735,19 +683,15 @@ describe('Unsorted State Adapter', () => { const result = createNextState(withTwo, (draft) => { adapter.removeOne(draft, TheGreatGatsby.id) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "af": Object { - "id": "af", - "title": "Animal Farm", - }, + expect(result).toEqual({ + entities: { + af: { + id: 'af', + title: 'Animal Farm', }, - "ids": Array [ - "af", - ], - } - `) + }, + ids: ['af'], + }) }) test('removeMany', () => { @@ -759,19 +703,15 @@ describe('Unsorted State Adapter', () => { const result = createNextState(withThree, (draft) => { adapter.removeMany(draft, [TheGreatGatsby.id, AnimalFarm.id]) }) - expect(result).toMatchInlineSnapshot(` - Object { - "entities": Object { - "aco": Object { - "id": "aco", - "title": "A Clockwork Orange", - }, + expect(result).toEqual({ + entities: { + aco: { + id: 'aco', + title: 'A Clockwork Orange', }, - "ids": Array [ - "aco", - ], - } - `) + }, + ids: ['aco'], + }) }) }) }) diff --git a/packages/toolkit/src/entities/tests/utils.spec.ts b/packages/toolkit/src/entities/tests/utils.spec.ts index 3e72a03ec5..cc4053cd18 100644 --- a/packages/toolkit/src/entities/tests/utils.spec.ts +++ b/packages/toolkit/src/entities/tests/utils.spec.ts @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import { AClockworkOrange } from './fixtures/book' describe('Entity utils', () => { @@ -5,35 +6,35 @@ describe('Entity utils', () => { const OLD_ENV = process.env beforeEach(() => { - jest.resetModules() // this is important - it clears the cache + vi.resetModules() // this is important - it clears the cache process.env = { ...OLD_ENV, NODE_ENV: 'development' } }) afterEach(() => { process.env = OLD_ENV - jest.resetAllMocks() + vi.resetAllMocks() }) - it('should not warn when key does exist', () => { - const { selectIdValue } = require('../utils') - const spy = jest.spyOn(console, 'warn') + it('should not warn when key does exist', async () => { + const { selectIdValue } = await import('../utils') + const spy = vi.spyOn(console, 'warn') selectIdValue(AClockworkOrange, (book: any) => book.id) expect(spy).not.toHaveBeenCalled() }) - it('should warn when key does not exist in dev mode', () => { - const { selectIdValue } = require('../utils') - const spy = jest.spyOn(console, 'warn') + it('should warn when key does not exist in dev mode', async () => { + const { selectIdValue } = await import('../utils') + const spy = vi.spyOn(console, 'warn') selectIdValue(AClockworkOrange, (book: any) => book.foo) expect(spy).toHaveBeenCalled() }) - it('should warn when key is undefined in dev mode', () => { - const { selectIdValue } = require('../utils') - const spy = jest.spyOn(console, 'warn') + it('should warn when key is undefined in dev mode', async () => { + const { selectIdValue } = await import('../utils') + const spy = vi.spyOn(console, 'warn') const undefinedAClockworkOrange = { ...AClockworkOrange, id: undefined } selectIdValue(undefinedAClockworkOrange, (book: any) => book.id) @@ -41,20 +42,20 @@ describe('Entity utils', () => { expect(spy).toHaveBeenCalled() }) - it('should not warn when key does not exist in prod mode', () => { + it('should not warn when key does not exist in prod mode', async () => { process.env.NODE_ENV = 'production' - const { selectIdValue } = require('../utils') - const spy = jest.spyOn(console, 'warn') + const { selectIdValue } = await import('../utils') + const spy = vi.spyOn(console, 'warn') selectIdValue(AClockworkOrange, (book: any) => book.foo) expect(spy).not.toHaveBeenCalled() }) - it('should not warn when key is undefined in prod mode', () => { + it('should not warn when key is undefined in prod mode', async () => { process.env.NODE_ENV = 'production' - const { selectIdValue } = require('../utils') - const spy = jest.spyOn(console, 'warn') + const { selectIdValue } = await import('../utils') + const spy = vi.spyOn(console, 'warn') const undefinedAClockworkOrange = { ...AClockworkOrange, id: undefined } selectIdValue(undefinedAClockworkOrange, (book: any) => book.id) diff --git a/packages/toolkit/src/listenerMiddleware/tests/effectScenarios.test.ts b/packages/toolkit/src/listenerMiddleware/tests/effectScenarios.test.ts index 87ed4b1eef..0084c01b04 100644 --- a/packages/toolkit/src/listenerMiddleware/tests/effectScenarios.test.ts +++ b/packages/toolkit/src/listenerMiddleware/tests/effectScenarios.test.ts @@ -4,6 +4,7 @@ import { createSlice, isAnyOf, } from '@reduxjs/toolkit' +import { vi } from 'vitest' import type { AnyAction, PayloadAction, Action } from '@reduxjs/toolkit' @@ -58,7 +59,7 @@ describe('Saga-style Effects Scenarios', () => { beforeAll(() => { const noop = () => {} - jest.spyOn(console, 'error').mockImplementation(noop) + vi.spyOn(console, 'error').mockImplementation(noop) }) beforeEach(() => { diff --git a/packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts b/packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts index bba8fd1662..5417383685 100644 --- a/packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts +++ b/packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts @@ -4,6 +4,7 @@ import { createSlice, isAnyOf, } from '@reduxjs/toolkit' +import { vi, Mock } from 'vitest' import type { AnyAction, PayloadAction, Action } from '@reduxjs/toolkit' @@ -141,7 +142,7 @@ describe('createListenerMiddleware', () => { return new Promise((resolve) => setTimeout(resolve, ms)) } - let reducer: jest.Mock + let reducer: Mock let listenerMiddleware = createListenerMiddleware() let { middleware, startListening, stopListening, clearListeners } = listenerMiddleware @@ -157,7 +158,7 @@ describe('createListenerMiddleware', () => { type TestAction3 = ReturnType beforeAll(() => { - jest.spyOn(console, 'error').mockImplementation(noop) + vi.spyOn(console, 'error').mockImplementation(noop) }) beforeEach(() => { @@ -166,7 +167,7 @@ describe('createListenerMiddleware', () => { startListening = listenerMiddleware.startListening stopListening = listenerMiddleware.stopListening clearListeners = listenerMiddleware.clearListeners - reducer = jest.fn(() => ({})) + reducer = vi.fn(() => ({})) store = configureStore({ reducer, middleware: (gDM) => gDM().prepend(middleware), @@ -214,7 +215,7 @@ describe('createListenerMiddleware', () => { describe('Subscription and unsubscription', () => { test('directly subscribing', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) startListening({ actionCreator: testAction1, @@ -232,7 +233,7 @@ describe('createListenerMiddleware', () => { }) test('stopListening returns true if an entry has been unsubscribed, false otherwise', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) startListening({ actionCreator: testAction1, @@ -244,7 +245,7 @@ describe('createListenerMiddleware', () => { }) test('dispatch(removeListener({...})) returns true if an entry has been unsubscribed, false otherwise', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) startListening({ actionCreator: testAction1, @@ -270,7 +271,7 @@ describe('createListenerMiddleware', () => { }) test('can subscribe with a string action type', () => { - const effect = jest.fn((_: AnyAction) => {}) + const effect = vi.fn((_: AnyAction) => {}) store.dispatch( addListener({ @@ -289,7 +290,7 @@ describe('createListenerMiddleware', () => { }) test('can subscribe with a matcher function', () => { - const effect = jest.fn((_: AnyAction) => {}) + const effect = vi.fn((_: AnyAction) => {}) const isAction1Or2 = isAnyOf(testAction1, testAction2) @@ -356,7 +357,7 @@ describe('createListenerMiddleware', () => { }) test('subscribing with the same listener will not make it trigger twice (like EventTarget.addEventListener())', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) startListening({ actionCreator: testAction1, @@ -378,7 +379,7 @@ describe('createListenerMiddleware', () => { }) test('unsubscribing via callback', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) const unsubscribe = startListening({ actionCreator: testAction1, @@ -394,7 +395,7 @@ describe('createListenerMiddleware', () => { }) test('directly unsubscribing', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) startListening({ actionCreator: testAction1, @@ -415,7 +416,7 @@ describe('createListenerMiddleware', () => { }) test('subscribing via action', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) store.dispatch( addListener({ @@ -435,7 +436,7 @@ describe('createListenerMiddleware', () => { }) test('unsubscribing via callback from dispatch', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) const unsubscribe = store.dispatch( addListener({ @@ -456,7 +457,7 @@ describe('createListenerMiddleware', () => { }) test('unsubscribing via action', () => { - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) startListening({ actionCreator: testAction1, @@ -575,7 +576,7 @@ describe('createListenerMiddleware', () => { AnyAction, typeof store.getState, typeof store.dispatch - > = jest.fn() + > = vi.fn() startListening({ ...params, effect } as any) @@ -646,7 +647,7 @@ describe('createListenerMiddleware', () => { }) test('"can unsubscribe via middleware api', () => { - const effect = jest.fn( + const effect = vi.fn( (action: TestAction1, api: ListenerEffectAPI) => { if (action.payload === 'b') { api.unsubscribe() @@ -847,7 +848,7 @@ describe('createListenerMiddleware', () => { }) test('getOriginalState can only be invoked synchronously', async () => { - const onError = jest.fn() + const onError = vi.fn() const listenerMiddleware = createListenerMiddleware({ onError, @@ -897,7 +898,7 @@ describe('createListenerMiddleware', () => { test('by default, actions are forwarded to the store', () => { reducer.mockClear() - const effect = jest.fn((_: TestAction1) => {}) + const effect = vi.fn((_: TestAction1) => {}) startListening({ actionCreator: testAction1, @@ -962,7 +963,7 @@ describe('createListenerMiddleware', () => { }, }) - const effect = jest.fn(() => {}) + const effect = vi.fn(() => {}) startListening({ matcher, effect }) store.dispatch(testAction1('a')) @@ -971,8 +972,8 @@ describe('createListenerMiddleware', () => { test('Continues running other listeners if a predicate raises an error', () => { const matcher = (action: any): action is any => true - const firstListener = jest.fn(() => {}) - const secondListener = jest.fn(() => {}) + const firstListener = vi.fn(() => {}) + const secondListener = vi.fn(() => {}) startListening({ // @ts-expect-error @@ -992,12 +993,12 @@ describe('createListenerMiddleware', () => { }) test('Notifies sync listener errors to `onError`, if provided', async () => { - const onError = jest.fn() + const onError = vi.fn() const listenerMiddleware = createListenerMiddleware({ onError, }) const { middleware, startListening } = listenerMiddleware - reducer = jest.fn(() => ({})) + reducer = vi.fn(() => ({})) store = configureStore({ reducer, middleware: (gDM) => gDM().prepend(middleware), @@ -1023,12 +1024,12 @@ describe('createListenerMiddleware', () => { }) test('Notifies async listeners errors to `onError`, if provided', async () => { - const onError = jest.fn() + const onError = vi.fn() const listenerMiddleware = createListenerMiddleware({ onError, }) const { middleware, startListening } = listenerMiddleware - reducer = jest.fn(() => ({})) + reducer = vi.fn(() => ({})) store = configureStore({ reducer, middleware: (gDM) => gDM().prepend(middleware), diff --git a/packages/toolkit/src/query/tests/buildHooks.test.tsx b/packages/toolkit/src/query/tests/buildHooks.test.tsx index 19e4659e84..743b122599 100644 --- a/packages/toolkit/src/query/tests/buildHooks.test.tsx +++ b/packages/toolkit/src/query/tests/buildHooks.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react' +import { vi, SpyInstance } from 'vitest' import type { UseMutation, UseQuery, @@ -672,7 +673,7 @@ describe('hooks tests', () => { ) }) test('with `selectFromResult`', async () => { - const selectFromResult = jest.fn((x) => x) + const selectFromResult = vi.fn((x) => x) const { result } = renderHook( () => api.endpoints.getUser.useQuery(5, { selectFromResult }), { @@ -718,10 +719,10 @@ describe('hooks tests', () => { }) describe('Hook middleware requirements', () => { - let mock: jest.SpyInstance + let mock: SpyInstance beforeEach(() => { - mock = jest.spyOn(console, 'error').mockImplementation(() => {}) + mock = vi.spyOn(console, 'error').mockImplementation(() => {}) }) afterEach(() => { diff --git a/packages/toolkit/src/query/tests/buildThunks.test.tsx b/packages/toolkit/src/query/tests/buildThunks.test.tsx index 70fc0cab87..ed40bd9342 100644 --- a/packages/toolkit/src/query/tests/buildThunks.test.tsx +++ b/packages/toolkit/src/query/tests/buildThunks.test.tsx @@ -1,4 +1,5 @@ import { configureStore } from '@reduxjs/toolkit' +import { vi } from 'vitest' import { createApi } from '@reduxjs/toolkit/query/react' import { renderHook, waitFor } from '@testing-library/react' import type { BaseQueryApi } from '../baseQueryTypes' @@ -86,7 +87,7 @@ describe('re-triggering behavior on arg change', () => { middleware: (gDM) => gDM().concat(api.middleware), }) - const spy = jest.spyOn(getUser, 'initiate') + const spy = vi.spyOn(getUser, 'initiate') beforeEach(() => void spy.mockClear()) test('re-trigger on literal value change', async () => { @@ -101,7 +102,7 @@ describe('re-triggering behavior on arg change', () => { await waitFor(() => { expect(result.current.status).not.toBe('pending') }) - + expect(spy).toHaveBeenCalledTimes(1) for (let x = 1; x < 3; x++) { diff --git a/packages/toolkit/src/query/tests/cacheCollection.test.ts b/packages/toolkit/src/query/tests/cacheCollection.test.ts index 29ccce1fb4..802c9ff7c9 100644 --- a/packages/toolkit/src/query/tests/cacheCollection.test.ts +++ b/packages/toolkit/src/query/tests/cacheCollection.test.ts @@ -1,6 +1,6 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query' import { configureStore } from '@reduxjs/toolkit' -import { waitMs } from './helpers' +import { vi } from 'vitest' import type { Middleware, Reducer } from 'redux' import { THIRTY_TWO_BIT_MAX_INT, @@ -8,10 +8,10 @@ import { } from '../core/buildMiddleware/cacheCollection' beforeAll(() => { - jest.useFakeTimers('legacy') + vi.useFakeTimers() }) -const onCleanup = jest.fn() +const onCleanup = vi.fn() beforeEach(() => { onCleanup.mockClear() @@ -30,9 +30,9 @@ test(`query: await cleanup, defaults`, async () => { ) store.dispatch(api.endpoints.query.initiate('arg')).unsubscribe() - jest.advanceTimersByTime(59000), await waitMs() + vi.advanceTimersByTime(59000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + vi.advanceTimersByTime(2000) expect(onCleanup).toHaveBeenCalled() }) @@ -50,9 +50,9 @@ test(`query: await cleanup, keepUnusedDataFor set`, async () => { ) store.dispatch(api.endpoints.query.initiate('arg')).unsubscribe() - jest.advanceTimersByTime(28000), await waitMs() + vi.advanceTimersByTime(28000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + vi.advanceTimersByTime(2000) expect(onCleanup).toHaveBeenCalled() }) @@ -72,17 +72,16 @@ test(`query: handles large keepUnuseDataFor values over 32-bit ms`, async () => store.dispatch(api.endpoints.query.initiate('arg')).unsubscribe() // Shouldn't have been called right away - jest.advanceTimersByTime(1000), await waitMs() + vi.advanceTimersByTime(1000) expect(onCleanup).not.toHaveBeenCalled() // Shouldn't have been called any time in the next few minutes - jest.advanceTimersByTime(1_000_000), await waitMs() + vi.advanceTimersByTime(1_000_000) expect(onCleanup).not.toHaveBeenCalled() // _Should_ be called _wayyyy_ in the future (like 24.8 days from now) - jest.advanceTimersByTime(THIRTY_TWO_BIT_MAX_TIMER_SECONDS * 1000), - await waitMs() - expect(onCleanup).toHaveBeenCalled() + vi.advanceTimersByTime(THIRTY_TWO_BIT_MAX_TIMER_SECONDS * 1000), + expect(onCleanup).toHaveBeenCalled() }) describe(`query: await cleanup, keepUnusedDataFor set`, () => { @@ -112,17 +111,17 @@ describe(`query: await cleanup, keepUnusedDataFor set`, () => { test('global keepUnusedDataFor', async () => { store.dispatch(api.endpoints.query.initiate('arg')).unsubscribe() - jest.advanceTimersByTime(28000), await waitMs() + vi.advanceTimersByTime(28000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + vi.advanceTimersByTime(2000) expect(onCleanup).toHaveBeenCalled() }) test('endpoint keepUnusedDataFor', async () => { store.dispatch(api.endpoints.query2.initiate('arg')).unsubscribe() - jest.advanceTimersByTime(34000), await waitMs() + vi.advanceTimersByTime(34000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + vi.advanceTimersByTime(2000) expect(onCleanup).toHaveBeenCalled() }) @@ -130,8 +129,7 @@ describe(`query: await cleanup, keepUnusedDataFor set`, () => { expect(onCleanup).not.toHaveBeenCalled() store.dispatch(api.endpoints.query3.initiate('arg')).unsubscribe() expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(1) - await waitMs() + vi.advanceTimersByTime(1) expect(onCleanup).toHaveBeenCalled() }) @@ -139,7 +137,7 @@ describe(`query: await cleanup, keepUnusedDataFor set`, () => { expect(onCleanup).not.toHaveBeenCalled() store.dispatch(api.endpoints.query4.initiate('arg')).unsubscribe() expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(THIRTY_TWO_BIT_MAX_INT) + vi.advanceTimersByTime(THIRTY_TWO_BIT_MAX_INT) expect(onCleanup).not.toHaveBeenCalled() }) }) diff --git a/packages/toolkit/src/query/tests/cacheLifecycle.test.ts b/packages/toolkit/src/query/tests/cacheLifecycle.test.ts index 9b9284d857..54bac7eda8 100644 --- a/packages/toolkit/src/query/tests/cacheLifecycle.test.ts +++ b/packages/toolkit/src/query/tests/cacheLifecycle.test.ts @@ -1,10 +1,16 @@ import { createApi } from '@reduxjs/toolkit/query' import type { FetchBaseQueryMeta } from '@reduxjs/toolkit/query' +import { vi } from 'vitest' import { fetchBaseQuery } from '@reduxjs/toolkit/query' -import { expectType, fakeTimerWaitFor, setupApiStore, waitMs } from './helpers' +import { + expectType, + fakeTimerWaitFor, + setupApiStore, + DEFAULT_DELAY_MS, +} from './helpers' beforeAll(() => { - jest.useFakeTimers('legacy') + vi.useFakeTimers() }) const api = createApi({ @@ -13,10 +19,10 @@ const api = createApi({ }) const storeRef = setupApiStore(api) -const onNewCacheEntry = jest.fn() -const gotFirstValue = jest.fn() -const onCleanup = jest.fn() -const onCatch = jest.fn() +const onNewCacheEntry = vi.fn() +const gotFirstValue = vi.fn() +const onCleanup = vi.fn() +const onCatch = vi.fn() beforeEach(() => { onNewCacheEntry.mockClear() @@ -68,11 +74,12 @@ describe.each([['query'], ['mutation']] as const)( expect(onNewCacheEntry).toHaveBeenCalledWith('arg') expect(onCleanup).not.toHaveBeenCalled() - promise.unsubscribe(), await waitMs() + promise.unsubscribe() + await vi.advanceTimersByTimeAsync(DEFAULT_DELAY_MS) if (type === 'query') { - jest.advanceTimersByTime(59000), await waitMs() + await vi.advanceTimersByTimeAsync(59000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + await vi.advanceTimersByTimeAsync(2000) } expect(onCleanup).toHaveBeenCalled() @@ -121,11 +128,12 @@ describe.each([['query'], ['mutation']] as const)( }) expect(onCleanup).not.toHaveBeenCalled() - promise.unsubscribe(), await waitMs() + promise.unsubscribe() + await vi.advanceTimersByTimeAsync(DEFAULT_DELAY_MS) if (type === 'query') { - jest.advanceTimersByTime(59000), await waitMs() + await vi.advanceTimersByTimeAsync(59000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + await vi.advanceTimersByTimeAsync(2000) } expect(onCleanup).toHaveBeenCalled() @@ -158,9 +166,10 @@ describe.each([['query'], ['mutation']] as const)( ) expect(onNewCacheEntry).toHaveBeenCalledWith('arg') - promise.unsubscribe(), await waitMs() + promise.unsubscribe() + await vi.advanceTimersByTimeAsync(DEFAULT_DELAY_MS) if (type === 'query') { - jest.advanceTimersByTime(120000), await waitMs() + await vi.advanceTimersByTimeAsync(120000) } expect(gotFirstValue).not.toHaveBeenCalled() expect(onCleanup).not.toHaveBeenCalled() @@ -196,11 +205,13 @@ describe.each([['query'], ['mutation']] as const)( ) expect(onNewCacheEntry).toHaveBeenCalledWith('arg') - promise.unsubscribe(), await waitMs() + promise.unsubscribe() + await vi.advanceTimersByTimeAsync(DEFAULT_DELAY_MS) + if (type === 'query') { - jest.advanceTimersByTime(59000), await waitMs() + await vi.advanceTimersByTimeAsync(59000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + await vi.advanceTimersByTimeAsync(2000) } expect(onCleanup).toHaveBeenCalled() @@ -242,11 +253,12 @@ describe.each([['query'], ['mutation']] as const)( expect(onNewCacheEntry).toHaveBeenCalledWith('arg') - promise.unsubscribe(), await waitMs() + promise.unsubscribe() + await vi.advanceTimersByTimeAsync(DEFAULT_DELAY_MS) if (type === 'query') { - jest.advanceTimersByTime(59000), await waitMs() + await vi.advanceTimersByTimeAsync(59000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + await vi.advanceTimersByTimeAsync(2000) } expect(onCleanup).not.toHaveBeenCalled() expect(gotFirstValue).not.toHaveBeenCalled() @@ -287,11 +299,12 @@ describe.each([['query'], ['mutation']] as const)( expect(onNewCacheEntry).toHaveBeenCalledWith('arg') - promise.unsubscribe(), await waitMs() + promise.unsubscribe() + await vi.advanceTimersByTimeAsync(DEFAULT_DELAY_MS) if (type === 'query') { - jest.advanceTimersByTime(59000), await waitMs() + await vi.advanceTimersByTimeAsync(59000) expect(onCleanup).not.toHaveBeenCalled() - jest.advanceTimersByTime(2000), await waitMs() + await vi.advanceTimersByTimeAsync(2000) } expect(onCleanup).toHaveBeenCalled() expect(gotFirstValue).not.toHaveBeenCalled() @@ -303,7 +316,7 @@ describe.each([['query'], ['mutation']] as const)( ) test(`query: getCacheEntry`, async () => { - const snapshot = jest.fn() + const snapshot = vi.fn() const extended = api.injectEndpoints({ overrideExisting: true, endpoints: (build) => ({ @@ -337,7 +350,7 @@ test(`query: getCacheEntry`, async () => { expect(gotFirstValue).toHaveBeenCalled() }) - jest.advanceTimersByTime(120000), await waitMs() + await vi.advanceTimersByTimeAsync(120000) expect(snapshot).toHaveBeenCalledTimes(3) expect(snapshot.mock.calls[0][0]).toMatchObject({ @@ -376,7 +389,7 @@ test(`query: getCacheEntry`, async () => { }) test(`mutation: getCacheEntry`, async () => { - const snapshot = jest.fn() + const snapshot = vi.fn() const extended = api.injectEndpoints({ overrideExisting: true, endpoints: (build) => ({ @@ -408,7 +421,8 @@ test(`mutation: getCacheEntry`, async () => { expect(gotFirstValue).toHaveBeenCalled() }) - promise.unsubscribe(), await waitMs() + promise.unsubscribe() + await vi.advanceTimersByTimeAsync(DEFAULT_DELAY_MS) expect(snapshot).toHaveBeenCalledTimes(3) expect(snapshot.mock.calls[0][0]).toMatchObject({ @@ -443,7 +457,7 @@ test(`mutation: getCacheEntry`, async () => { }) test('updateCachedData', async () => { - const trackCalls = jest.fn() + const trackCalls = vi.fn() const extended = api.injectEndpoints({ overrideExisting: true, @@ -505,7 +519,7 @@ test('updateCachedData', async () => { expect(gotFirstValue).toHaveBeenCalled() }) - jest.advanceTimersByTime(61000) + await vi.advanceTimersByTimeAsync(61000) await fakeTimerWaitFor(() => { expect(onCleanup).toHaveBeenCalled() diff --git a/packages/toolkit/src/query/tests/cleanup.test.tsx b/packages/toolkit/src/query/tests/cleanup.test.tsx index a9cf2b94c2..75c0f4c6e0 100644 --- a/packages/toolkit/src/query/tests/cleanup.test.tsx +++ b/packages/toolkit/src/query/tests/cleanup.test.tsx @@ -1,16 +1,15 @@ // tests for "cleanup-after-unsubscribe" behaviour - +import { vi } from 'vitest' import React, { Profiler, ProfilerOnRenderCallback } from 'react' import { createListenerMiddleware } from '@reduxjs/toolkit' import { createApi, QueryStatus } from '@reduxjs/toolkit/query/react' import { render, waitFor, act, screen } from '@testing-library/react' import { setupApiStore } from './helpers' -import { delay } from '../../utils' const tick = () => new Promise((res) => setImmediate(res)) -export const runAllTimers = async () => jest.runAllTimers() && (await tick()) +export const runAllTimers = async () => vi.runAllTimers() && (await tick()) const api = createApi({ baseQuery: () => ({ data: 42 }), @@ -44,7 +43,7 @@ function UsingAB() { } beforeAll(() => { - jest.useFakeTimers('legacy') + vi.useFakeTimers() }) test('data stays in store when component stays rendered', async () => { @@ -55,11 +54,9 @@ test('data stays in store when component stays rendered', async () => { expect(getSubStateA()?.status).toBe(QueryStatus.fulfilled) ) - jest.advanceTimersByTime(120000) + vi.advanceTimersByTime(120000) - await waitFor(() => - expect(getSubStateA()?.status).toBe(QueryStatus.fulfilled) - ) + expect(getSubStateA()?.status).toBe(QueryStatus.fulfilled) }) test('data is removed from store after 60 seconds', async () => { @@ -72,11 +69,11 @@ test('data is removed from store after 60 seconds', async () => { unmount() - jest.advanceTimersByTime(59000) + vi.advanceTimersByTime(59000) expect(getSubStateA()?.status).toBe(QueryStatus.fulfilled) - jest.advanceTimersByTime(2000) + vi.advanceTimersByTime(2000) expect(getSubStateA()).toBeUndefined() }) @@ -106,10 +103,10 @@ test('data stays in store when component stays rendered while data for another c ) - jest.advanceTimersByTime(10) + vi.advanceTimersByTime(10) }) - jest.advanceTimersByTime(120000) + vi.advanceTimersByTime(120000) expect(getSubStateA()).toEqual(statusA) expect(getSubStateB()).toBeUndefined() @@ -140,13 +137,13 @@ test('data stays in store when one component requiring the data stays in the sto ) - jest.advanceTimersByTime(10) - jest.runAllTimers() + vi.advanceTimersByTime(10) + vi.runAllTimers() }) await act(async () => { - jest.advanceTimersByTime(120000) - jest.runAllTimers() + vi.advanceTimersByTime(120000) + vi.runAllTimers() }) expect(getSubStateA()).toEqual(statusA) @@ -188,14 +185,15 @@ test('Minimizes the number of subscription dispatches when multiple components a wrapper: storeRef.wrapper, }) - jest.advanceTimersByTime(10) + await act(async () => { + vi.advanceTimersByTime(10) + vi.runAllTimers() + }) await waitFor(() => { return screen.getAllByText(/42/).length > 0 }) - await runAllTimers() - const subscriptions = getSubscriptionsA() expect(Object.keys(subscriptions!).length).toBe(NUM_LIST_ITEMS) diff --git a/packages/toolkit/src/query/tests/createApi.test.ts b/packages/toolkit/src/query/tests/createApi.test.ts index 75d7690ada..5539debc1d 100644 --- a/packages/toolkit/src/query/tests/createApi.test.ts +++ b/packages/toolkit/src/query/tests/createApi.test.ts @@ -1,4 +1,5 @@ import { configureStore, createAction, createReducer } from '@reduxjs/toolkit' +import { vi, SpyInstance } from 'vitest' import type { Api, MutationDefinition, @@ -24,9 +25,9 @@ const originalEnv = process.env.NODE_ENV beforeAll(() => void ((process.env as any).NODE_ENV = 'development')) afterAll(() => void ((process.env as any).NODE_ENV = originalEnv)) -let spy: jest.SpyInstance +let spy: SpyInstance beforeAll(() => { - spy = jest.spyOn(console, 'error').mockImplementation(() => {}) + spy = vi.spyOn(console, 'error').mockImplementation(() => {}) }) afterEach(() => { spy.mockReset() @@ -75,7 +76,7 @@ test('sensible defaults', () => { }) describe('wrong tagTypes log errors', () => { - const baseQuery = jest.fn() + const baseQuery = vi.fn() const api = createApi({ baseQuery, tagTypes: ['User'], @@ -319,7 +320,7 @@ describe('endpoint definition typings', () => { }) describe('enhancing endpoint definitions', () => { - const baseQuery = jest.fn((x: string) => ({ data: 'success' })) + const baseQuery = vi.fn((x: string) => ({ data: 'success' })) const commonBaseQueryApi = { dispatch: expect.any(Function), endpoint: expect.any(String), @@ -864,7 +865,7 @@ describe('custom serializeQueryArgs per endpoint', () => { type SuccessResponse = { value: 'success' } - const serializer1 = jest.fn(customArgsSerializer) + const serializer1 = vi.fn(customArgsSerializer) interface MyApiClient { fetchPost: (id: string) => Promise @@ -971,7 +972,7 @@ describe('custom serializeQueryArgs per endpoint', () => { ).toBeTruthy() }) - const serializer2 = jest.fn(customArgsSerializer) + const serializer2 = vi.fn(customArgsSerializer) const injectedApi = api.injectEndpoints({ endpoints: (build) => ({ diff --git a/packages/toolkit/src/query/tests/devWarnings.test.tsx b/packages/toolkit/src/query/tests/devWarnings.test.tsx index ce50aa9080..404adf635d 100644 --- a/packages/toolkit/src/query/tests/devWarnings.test.tsx +++ b/packages/toolkit/src/query/tests/devWarnings.test.tsx @@ -6,7 +6,7 @@ import { } from 'console-testing-library/pure' import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query' -let restore: () => void +let restore: () => void = () => {} let nodeEnv: string beforeEach(() => { diff --git a/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx b/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx index eab78bd59b..91044869ac 100644 --- a/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx +++ b/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import { createSlice } from '@reduxjs/toolkit' import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query' import { setupApiStore, waitMs } from './helpers' @@ -18,7 +19,7 @@ const defaultHeaders: Record = { const baseUrl = 'https://example.com' // @ts-ignore -const fetchFn = jest.fn, any[]>(global.fetch) +const fetchFn = vi.fn, any[]>(global.fetch) const baseQuery = fetchBaseQuery({ baseUrl, @@ -983,7 +984,7 @@ describe('fetchFn', () => { clone: () => fakeResponse, } - const spiedFetch = jest.spyOn(window, 'fetch') + const spiedFetch = vi.spyOn(window, 'fetch') spiedFetch.mockResolvedValueOnce(fakeResponse as any) const { data } = await baseQuery({ url: '/echo' }, commonBaseQueryApi, {}) diff --git a/packages/toolkit/src/query/tests/helpers.tsx b/packages/toolkit/src/query/tests/helpers.tsx index faad21e41b..f6d1f34c68 100644 --- a/packages/toolkit/src/query/tests/helpers.tsx +++ b/packages/toolkit/src/query/tests/helpers.tsx @@ -1,13 +1,14 @@ +import React, { useCallback } from 'react' import type { AnyAction, EnhancedStore, Middleware, Store, + Reducer, } from '@reduxjs/toolkit' import { configureStore } from '@reduxjs/toolkit' import { setupListeners } from '@reduxjs/toolkit/query' -import type { Reducer } from 'react' -import React, { useCallback } from 'react' + import { Provider } from 'react-redux' import { @@ -57,11 +58,29 @@ export const hookWaitFor = async (cb: () => void, time = 2000) => { if (Date.now() > startedAt + time) { throw e } - await act(() => waitMs(2)) + await act(async () => { + await waitMs(2) + }) + } + } +} +export const fakeTimerWaitFor = async (cb: () => void, time = 2000) => { + const startedAt = Date.now() + + while (true) { + try { + cb() + return true + } catch (e) { + if (Date.now() > startedAt + time) { + throw e + } + await act(async () => { + await vi.advanceTimersByTimeAsync(2) + }) } } } -export const fakeTimerWaitFor = hookWaitFor export const useRenderCounter = () => { const countRef = React.useRef(0) diff --git a/packages/toolkit/src/query/tests/optimisticUpdates.test.tsx b/packages/toolkit/src/query/tests/optimisticUpdates.test.tsx index 65237090da..51ee44fb44 100644 --- a/packages/toolkit/src/query/tests/optimisticUpdates.test.tsx +++ b/packages/toolkit/src/query/tests/optimisticUpdates.test.tsx @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import { createApi } from '@reduxjs/toolkit/query/react' import { actionsReducer, hookWaitFor, setupApiStore, waitMs } from './helpers' import { renderHook, act } from '@testing-library/react' @@ -8,7 +9,7 @@ interface Post { contents: string } -const baseQuery = jest.fn() +const baseQuery = vi.fn() beforeEach(() => baseQuery.mockReset()) const api = createApi({ @@ -50,9 +51,9 @@ const storeRef = setupApiStore(api, { }) describe('basic lifecycle', () => { - let onStart = jest.fn(), - onError = jest.fn(), - onSuccess = jest.fn() + let onStart = vi.fn(), + onError = vi.fn(), + onSuccess = vi.fn() const extendedApi = api.injectEndpoints({ endpoints: (build) => ({ @@ -109,14 +110,13 @@ describe('basic lifecycle', () => { } ) - baseQuery.mockRejectedValue('error') - + baseQuery.mockRejectedValueOnce('error') expect(onStart).not.toHaveBeenCalled() expect(baseQuery).not.toHaveBeenCalled() + act(() => void result.current[0]('arg')) expect(onStart).toHaveBeenCalledWith('arg') expect(baseQuery).toHaveBeenCalledWith('arg', expect.any(Object), undefined) - expect(onError).not.toHaveBeenCalled() expect(onSuccess).not.toHaveBeenCalled() await act(() => waitMs(5)) diff --git a/packages/toolkit/src/query/tests/optimisticUpserts.test.tsx b/packages/toolkit/src/query/tests/optimisticUpserts.test.tsx index c901202696..1d67f0f1a0 100644 --- a/packages/toolkit/src/query/tests/optimisticUpserts.test.tsx +++ b/packages/toolkit/src/query/tests/optimisticUpserts.test.tsx @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import { createApi } from '@reduxjs/toolkit/query/react' import { actionsReducer, hookWaitFor, setupApiStore, waitMs } from './helpers' import { skipToken } from '../core/buildSelectors' @@ -10,7 +11,7 @@ interface Post { contents: string } -const baseQuery = jest.fn() +const baseQuery = vi.fn() beforeEach(() => baseQuery.mockReset()) const api = createApi({ @@ -67,9 +68,9 @@ const storeRef = setupApiStore(api, { }) describe('basic lifecycle', () => { - let onStart = jest.fn(), - onError = jest.fn(), - onSuccess = jest.fn() + let onStart = vi.fn(), + onError = vi.fn(), + onSuccess = vi.fn() const extendedApi = api.injectEndpoints({ endpoints: (build) => ({ @@ -161,7 +162,7 @@ describe('basic lifecycle', () => { } ) - baseQuery.mockRejectedValue('error') + baseQuery.mockRejectedValueOnce('error') expect(onStart).not.toHaveBeenCalled() expect(baseQuery).not.toHaveBeenCalled() @@ -295,7 +296,7 @@ describe('upsertQueryData', () => { expect(state.data).toEqual(fetchedData) }) test('upsert while a normal query is running (rejected)', async () => { - baseQuery.mockImplementation(async () => { + baseQuery.mockImplementationOnce(async () => { await delay(20) // eslint-disable-next-line no-throw-literal throw 'Error!' diff --git a/packages/toolkit/src/query/tests/polling.test.tsx b/packages/toolkit/src/query/tests/polling.test.tsx index 357575b0da..7443d94048 100644 --- a/packages/toolkit/src/query/tests/polling.test.tsx +++ b/packages/toolkit/src/query/tests/polling.test.tsx @@ -1,8 +1,9 @@ +import { vi } from 'vitest' import { createApi } from '@reduxjs/toolkit/query' import { setupApiStore, waitMs } from './helpers' import { delay } from '../../utils' -const mockBaseQuery = jest +const mockBaseQuery = vi .fn() .mockImplementation((args: any) => ({ data: args })) diff --git a/packages/toolkit/src/query/tests/queryFn.test.tsx b/packages/toolkit/src/query/tests/queryFn.test.tsx index 1562153aff..daf751c6a3 100644 --- a/packages/toolkit/src/query/tests/queryFn.test.tsx +++ b/packages/toolkit/src/query/tests/queryFn.test.tsx @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import type { SerializedError } from '@reduxjs/toolkit' import { configureStore } from '@reduxjs/toolkit' import type { BaseQueryFn, FetchBaseQueryError } from '@reduxjs/toolkit/query' @@ -9,9 +10,11 @@ import type { QuerySubState } from '@reduxjs/toolkit/dist/query/core/apiState' describe('queryFn base implementation tests', () => { const baseQuery: BaseQueryFn = - jest.fn((arg: string) => arg.includes('withErrorQuery') - ? ({ error: `cut${arg}` }) - : ({ data: { wrappedByBaseQuery: arg } })) + vi.fn((arg: string) => + arg.includes('withErrorQuery') + ? { error: `cut${arg}` } + : { data: { wrappedByBaseQuery: arg } } + ) const api = createApi({ baseQuery, @@ -308,11 +311,11 @@ describe('usage scenario tests', () => { exists: () => true, data: () => mockData, } - const get = jest.fn(() => Promise.resolve(mockDocResult)) - const doc = jest.fn((name) => ({ + const get = vi.fn(() => Promise.resolve(mockDocResult)) + const doc = vi.fn((name) => ({ get, })) - const collection = jest.fn((name) => ({ get, doc })) + const collection = vi.fn((name) => ({ get, doc })) const firestore = () => { return { collection, doc } } diff --git a/packages/toolkit/src/query/tests/queryLifecycle.test.tsx b/packages/toolkit/src/query/tests/queryLifecycle.test.tsx index 8bf191943e..d3099799b8 100644 --- a/packages/toolkit/src/query/tests/queryLifecycle.test.tsx +++ b/packages/toolkit/src/query/tests/queryLifecycle.test.tsx @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import { createApi } from '@reduxjs/toolkit/query' import { waitFor } from '@testing-library/react' import type { @@ -15,9 +16,9 @@ const api = createApi({ }) const storeRef = setupApiStore(api) -const onStart = jest.fn() -const onSuccess = jest.fn() -const onError = jest.fn() +const onStart = vi.fn() +const onSuccess = vi.fn() +const onError = vi.fn() beforeEach(() => { onStart.mockClear() @@ -113,7 +114,7 @@ describe.each([['query'], ['mutation']] as const)( ) test('query: getCacheEntry (success)', async () => { - const snapshot = jest.fn() + const snapshot = vi.fn() const extended = api.injectEndpoints({ overrideExisting: true, endpoints: (build) => ({ @@ -174,7 +175,7 @@ test('query: getCacheEntry (success)', async () => { }) test('query: getCacheEntry (error)', async () => { - const snapshot = jest.fn() + const snapshot = vi.fn() const extended = api.injectEndpoints({ overrideExisting: true, endpoints: (build) => ({ @@ -234,7 +235,7 @@ test('query: getCacheEntry (error)', async () => { }) test('mutation: getCacheEntry (success)', async () => { - const snapshot = jest.fn() + const snapshot = vi.fn() const extended = api.injectEndpoints({ overrideExisting: true, endpoints: (build) => ({ @@ -291,7 +292,7 @@ test('mutation: getCacheEntry (success)', async () => { }) test('mutation: getCacheEntry (error)', async () => { - const snapshot = jest.fn() + const snapshot = vi.fn() const extended = api.injectEndpoints({ overrideExisting: true, endpoints: (build) => ({ @@ -347,7 +348,7 @@ test('mutation: getCacheEntry (error)', async () => { }) test('query: updateCachedData', async () => { - const trackCalls = jest.fn() + const trackCalls = vi.fn() const extended = api.injectEndpoints({ overrideExisting: true, diff --git a/packages/toolkit/src/query/tests/refetchingBehaviors.test.tsx b/packages/toolkit/src/query/tests/refetchingBehaviors.test.tsx index d531ae7b4e..cd2dd45c6f 100644 --- a/packages/toolkit/src/query/tests/refetchingBehaviors.test.tsx +++ b/packages/toolkit/src/query/tests/refetchingBehaviors.test.tsx @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import * as React from 'react' import { createApi, setupListeners } from '@reduxjs/toolkit/query/react' import { act, fireEvent, render, waitFor, screen } from '@testing-library/react' @@ -372,11 +373,11 @@ describe('customListenersHandler', () => { }) test('setupListeners accepts a custom callback and executes it', async () => { - const consoleSpy = jest.spyOn(console, 'log') - consoleSpy.mockImplementation((...args) => { + const consoleSpy = vi.spyOn(console, 'log') + consoleSpy.mockImplementation((...args: any[]) => { // console.info(...args) }) - const dispatchSpy = jest.spyOn(storeRef.store, 'dispatch') + const dispatchSpy = vi.spyOn(storeRef.store, 'dispatch') let unsubscribe = () => {} unsubscribe = setupListeners( diff --git a/packages/toolkit/src/query/tests/retry.test.ts b/packages/toolkit/src/query/tests/retry.test.ts index 05e1fa7b83..2bb35e89ae 100644 --- a/packages/toolkit/src/query/tests/retry.test.ts +++ b/packages/toolkit/src/query/tests/retry.test.ts @@ -1,26 +1,29 @@ +import { vi } from 'vitest' import type { BaseQueryFn } from '@reduxjs/toolkit/query' import { createApi, retry } from '@reduxjs/toolkit/query' import { setupApiStore, waitMs } from './helpers' import type { RetryOptions } from '../retry' beforeEach(() => { - jest.useFakeTimers('legacy') + vi.useFakeTimers() }) const loopTimers = async (max: number = 12) => { let count = 0 while (count < max) { - await waitMs(1) - jest.advanceTimersByTime(120000) + await vi.advanceTimersByTimeAsync(1) + vi.advanceTimersByTime(120000) count++ } } +vi.fn() + describe('configuration', () => { test('retrying without any config options', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -45,9 +48,9 @@ describe('configuration', () => { }) test('retrying with baseQuery config that overrides default behavior (maxRetries: 5)', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -72,9 +75,9 @@ describe('configuration', () => { }) test('retrying with endpoint config that overrides baseQuery config', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -111,9 +114,9 @@ describe('configuration', () => { }) test('stops retrying a query after a success', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery .mockResolvedValueOnce({ error: 'rejected' }) @@ -141,9 +144,9 @@ describe('configuration', () => { }) test('retrying also works with mutations', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -169,9 +172,9 @@ describe('configuration', () => { }) test('retrying stops after a success from a mutation', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery .mockRejectedValueOnce(new Error('rejected')) @@ -199,9 +202,9 @@ describe('configuration', () => { expect(baseBaseQuery).toHaveBeenCalledTimes(3) }) test('non-error-cases should **not** retry', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ data: { success: true } }) @@ -228,9 +231,9 @@ describe('configuration', () => { test('calling retry.fail(error) will skip retrying and expose the error directly', async () => { const error = { message: 'banana' } - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockImplementation((input) => { retry.fail(error) @@ -276,9 +279,9 @@ describe('configuration', () => { * Note: * This will retry 16 total times because we try the initial + 3 retries (sum: 4), then retry that process 3 times (starting at 0 for a total of 4)... 4x4=16 (allegedly) */ - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -306,9 +309,9 @@ describe('configuration', () => { }) test('accepts a custom backoff fn', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -342,9 +345,9 @@ describe('configuration', () => { }) test('accepts a custom retryCondition fn', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -373,9 +376,9 @@ describe('configuration', () => { }) test('retryCondition with endpoint config that overrides baseQuery config', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -405,9 +408,9 @@ describe('configuration', () => { }) test('retryCondition also works with mutations', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery @@ -440,9 +443,9 @@ describe('configuration', () => { }) test('Specifying maxRetries as 0 in RetryOptions prevents retries', async () => { - const baseBaseQuery = jest.fn< - ReturnType, - Parameters + const baseBaseQuery = vi.fn< + Parameters, + ReturnType >() baseBaseQuery.mockResolvedValue({ error: 'rejected' }) @@ -464,7 +467,7 @@ describe('configuration', () => { await loopTimers(2) expect(baseBaseQuery).toHaveBeenCalledTimes(1) - }); + }) test.skip('RetryOptions only accepts one of maxRetries or retryCondition', () => { // @ts-expect-error Should complain if both exist at once diff --git a/packages/toolkit/src/query/tests/utils.test.ts b/packages/toolkit/src/query/tests/utils.test.ts index 25bec07f0b..1124f0294b 100644 --- a/packages/toolkit/src/query/tests/utils.test.ts +++ b/packages/toolkit/src/query/tests/utils.test.ts @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import { isOnline, isDocumentVisible, @@ -6,68 +7,68 @@ import { } from '@internal/query/utils' afterAll(() => { - jest.restoreAllMocks() + vi.restoreAllMocks() }) describe('isOnline', () => { test('Assumes online=true in a node env', () => { - jest - .spyOn(window, 'navigator', 'get') - .mockImplementation(() => undefined as any) + vi.spyOn(window, 'navigator', 'get').mockImplementation( + () => undefined as any + ) expect(navigator).toBeUndefined() expect(isOnline()).toBe(true) }) test('Returns false if navigator isOnline=false', () => { - jest - .spyOn(window, 'navigator', 'get') - .mockImplementation(() => ({ onLine: false } as any)) + vi.spyOn(window, 'navigator', 'get').mockImplementation( + () => ({ onLine: false } as any) + ) expect(isOnline()).toBe(false) }) test('Returns true if navigator isOnline=true', () => { - jest - .spyOn(window, 'navigator', 'get') - .mockImplementation(() => ({ onLine: true } as any)) + vi.spyOn(window, 'navigator', 'get').mockImplementation( + () => ({ onLine: true } as any) + ) expect(isOnline()).toBe(true) }) }) describe('isDocumentVisible', () => { test('Assumes true when in a non-browser env', () => { - jest - .spyOn(window, 'document', 'get') - .mockImplementation(() => undefined as any) + vi.spyOn(window, 'document', 'get').mockImplementation( + () => undefined as any + ) expect(window.document).toBeUndefined() expect(isDocumentVisible()).toBe(true) }) test('Returns false when hidden=true', () => { - jest - .spyOn(window, 'document', 'get') - .mockImplementation(() => ({ visibilityState: 'hidden' } as any)) + vi.spyOn(window, 'document', 'get').mockImplementation( + () => ({ visibilityState: 'hidden' } as any) + ) expect(isDocumentVisible()).toBe(false) }) test('Returns true when visibilityState=prerender', () => { - jest - .spyOn(window, 'document', 'get') - .mockImplementation(() => ({ visibilityState: 'prerender' } as any)) + vi.spyOn(window, 'document', 'get').mockImplementation( + () => ({ visibilityState: 'prerender' } as any) + ) expect(document.visibilityState).toBe('prerender') expect(isDocumentVisible()).toBe(true) }) test('Returns true when visibilityState=visible', () => { - jest - .spyOn(window, 'document', 'get') - .mockImplementation(() => ({ visibilityState: 'visible' } as any)) + vi.spyOn(window, 'document', 'get').mockImplementation( + () => ({ visibilityState: 'visible' } as any) + ) expect(document.visibilityState).toBe('visible') expect(isDocumentVisible()).toBe(true) }) test('Returns true when visibilityState=undefined', () => { - jest - .spyOn(window, 'document', 'get') - .mockImplementation(() => ({ visibilityState: undefined } as any)) + vi.spyOn(window, 'document', 'get').mockImplementation( + () => ({ visibilityState: undefined } as any) + ) expect(document.visibilityState).toBeUndefined() expect(isDocumentVisible()).toBe(true) }) diff --git a/packages/toolkit/src/tests/__snapshots__/createAsyncThunk.test.ts.snap b/packages/toolkit/src/tests/__snapshots__/createAsyncThunk.test.ts.snap deleted file mode 100644 index 81895b595e..0000000000 --- a/packages/toolkit/src/tests/__snapshots__/createAsyncThunk.test.ts.snap +++ /dev/null @@ -1,8 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`createAsyncThunk with abortController behaviour with missing AbortController calling \`abort\` on an asyncThunk works with a FallbackAbortController if no global abortController is not available 1`] = ` -"This platform does not implement AbortController. -If you want to use the AbortController to react to \`abort\` events, please consider importing a polyfill like 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only'." -`; - -exports[`non-serializable arguments are ignored by serializableStateInvariantMiddleware 1`] = `""`; diff --git a/packages/toolkit/src/tests/__snapshots__/serializableStateInvariantMiddleware.test.ts.snap b/packages/toolkit/src/tests/__snapshots__/serializableStateInvariantMiddleware.test.ts.snap deleted file mode 100644 index e4db1dd358..0000000000 --- a/packages/toolkit/src/tests/__snapshots__/serializableStateInvariantMiddleware.test.ts.snap +++ /dev/null @@ -1,52 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`serializableStateInvariantMiddleware Should log an error when a non-serializable action is dispatched 1`] = ` -"A non-serializable value was detected in an action, in the path: \`type\`. Value: Symbol(SOME_CONSTANT) -Take a look at the logic that dispatched this action: Object { - \\"type\\": Symbol(SOME_CONSTANT), -} -(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants) -(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)" -`; - -exports[`serializableStateInvariantMiddleware Should log an error when a non-serializable value is in state 1`] = ` -"A non-serializable value was detected in the state, in the path: \`testSlice.a\`. Value: Map {} -Take a look at the reducer(s) handling this action type: TEST_ACTION. -(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)" -`; - -exports[`serializableStateInvariantMiddleware allows ignoring state entirely 1`] = `""`; - -exports[`serializableStateInvariantMiddleware consumer tolerated structures Should log an error when a non-serializable value is nested in state 1`] = ` -"A non-serializable value was detected in the state, in the path: \`testSlice.a.entries\`. Value: [Function entries] -Take a look at the reducer(s) handling this action type: TEST_ACTION. -(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)" -`; - -exports[`serializableStateInvariantMiddleware consumer tolerated structures Should use consumer supplied isSerializable and getEntries options to tolerate certain structures 1`] = ` -"A non-serializable value was detected in the state, in the path: \`testSlice.a.third.bad-map-instance\`. Value: Map {} -Take a look at the reducer(s) handling this action type: TEST_ACTION. -(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)" -`; - -exports[`serializableStateInvariantMiddleware ignored action paths can specify (multiple) different values 1`] = `""`; - -exports[`serializableStateInvariantMiddleware ignored action paths default value can be overridden 1`] = ` -"A non-serializable value was detected in an action, in the path: \`meta.arg\`. Value: Map {} -Take a look at the logic that dispatched this action: Object { - \\"meta\\": Object { - \\"arg\\": Map {}, - }, - \\"type\\": \\"test\\", -} -(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants) -(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)" -`; - -exports[`serializableStateInvariantMiddleware ignored action paths default value: meta.arg 1`] = `""`; - -exports[`serializableStateInvariantMiddleware should not check serializability for ignored slice names 1`] = ` -"A non-serializable value was detected in the state, in the path: \`testSlice.b.d\`. Value: Map {} -Take a look at the reducer(s) handling this action type: TEST_ACTION. -(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)" -`; diff --git a/packages/toolkit/src/tests/configureStore.test.ts b/packages/toolkit/src/tests/configureStore.test.ts index 49831e51e6..9382f2d2bc 100644 --- a/packages/toolkit/src/tests/configureStore.test.ts +++ b/packages/toolkit/src/tests/configureStore.test.ts @@ -1,31 +1,81 @@ +import { vi } from 'vitest' import type { StoreEnhancer, StoreEnhancerStoreCreator } from '@reduxjs/toolkit' -import { configureStore } from '@reduxjs/toolkit' -import * as RTK from '@reduxjs/toolkit' -import * as redux from 'redux' -import * as devtools from '@internal/devtoolsExtension' +import type * as Redux from 'redux' +import type * as DevTools from '@internal/devtoolsExtension' -describe('configureStore', () => { - jest.spyOn(redux, 'applyMiddleware') - jest.spyOn(redux, 'combineReducers') - jest.spyOn(redux, 'compose') - jest.spyOn(redux, 'createStore') - jest.spyOn(devtools, 'composeWithDevTools') // @remap-prod-remove-line +vi.doMock('redux', async () => { + const redux: any = await vi.importActual('redux') - const reducer: redux.Reducer = (state = {}, _action) => state + vi.spyOn(redux, 'applyMiddleware') + vi.spyOn(redux, 'combineReducers') + vi.spyOn(redux, 'compose') + vi.spyOn(redux, 'createStore') - beforeEach(() => jest.clearAllMocks()) + return redux +}) + +vi.doMock('@internal/devtoolsExtension', async () => { + const devtools: typeof DevTools = await vi.importActual( + '@internal/devtoolsExtension' + ) + vi.spyOn(devtools, 'composeWithDevTools') // @remap-prod-remove-line + return devtools +}) + +function originalReduxCompose(...funcs: Function[]) { + if (funcs.length === 0) { + // infer the argument type so it is usable in inference down the line + return (arg: T) => arg + } + + if (funcs.length === 1) { + return funcs[0] + } + + return funcs.reduce( + (a, b) => + (...args: any) => + a(b(...args)) + ) +} + +function originalComposeWithDevtools() { + if (arguments.length === 0) return undefined + if (typeof arguments[0] === 'object') return originalReduxCompose + return originalReduxCompose.apply(null, arguments as any as Function[]) +} + +describe('configureStore', async () => { + // RTK's internal `composeWithDevtools` function isn't publicly exported, + // so we can't mock it. However, it _does_ try to access the global extension method + // attached to `window`. So, if we mock _that_, we'll know if the enhancer ran. + const mockDevtoolsCompose = vi + .fn() + .mockImplementation(originalComposeWithDevtools) + ;(window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ = mockDevtoolsCompose + + const redux = await import('redux') + + const { configureStore } = await import('@reduxjs/toolkit') + + const reducer: Redux.Reducer = (state = {}, _action) => state + + beforeEach(() => { + vi.clearAllMocks() + }) describe('given a function reducer', () => { it('calls createStore with the reducer', () => { configureStore({ reducer }) expect(configureStore({ reducer })).toBeInstanceOf(Object) - expect(redux.applyMiddleware).toHaveBeenCalled() - expect(devtools.composeWithDevTools).toHaveBeenCalled() // @remap-prod-remove-line + expect(redux.createStore).toHaveBeenCalledWith( reducer, undefined, expect.any(Function) ) + expect(redux.applyMiddleware).toHaveBeenCalled() + expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line }) }) @@ -39,7 +89,7 @@ describe('configureStore', () => { expect(configureStore({ reducer })).toBeInstanceOf(Object) expect(redux.combineReducers).toHaveBeenCalledWith(reducer) expect(redux.applyMiddleware).toHaveBeenCalled() - expect(devtools.composeWithDevTools).toHaveBeenCalled() // @remap-prod-remove-line-line + expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line-line expect(redux.createStore).toHaveBeenCalledWith( expect.any(Function), undefined, @@ -60,7 +110,7 @@ describe('configureStore', () => { it('calls createStore without any middleware', () => { expect(configureStore({ middleware: [], reducer })).toBeInstanceOf(Object) expect(redux.applyMiddleware).toHaveBeenCalledWith() - expect(devtools.composeWithDevTools).toHaveBeenCalled() // @remap-prod-remove-line-line + expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line-line expect(redux.createStore).toHaveBeenCalledWith( reducer, undefined, @@ -79,7 +129,7 @@ describe('configureStore', () => { expect.any(Function), // immutableCheck expect.any(Function) // serializableCheck ) - expect(devtools.composeWithDevTools).toHaveBeenCalled() // @remap-prod-remove-line-line + expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line-line expect(redux.createStore).toHaveBeenCalledWith( reducer, undefined, @@ -90,7 +140,7 @@ describe('configureStore', () => { describe('given a middleware creation function that returns undefined', () => { it('throws an error', () => { - const invalidBuilder = jest.fn((getDefaultMiddleware) => undefined as any) + const invalidBuilder = vi.fn((getDefaultMiddleware) => undefined as any) expect(() => configureStore({ middleware: invalidBuilder, reducer }) ).toThrow( @@ -101,7 +151,7 @@ describe('configureStore', () => { describe('given a middleware creation function that returns an array with non-functions', () => { it('throws an error', () => { - const invalidBuilder = jest.fn((getDefaultMiddleware) => [true] as any) + const invalidBuilder = vi.fn((getDefaultMiddleware) => [true] as any) expect(() => configureStore({ middleware: invalidBuilder, reducer }) ).toThrow('each middleware provided to configureStore must be a function') @@ -118,13 +168,13 @@ describe('configureStore', () => { describe('given custom middleware', () => { it('calls createStore with custom middleware and without default middleware', () => { - const thank: redux.Middleware = (_store) => (next) => (action) => + const thank: Redux.Middleware = (_store) => (next) => (action) => next(action) expect(configureStore({ middleware: [thank], reducer })).toBeInstanceOf( Object ) expect(redux.applyMiddleware).toHaveBeenCalledWith(thank) - expect(devtools.composeWithDevTools).toHaveBeenCalled() // @remap-prod-remove-line-line + expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line-line expect(redux.createStore).toHaveBeenCalledWith( reducer, undefined, @@ -135,11 +185,11 @@ describe('configureStore', () => { describe('middleware builder notation', () => { it('calls builder, passes getDefaultMiddleware and uses returned middlewares', () => { - const thank = jest.fn( - ((_store) => (next) => (action) => 'foobar') as redux.Middleware + const thank = vi.fn( + ((_store) => (next) => (action) => 'foobar') as Redux.Middleware ) - const builder = jest.fn((getDefaultMiddleware) => { + const builder = vi.fn((getDefaultMiddleware) => { expect(getDefaultMiddleware).toEqual(expect.any(Function)) expect(getDefaultMiddleware()).toEqual(expect.any(Array)) @@ -179,7 +229,7 @@ describe('configureStore', () => { Object ) expect(redux.applyMiddleware).toHaveBeenCalled() - expect(devtools.composeWithDevTools).toHaveBeenCalledWith(options) // @remap-prod-remove-line + expect(mockDevtoolsCompose).toHaveBeenCalledWith(options) // @remap-prod-remove-line expect(redux.createStore).toHaveBeenCalledWith( reducer, undefined, @@ -192,7 +242,7 @@ describe('configureStore', () => { it('calls createStore with preloadedState', () => { expect(configureStore({ reducer })).toBeInstanceOf(Object) expect(redux.applyMiddleware).toHaveBeenCalled() - expect(devtools.composeWithDevTools).toHaveBeenCalled() // @remap-prod-remove-line + expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line expect(redux.createStore).toHaveBeenCalledWith( reducer, undefined, @@ -203,12 +253,12 @@ describe('configureStore', () => { describe('given enhancers', () => { it('calls createStore with enhancers', () => { - const enhancer: redux.StoreEnhancer = (next) => next + const enhancer: Redux.StoreEnhancer = (next) => next expect(configureStore({ enhancers: [enhancer], reducer })).toBeInstanceOf( Object ) expect(redux.applyMiddleware).toHaveBeenCalled() - expect(devtools.composeWithDevTools).toHaveBeenCalled() // @remap-prod-remove-line + expect(mockDevtoolsCompose).toHaveBeenCalled() // @remap-prod-remove-line expect(redux.createStore).toHaveBeenCalledWith( reducer, undefined, diff --git a/packages/toolkit/src/tests/createAsyncThunk.test.ts b/packages/toolkit/src/tests/createAsyncThunk.test.ts index 26550c93b4..8208d8693e 100644 --- a/packages/toolkit/src/tests/createAsyncThunk.test.ts +++ b/packages/toolkit/src/tests/createAsyncThunk.test.ts @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import type { AnyAction } from '@reduxjs/toolkit' import { createAsyncThunk, @@ -58,7 +59,7 @@ describe('createAsyncThunk', () => { }) it('accepts arguments and dispatches the actions on resolve', async () => { - const dispatch = jest.fn() + const dispatch = vi.fn() let passedArg: any @@ -98,7 +99,7 @@ describe('createAsyncThunk', () => { }) it('accepts arguments and dispatches the actions on reject', async () => { - const dispatch = jest.fn() + const dispatch = vi.fn() const args = 123 let generatedRequestId = '' @@ -134,7 +135,7 @@ describe('createAsyncThunk', () => { }) it('dispatches an empty error when throwing a random object without serializedError properties', async () => { - const dispatch = jest.fn() + const dispatch = vi.fn() const args = 123 let generatedRequestId = '' @@ -169,7 +170,7 @@ describe('createAsyncThunk', () => { }) it('dispatches an action with a formatted error when throwing an object with known error keys', async () => { - const dispatch = jest.fn() + const dispatch = vi.fn() const args = 123 let generatedRequestId = '' @@ -210,7 +211,7 @@ describe('createAsyncThunk', () => { }) it('dispatches a rejected action with a customized payload when a user returns rejectWithValue()', async () => { - const dispatch = jest.fn() + const dispatch = vi.fn() const args = 123 let generatedRequestId = '' @@ -255,7 +256,7 @@ describe('createAsyncThunk', () => { }) it('dispatches a rejected action with a customized payload when a user throws rejectWithValue()', async () => { - const dispatch = jest.fn() + const dispatch = vi.fn() const args = 123 let generatedRequestId = '' @@ -300,7 +301,7 @@ describe('createAsyncThunk', () => { }) it('dispatches a rejected action with a miniSerializeError when rejectWithValue conditions are not satisfied', async () => { - const dispatch = jest.fn() + const dispatch = vi.fn() const args = 123 let generatedRequestId = '' @@ -484,14 +485,14 @@ describe('createAsyncThunk with abortController', () => { describe('behaviour with missing AbortController', () => { let keepAbortController: typeof window['AbortController'] let freshlyLoadedModule: typeof import('../createAsyncThunk') - let restore: () => void + let restore: () => void = () => {} let nodeEnv: string - beforeEach(() => { + beforeEach(async () => { keepAbortController = window.AbortController delete (window as any).AbortController - jest.resetModules() - freshlyLoadedModule = require('../createAsyncThunk') + vi.resetModules() + freshlyLoadedModule = await import('../createAsyncThunk') restore = mockConsole(createConsole()) nodeEnv = process.env.NODE_ENV! ;(process.env as any).NODE_ENV = 'development' @@ -501,7 +502,7 @@ describe('createAsyncThunk with abortController', () => { ;(process.env as any).NODE_ENV = nodeEnv restore() window.AbortController = keepAbortController - jest.resetModules() + vi.resetModules() }) test('calling `abort` on an asyncThunk works with a FallbackAbortController if no global abortController is not available', async () => { @@ -539,10 +540,10 @@ test('non-serializable arguments are ignored by serializableStateInvariantMiddle describe('conditional skipping of asyncThunks', () => { const arg = {} - const getState = jest.fn(() => ({})) - const dispatch = jest.fn((x: any) => x) - const payloadCreator = jest.fn((x: typeof arg) => 10) - const condition = jest.fn(() => false) + const getState = vi.fn(() => ({})) + const dispatch = vi.fn((x: any) => x) + const payloadCreator = vi.fn((x: typeof arg) => 10) + const condition = vi.fn(() => false) const extra = {} beforeEach(() => { @@ -645,7 +646,7 @@ describe('conditional skipping of asyncThunks', () => { }) test('does not fail when attempting to abort a canceled promise', async () => { - const asyncPayloadCreator = jest.fn(async (x: typeof arg) => { + const asyncPayloadCreator = vi.fn(async (x: typeof arg) => { await delay(200) return 10 }) @@ -720,8 +721,8 @@ test('serializeError implementation', async () => { }) describe('unwrapResult', () => { - const getState = jest.fn(() => ({})) - const dispatch = jest.fn((x: any) => x) + const getState = vi.fn(() => ({})) + const dispatch = vi.fn((x: any) => x) const extra = {} test('fulfilled case', async () => { const asyncThunk = createAsyncThunk('test', () => { @@ -779,7 +780,7 @@ describe('idGenerator option', () => { test('idGenerator implementation - can customizes how request IDs are generated', async () => { function makeFakeIdGenerator() { let id = 0 - return jest.fn(() => { + return vi.fn(() => { id++ return `fake-random-id-${id}` }) @@ -833,7 +834,7 @@ describe('idGenerator option', () => { }) test('idGenerator should be called with thunkArg', async () => { - const customIdGenerator = jest.fn((seed) => `fake-unique-random-id-${seed}`) + const customIdGenerator = vi.fn((seed) => `fake-unique-random-id-${seed}`) let generatedRequestId = '' const asyncThunk = createAsyncThunk( 'test', @@ -855,7 +856,7 @@ describe('idGenerator option', () => { test('`condition` will see state changes from a synchronously invoked asyncThunk', () => { type State = ReturnType - const onStart = jest.fn() + const onStart = vi.fn() const asyncThunk = createAsyncThunk< void, { force?: boolean }, diff --git a/packages/toolkit/src/tests/createReducer.test.ts b/packages/toolkit/src/tests/createReducer.test.ts index 078f26618c..243cecf943 100644 --- a/packages/toolkit/src/tests/createReducer.test.ts +++ b/packages/toolkit/src/tests/createReducer.test.ts @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import type { CaseReducer, PayloadAction, @@ -72,15 +73,15 @@ describe('createReducer', () => { let originalNodeEnv = process.env.NODE_ENV beforeEach(() => { - jest.resetModules() + vi.resetModules() }) afterEach(() => { process.env.NODE_ENV = originalNodeEnv }) - it('Throws an error if the legacy object notation is used', () => { - const { createReducer } = require('../createReducer') + it('Throws an error if the legacy object notation is used', async () => { + const { createReducer } = await import('../createReducer') const wrapper = () => { // @ts-ignore let dummyReducer = (createReducer as CreateReducer)([] as TodoState, {}) @@ -95,9 +96,9 @@ describe('createReducer', () => { ) }) - it('Crashes in production', () => { + it('Crashes in production', async () => { process.env.NODE_ENV = 'production' - const { createReducer } = require('../createReducer') + const { createReducer } = await import('../createReducer') const wrapper = () => { // @ts-ignore let dummyReducer = (createReducer as CreateReducer)([] as TodoState, {}) @@ -111,7 +112,7 @@ describe('createReducer', () => { let originalNodeEnv = process.env.NODE_ENV beforeEach(() => { - jest.resetModules() + vi.resetModules() process.env.NODE_ENV = 'production' }) @@ -119,9 +120,8 @@ describe('createReducer', () => { process.env.NODE_ENV = originalNodeEnv }) - test('Freezes data in production', () => { - const createReducer: CreateReducer = - require('../createReducer').createReducer + test('Freezes data in production', async () => { + const { createReducer } = await import('../createReducer') const addTodo: AddTodoReducer = (state, action) => { const { newTodo } = action.payload state.push({ ...newTodo, completed: false }) @@ -212,7 +212,7 @@ describe('createReducer', () => { behavesLikeReducer(todosReducer) it('Should only call the init function when `undefined` state is passed in', () => { - const spy = jest.fn().mockReturnValue(42) + const spy = vi.fn().mockReturnValue(42) const dummyReducer = createReducer(spy, () => {}) expect(spy).not.toHaveBeenCalled() diff --git a/packages/toolkit/src/tests/createSlice.test.ts b/packages/toolkit/src/tests/createSlice.test.ts index 8cbe39340a..38038dbefc 100644 --- a/packages/toolkit/src/tests/createSlice.test.ts +++ b/packages/toolkit/src/tests/createSlice.test.ts @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import type { PayloadAction } from '@reduxjs/toolkit' import { createSlice, createAction } from '@reduxjs/toolkit' import { @@ -280,7 +281,7 @@ describe('createSlice', () => { describe('behaviour with enhanced case reducers', () => { it('should pass all arguments to the prepare function', () => { - const prepare = jest.fn((payload, somethingElse) => ({ payload })) + const prepare = vi.fn((payload, somethingElse) => ({ payload })) const testSlice = createSlice({ name: 'test', @@ -301,7 +302,7 @@ describe('createSlice', () => { }) it('should call the reducer function', () => { - const reducer = jest.fn(() => 5) + const reducer = vi.fn(() => 5) const testSlice = createSlice({ name: 'test', @@ -380,7 +381,7 @@ describe('createSlice', () => { let originalNodeEnv = process.env.NODE_ENV beforeEach(() => { - jest.resetModules() + vi.resetModules() restore = mockConsole(createConsole()) }) @@ -389,8 +390,8 @@ describe('createSlice', () => { }) // NOTE: This needs to be in front of the later `createReducer` call to check the one-time warning - it('Throws an error if the legacy object notation is used', () => { - const { createSlice } = require('../createSlice') + it('Throws an error if the legacy object notation is used', async () => { + const { createSlice } = await import('../createSlice') let dummySlice = (createSlice as CreateSlice)({ name: 'dummy', diff --git a/packages/toolkit/src/tests/getDefaultMiddleware.test.ts b/packages/toolkit/src/tests/getDefaultMiddleware.test.ts index c47e3905cc..4da69101e3 100644 --- a/packages/toolkit/src/tests/getDefaultMiddleware.test.ts +++ b/packages/toolkit/src/tests/getDefaultMiddleware.test.ts @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import type { AnyAction, Middleware, @@ -25,13 +26,13 @@ describe('getDefaultMiddleware', () => { describe('Production behavior', () => { beforeEach(() => { - jest.resetModules() + vi.resetModules() }) - it('returns an array with only redux-thunk in production', () => { + it('returns an array with only redux-thunk in production', async () => { process.env.NODE_ENV = 'production' - const { thunk } = require('redux-thunk') - const { getDefaultMiddleware } = require('@reduxjs/toolkit') + const { thunk } = await import('redux-thunk') + const { getDefaultMiddleware } = await import('@reduxjs/toolkit') const middleware = getDefaultMiddleware() expect(middleware).toContain(thunk) diff --git a/packages/toolkit/src/tests/immutableStateInvariantMiddleware.test.ts b/packages/toolkit/src/tests/immutableStateInvariantMiddleware.test.ts index bc90e4906a..a258de7961 100644 --- a/packages/toolkit/src/tests/immutableStateInvariantMiddleware.test.ts +++ b/packages/toolkit/src/tests/immutableStateInvariantMiddleware.test.ts @@ -10,7 +10,11 @@ import { } from '@reduxjs/toolkit' import { trackForMutations } from '@internal/immutableStateInvariantMiddleware' -import { mockConsole, createConsole, getLog } from 'console-testing-library' +import { + mockConsole, + createConsole, + getLog, +} from 'console-testing-library/pure' describe('createImmutableStateInvariantMiddleware', () => { let state: { foo: { bar: number[]; baz: string } } diff --git a/packages/toolkit/src/tests/matchers.test.ts b/packages/toolkit/src/tests/matchers.test.ts index b9307c97f3..7282c5fa65 100644 --- a/packages/toolkit/src/tests/matchers.test.ts +++ b/packages/toolkit/src/tests/matchers.test.ts @@ -1,3 +1,4 @@ +import { vi } from 'vitest' import type { ThunkAction, AnyAction } from '@reduxjs/toolkit' import { isAllOf, @@ -282,8 +283,8 @@ describe('isRejectedWithValue', () => { ) expect(isRejectedWithValue()(rejectedAction)).toBe(false) - const getState = jest.fn(() => ({})) - const dispatch = jest.fn((x: any) => x) + const getState = vi.fn(() => ({})) + const dispatch = vi.fn((x: any) => x) const extra = {} // note: doesn't throw because we don't unwrap it @@ -321,8 +322,8 @@ describe('isRejectedWithValue', () => { // rejected-with-value is a narrower requirement than rejected expect(matchAC(rejectedAction)).toBe(false) - const getState = jest.fn(() => ({})) - const dispatch = jest.fn((x: any) => x) + const getState = vi.fn(() => ({})) + const dispatch = vi.fn((x: any) => x) const extra = {} // note: doesn't throw because we don't unwrap it diff --git a/packages/toolkit/tsconfig.base.json b/packages/toolkit/tsconfig.base.json index 09cbbdf4b8..e3aeedb31d 100644 --- a/packages/toolkit/tsconfig.base.json +++ b/packages/toolkit/tsconfig.base.json @@ -30,6 +30,7 @@ "allowSyntheticDefaultImports": true, "emitDeclarationOnly": true, "baseUrl": ".", + "types": ["vitest/globals"], "paths": { "@reduxjs/toolkit": ["src/index.ts"], // @remap-prod-remove-line "@reduxjs/toolkit/query": ["src/query/index.ts"], // @remap-prod-remove-line diff --git a/packages/toolkit/vitest.config.ts b/packages/toolkit/vitest.config.ts new file mode 100644 index 0000000000..b010d80498 --- /dev/null +++ b/packages/toolkit/vitest.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['./vitest.setup.js'], + include: ['./src/**/*.(spec|test).[jt]s?(x)'], + alias: { + '@reduxjs/toolkit/query/react': './src/query/react/index.ts', // @remap-prod-remove-line + '@reduxjs/toolkit/query': './src/query/index.ts', // @remap-prod-remove-line + '@reduxjs/toolkit': './src/index.ts', // @remap-prod-remove-line + + // this mapping is disabled as we want `dist` imports in the tests only to be used for "type-only" imports which don't play a role for jest + //'^@reduxjs/toolkit/dist/(.*)$': '/src/*', + '@internal/': './src/', + }, + deps: { + interopDefault: true, + inline: ['redux', '@reduxjs/toolkit'], + }, + }, +}) diff --git a/packages/toolkit/jest.setup.js b/packages/toolkit/vitest.setup.js similarity index 61% rename from packages/toolkit/jest.setup.js rename to packages/toolkit/vitest.setup.js index 14673adc7a..fc4a30240e 100644 --- a/packages/toolkit/jest.setup.js +++ b/packages/toolkit/vitest.setup.js @@ -1,10 +1,11 @@ //@ts-ignore -const nodeFetch = require('node-fetch') +import nodeFetch from 'node-fetch' //@ts-ignore -global.fetch = nodeFetch +globalThis.fetch = nodeFetch //@ts-ignore -global.Request = nodeFetch.Request -const { server } = require('./src/query/tests/mocks/server') +globalThis.Request = nodeFetch.Request +globalThis.Headers = nodeFetch.Headers +import { server } from './src/query/tests/mocks/server' beforeAll(() => server.listen({ onUnhandledRequest: 'error' })) afterEach(() => server.resetHandlers()) diff --git a/yarn.lock b/yarn.lock index 68b2f0be9f..25ae80c928 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1282,7 +1282,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.18.6": +"@babel/plugin-syntax-jsx@npm:^7.18.6, @babel/plugin-syntax-jsx@npm:^7.7.2": version: 7.18.6 resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" dependencies: @@ -5595,17 +5595,6 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^24.9.0": - version: 24.9.0 - resolution: "@jest/console@npm:24.9.0" - dependencies: - "@jest/source-map": ^24.9.0 - chalk: ^2.0.1 - slash: ^2.0.0 - checksum: ee6468c4aeeb8752126e92e20b0ffbf32abda731e9b7865b63b60bd569c3536e9c901efcec4d81c506a7c6fea2a970ace8262190961aba31dedbfeaa3459d78b - languageName: node - linkType: hard - "@jest/console@npm:^27.5.1": version: 27.5.1 resolution: "@jest/console@npm:27.5.1" @@ -5634,6 +5623,20 @@ __metadata: languageName: node linkType: hard +"@jest/console@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/console@npm:29.3.1" + dependencies: + "@jest/types": ^29.3.1 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^29.3.1 + jest-util: ^29.3.1 + slash: ^3.0.0 + checksum: 9eecbfb6df4f5b810374849b7566d321255e6fd6e804546236650384966be532ff75a3e445a3277eadefe67ddf4dc56cd38332abd72d6a450f1bea9866efc6d7 + languageName: node + linkType: hard + "@jest/core@npm:^27.5.1": version: 27.5.1 resolution: "@jest/core@npm:27.5.1" @@ -5675,6 +5678,47 @@ __metadata: languageName: node linkType: hard +"@jest/core@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/core@npm:29.3.1" + 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": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^29.2.0 + jest-config: ^29.3.1 + 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.4 + pretty-format: ^29.3.1 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: e3ac9201e8a084ccd832b17877b56490402b919f227622bb24f9372931e77b869e60959d34144222ce20fb619d0a6a6be20b257adb077a6b0f430a4584a45b0f + languageName: node + linkType: hard + "@jest/environment@npm:^27.5.1": version: 27.5.1 resolution: "@jest/environment@npm:27.5.1" @@ -5687,6 +5731,37 @@ __metadata: languageName: node linkType: hard +"@jest/environment@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/environment@npm:29.3.1" + dependencies: + "@jest/fake-timers": ^29.3.1 + "@jest/types": ^29.3.1 + "@types/node": "*" + jest-mock: ^29.3.1 + checksum: 974102aba7cc80508f787bb5504dcc96e5392e0a7776a63dffbf54ddc2c77d52ef4a3c08ed2eedec91965befff873f70cd7c9ed56f62bb132dcdb821730e6076 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/expect-utils@npm:29.3.1" + dependencies: + jest-get-type: ^29.2.0 + checksum: 7f3b853eb1e4299988f66b9aa49c1aacb7b8da1cf5518dca4ccd966e865947eed8f1bde6c8f5207d8400e9af870112a44b57aa83515ad6ea5e4a04a971863adb + languageName: node + linkType: hard + +"@jest/expect@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/expect@npm:29.3.1" + dependencies: + expect: ^29.3.1 + jest-snapshot: ^29.3.1 + checksum: 1d7b5cc735c8a99bfbed884d80fdb43b23b3456f4ec88c50fd86404b097bb77fba84f44e707fc9b49f106ca1154ae03f7c54dc34754b03f8a54eeb420196e5bf + languageName: node + linkType: hard + "@jest/fake-timers@npm:^27.5.1": version: 27.5.1 resolution: "@jest/fake-timers@npm:27.5.1" @@ -5701,6 +5776,20 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/fake-timers@npm:29.3.1" + dependencies: + "@jest/types": ^29.3.1 + "@sinonjs/fake-timers": ^9.1.2 + "@types/node": "*" + jest-message-util: ^29.3.1 + jest-mock: ^29.3.1 + jest-util: ^29.3.1 + checksum: b1dafa8cdc439ef428cd772c775f0b22703677f52615513eda11a104bbfc352d7ec69b1225db95d4ef2e1b4ef0f23e1a7d96de5313aeb0950f672e6548ae069d + languageName: node + linkType: hard + "@jest/globals@npm:^27.5.1": version: 27.5.1 resolution: "@jest/globals@npm:27.5.1" @@ -5712,6 +5801,18 @@ __metadata: languageName: node linkType: hard +"@jest/globals@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/globals@npm:29.3.1" + dependencies: + "@jest/environment": ^29.3.1 + "@jest/expect": ^29.3.1 + "@jest/types": ^29.3.1 + jest-mock: ^29.3.1 + checksum: 4d2b9458aabf7c28fd167e53984477498c897b64eec67a7f84b8fff465235cae1456ee0721cb0e7943f0cda443c7656adb9801f9f34e27495b8ebbd9f3033100 + languageName: node + linkType: hard + "@jest/reporters@npm:^27.5.1": version: 27.5.1 resolution: "@jest/reporters@npm:27.5.1" @@ -5750,6 +5851,43 @@ __metadata: languageName: node linkType: hard +"@jest/reporters@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/reporters@npm:29.3.1" + 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.15 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^29.3.1 + jest-util: ^29.3.1 + jest-worker: ^29.3.1 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 273e0c6953285f01151e9d84ac1e55744802a1ec79fb62dafeea16a49adfe7b24e7f35bef47a0214e5e057272dbfdacf594208286b7766046fd0f3cfa2043840 + languageName: node + linkType: hard + "@jest/schemas@npm:^28.0.2": version: 28.0.2 resolution: "@jest/schemas@npm:28.0.2" @@ -5759,14 +5897,12 @@ __metadata: languageName: node linkType: hard -"@jest/source-map@npm:^24.9.0": - version: 24.9.0 - resolution: "@jest/source-map@npm:24.9.0" +"@jest/schemas@npm:^29.0.0": + version: 29.0.0 + resolution: "@jest/schemas@npm:29.0.0" dependencies: - callsites: ^3.0.0 - graceful-fs: ^4.1.15 - source-map: ^0.6.0 - checksum: 00479faf6854d5d183b94465db1a0876980ced72bf26cb6a2fe8c04977dc2692e6529faa6b64269492d1d9cab51feebaac9d453d1e6bb1306fc15777143b72af + "@sinclair/typebox": ^0.24.1 + checksum: 41355c78f09eb1097e57a3c5d0ca11c9099e235e01ea5fa4e3953562a79a6a9296c1d300f1ba50ca75236048829e056b00685cd2f1ff8285e56fd2ce01249acb languageName: node linkType: hard @@ -5781,14 +5917,14 @@ __metadata: languageName: node linkType: hard -"@jest/test-result@npm:^24.9.0": - version: 24.9.0 - resolution: "@jest/test-result@npm:24.9.0" +"@jest/source-map@npm:^29.2.0": + version: 29.2.0 + resolution: "@jest/source-map@npm:29.2.0" dependencies: - "@jest/console": ^24.9.0 - "@jest/types": ^24.9.0 - "@types/istanbul-lib-coverage": ^2.0.0 - checksum: 7145c7baa289798881160b3cfa5b2466b2636238a52b77cf46e5468ffe2881fb8fb8d4966155a8d508b26a8d29a302a9eb9037de1a371e5dc9bb6e94837c0ae7 + "@jridgewell/trace-mapping": ^0.3.15 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: 09f76ab63d15dcf44b3035a79412164f43be34ec189575930f1a00c87e36ea0211ebd6a4fbe2253c2516e19b49b131f348ddbb86223ca7b6bbac9a6bc76ec96e languageName: node linkType: hard @@ -5816,6 +5952,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-result@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/test-result@npm:29.3.1" + dependencies: + "@jest/console": ^29.3.1 + "@jest/types": ^29.3.1 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: b24ac283321189b624c372a6369c0674b0ee6d9e3902c213452c6334d037113718156b315364bee8cee0f03419c2bdff5e2c63967193fb422830e79cbb26866a + languageName: node + linkType: hard + "@jest/test-sequencer@npm:^27.5.1": version: 27.5.1 resolution: "@jest/test-sequencer@npm:27.5.1" @@ -5828,6 +5976,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-sequencer@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/test-sequencer@npm:29.3.1" + dependencies: + "@jest/test-result": ^29.3.1 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.3.1 + slash: ^3.0.0 + checksum: a8325b1ea0ce644486fb63bb67cedd3524d04e3d7b1e6c1e3562bf12ef477ecd0cf34044391b2a07d925e1c0c8b4e0f3285035ceca3a474a2c55980f1708caf3 + languageName: node + linkType: hard + "@jest/transform@npm:^26.6.2": version: 26.6.2 resolution: "@jest/transform@npm:26.6.2" @@ -5874,14 +6034,26 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^24.9.0": - version: 24.9.0 - resolution: "@jest/types@npm:24.9.0" +"@jest/transform@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/transform@npm:29.3.1" dependencies: - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^1.1.1 - "@types/yargs": ^13.0.0 - checksum: 603698f774cf22f9d16a0e0fac9e10e7db21052aebfa33db154c8a5940e0eb1fa9c079a8c91681041ad3aeee2adfa950608dd0c663130316ba034b8bca7b301c + "@babel/core": ^7.11.6 + "@jest/types": ^29.3.1 + "@jridgewell/trace-mapping": ^0.3.15 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^2.0.0 + fast-json-stable-stringify: ^2.1.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.3.1 + jest-regex-util: ^29.2.0 + jest-util: ^29.3.1 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.1 + checksum: 673df5900ffc95bc811084e09d6e47948034dea6ab6cc4f81f80977e3a52468a6c2284d0ba9796daf25a62ae50d12f7e97fc9a3a0c587f11f2a479ff5493ca53 languageName: node linkType: hard @@ -5925,6 +6097,20 @@ __metadata: languageName: node linkType: hard +"@jest/types@npm:^29.3.1": + version: 29.3.1 + resolution: "@jest/types@npm:29.3.1" + dependencies: + "@jest/schemas": ^29.0.0 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: 6f9faf27507b845ff3839c1adc6dbd038d7046d03d37e84c9fc956f60718711a801a5094c7eeee6b39ccf42c0ab61347fdc0fa49ab493ae5a8efd2fd41228ee8 + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.1.0": version: 0.1.1 resolution: "@jridgewell/gen-mapping@npm:0.1.1" @@ -5991,7 +6177,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.14": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.15": version: 0.3.17 resolution: "@jridgewell/trace-mapping@npm:0.3.17" dependencies: @@ -6572,7 +6758,7 @@ __metadata: "@typescript-eslint/eslint-plugin": ^4.22.0 "@typescript-eslint/parser": ^4.22.0 axios: ^0.19.2 - console-testing-library: ^0.3.1 + console-testing-library: 0.6.1 convert-source-map: ^1.7.0 esbuild: ~0.17 eslint: ^7.25.0 @@ -6587,7 +6773,7 @@ __metadata: fs-extra: ^9.1.0 immer: ^9.0.16 invariant: ^2.2.4 - jest: ^27 + jsdom: ^21.0.0 json-stringify-safe: ^5.0.1 magic-string: ^0.25.7 merge-source-map: ^1.1.0 @@ -6604,10 +6790,10 @@ __metadata: size-limit: ^4.11.0 source-map: ^0.7.3 terser: ^5.6.1 - ts-jest: ^27 tslib: ^1.10.0 tsx: ^3.12.2 typescript: ~4.9 + vitest: ^0.27.2 yargs: ^15.3.1 peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 @@ -6741,14 +6927,14 @@ __metadata: esbuild: ~0.17 esbuild-runner: ^2.2.1 husky: ^4.3.6 - jest: ^27 + jest: ^29 msw: ^0.40.2 openapi-types: ^9.1.0 prettier: ^2.2.1 pretty-quick: ^3.1.0 semver: ^7.3.5 swagger2openapi: ^7.0.4 - ts-jest: ^27 + ts-jest: ^29 ts-node: ^10.4.0 typescript: ">=4.1 <=4.5" yalc: ^1.0.0-pre.47 @@ -6885,6 +7071,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.24.1": + version: 0.24.51 + resolution: "@sinclair/typebox@npm:0.24.51" + checksum: fd0d855e748ef767eb19da1a60ed0ab928e91e0f358c1dd198d600762c0015440b15755e96d1176e2a0db7e09c6a64ed487828ee10dd0c3e22f61eb09c478cd0 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^0.14.0": version: 0.14.0 resolution: "@sindresorhus/is@npm:0.14.0" @@ -6917,6 +7110,15 @@ __metadata: languageName: node linkType: hard +"@sinonjs/fake-timers@npm:^9.1.2": + version: 9.1.2 + resolution: "@sinonjs/fake-timers@npm:9.1.2" + dependencies: + "@sinonjs/commons": ^1.7.0 + checksum: 7d3aef54e17c1073101cb64d953157c19d62a40e261a30923fa1ee337b049c5f29cc47b1f0c477880f42b5659848ba9ab897607ac8ea4acd5c30ddcfac57fca6 + languageName: node + linkType: hard + "@size-limit/file@npm:4.11.0": version: 4.11.0 resolution: "@size-limit/file@npm:4.11.0" @@ -7361,6 +7563,13 @@ __metadata: languageName: node linkType: hard +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + "@trysound/sax@npm:0.2.0": version: 0.2.0 resolution: "@trysound/sax@npm:0.2.0" @@ -7442,7 +7651,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.4, @types/babel__traverse@npm:^7.0.6": +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": version: 7.11.1 resolution: "@types/babel__traverse@npm:7.11.1" dependencies: @@ -7482,6 +7691,22 @@ __metadata: languageName: node linkType: hard +"@types/chai-subset@npm:^1.3.3": + version: 1.3.3 + resolution: "@types/chai-subset@npm:1.3.3" + dependencies: + "@types/chai": "*" + checksum: 4481da7345022995f5a105e6683744f7203d2c3d19cfe88d8e17274d045722948abf55e0adfd97709e0f043dade37a4d4e98cd4c660e2e8a14f23e6ecf79418f + languageName: node + linkType: hard + +"@types/chai@npm:*, @types/chai@npm:^4.3.4": + version: 4.3.4 + resolution: "@types/chai@npm:4.3.4" + checksum: 571184967beb03bf64c4392a13a7d44e72da9af5a1e83077ff81c39cf59c0fda2a5c78d2005084601cf8f3d11726608574d8b5b4a0e3e9736792807afd926cd0 + languageName: node + linkType: hard + "@types/commander@npm:^2.12.2": version: 2.12.2 resolution: "@types/commander@npm:2.12.2" @@ -7604,6 +7829,15 @@ __metadata: languageName: node linkType: hard +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.6 + resolution: "@types/graceful-fs@npm:4.1.6" + dependencies: + "@types/node": "*" + checksum: c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4 + languageName: node + linkType: hard + "@types/hast@npm:^2.0.0": version: 2.3.1 resolution: "@types/hast@npm:2.3.1" @@ -7678,16 +7912,6 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-reports@npm:^1.1.1": - version: 1.1.2 - resolution: "@types/istanbul-reports@npm:1.1.2" - dependencies: - "@types/istanbul-lib-coverage": "*" - "@types/istanbul-lib-report": "*" - checksum: 00866e815d1e68d0a590d691506937b79d8d65ad8eab5ed34dbfee66136c7c0f4ea65327d32046d5fe469f22abea2b294987591dc66365ebc3991f7e413b2d78 - languageName: node - linkType: hard - "@types/istanbul-reports@npm:^3.0.0": version: 3.0.1 resolution: "@types/istanbul-reports@npm:3.0.1" @@ -8104,13 +8328,6 @@ __metadata: languageName: node linkType: hard -"@types/stack-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "@types/stack-utils@npm:1.0.1" - checksum: 9dc052b575acfeca3f165fb19d87b7b2989d54ed7d64a7eeb0b7587bc5795ef1f2c2b1511a44dcf0831ef35b8ce3486f97fcbfdd50c01f68aa297de31502c9d9 - languageName: node - linkType: hard - "@types/stack-utils@npm:^2.0.0": version: 2.0.0 resolution: "@types/stack-utils@npm:2.0.0" @@ -8201,15 +8418,6 @@ __metadata: languageName: node linkType: hard -"@types/yargs@npm:^13.0.0": - version: 13.0.11 - resolution: "@types/yargs@npm:13.0.11" - dependencies: - "@types/yargs-parser": "*" - checksum: efcbcccd20eab773970c2f103efaf69901924ab3bfc69cc5603ece0be7626937242b2f952b7ebc3708c121f8507e1d0633eb4cc04843433bf3d8b133b83bb811 - languageName: node - linkType: hard - "@types/yargs@npm:^15.0.0": version: 15.0.13 resolution: "@types/yargs@npm:15.0.13" @@ -8825,6 +9033,13 @@ __metadata: languageName: node linkType: hard +"abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e + languageName: node + linkType: hard + "abbrev@npm:1": version: 1.1.1 resolution: "abbrev@npm:1.1.1" @@ -8861,6 +9076,16 @@ __metadata: languageName: node linkType: hard +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + "acorn-import-assertions@npm:^1.7.6": version: 1.8.0 resolution: "acorn-import-assertions@npm:1.8.0" @@ -8897,7 +9122,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.1.1": +"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 @@ -8931,6 +9156,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.1.0, acorn@npm:^8.8.1": + version: 8.8.1 + resolution: "acorn@npm:8.8.1" + bin: + acorn: bin/acorn + checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f + languageName: node + linkType: hard + "address@npm:^1.0.1, address@npm:^1.1.2": version: 1.2.0 resolution: "address@npm:1.2.0" @@ -9152,13 +9386,6 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^4.0.0": - version: 4.1.0 - resolution: "ansi-regex@npm:4.1.0" - checksum: 97aa4659538d53e5e441f5ef2949a3cffcb838e57aeaad42c4194e9d7ddb37246a6526c4ca85d3940a9d1e19b11cc2e114530b54c9d700c8baf163c31779baf8 - languageName: node - linkType: hard - "ansi-regex@npm:^5.0.0, ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" @@ -9180,7 +9407,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": +"ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" dependencies: @@ -9441,6 +9668,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^1.1.0": + version: 1.1.0 + resolution: "assertion-error@npm:1.1.0" + checksum: fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf + languageName: node + linkType: hard + "assign-symbols@npm:^1.0.0": version: 1.0.0 resolution: "assign-symbols@npm:1.0.0" @@ -9663,6 +9897,23 @@ __metadata: languageName: node linkType: hard +"babel-jest@npm:^29.3.1": + version: 29.3.1 + resolution: "babel-jest@npm:29.3.1" + dependencies: + "@jest/transform": ^29.3.1 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^29.2.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 793848238a771a931ddeb5930b9ec8ab800522ac8d64933665698f4a39603d157e572e20b57d79610277e1df88d3ee82b180d59a21f3570388f602beeb38a595 + languageName: node + linkType: hard + "babel-loader@npm:^8.2.3, babel-loader@npm:^8.2.5": version: 8.2.5 resolution: "babel-loader@npm:8.2.5" @@ -9745,6 +9996,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-jest-hoist@npm:^29.2.0": + version: 29.2.0 + resolution: "babel-plugin-jest-hoist@npm:29.2.0" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 368d271ceae491ae6b96cd691434859ea589fbe5fd5aead7660df75d02394077273c6442f61f390e9347adffab57a32b564d0fabcf1c53c4b83cd426cb644072 + languageName: node + linkType: hard + "babel-plugin-macros@npm:^2.6.1": version: 2.8.0 resolution: "babel-plugin-macros@npm:2.8.0" @@ -9963,6 +10226,18 @@ __metadata: languageName: node linkType: hard +"babel-preset-jest@npm:^29.2.0": + version: 29.2.0 + resolution: "babel-preset-jest@npm:29.2.0" + dependencies: + babel-plugin-jest-hoist: ^29.2.0 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 1b09a2db968c36e064daf98082cfffa39c849b63055112ddc56fc2551fd0d4783897265775b1d2f8a257960a3339745de92e74feb01bad86d41c4cecbfa854fc + languageName: node + linkType: hard + "babel-preset-react-app@npm:^10.0.1": version: 10.0.1 resolution: "babel-preset-react-app@npm:10.0.1" @@ -10265,15 +10540,6 @@ __metadata: languageName: node linkType: hard -"browser-resolve@npm:^1.11.3": - version: 1.11.3 - resolution: "browser-resolve@npm:1.11.3" - dependencies: - resolve: 1.1.7 - checksum: 431bfc1a17406362a3010a2c35503eb7d1253dbcb8081c1ce236ddb0b954a33d52dcaf0b07f64c0f20394d6eeec1be4f6551da3734ce9ed5dcc38e876c96d5d5 - languageName: node - linkType: hard - "browserify-aes@npm:^1.0.0, browserify-aes@npm:^1.0.4": version: 1.2.0 resolution: "browserify-aes@npm:1.2.0" @@ -10456,6 +10722,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a + languageName: node + linkType: hard + "cacache@npm:^12.0.2": version: 12.0.4 resolution: "cacache@npm:12.0.4" @@ -10691,6 +10964,21 @@ __metadata: languageName: node linkType: hard +"chai@npm:^4.3.7": + version: 4.3.7 + resolution: "chai@npm:4.3.7" + dependencies: + assertion-error: ^1.1.0 + check-error: ^1.0.2 + deep-eql: ^4.1.2 + get-func-name: ^2.0.0 + loupe: ^2.3.1 + pathval: ^1.1.1 + type-detect: ^4.0.5 + checksum: 0bba7d267848015246a66995f044ce3f0ebc35e530da3cbdf171db744e14cbe301ab913a8d07caf7952b430257ccbb1a4a983c570a7c5748dc537897e5131f7c + languageName: node + linkType: hard + "chalk@npm:4.1.1": version: 4.1.1 resolution: "chalk@npm:4.1.1" @@ -10724,7 +11012,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.4.1": +"chalk@npm:^2.0.0, chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -10839,6 +11127,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^1.0.2": + version: 1.0.2 + resolution: "check-error@npm:1.0.2" + checksum: d9d106504404b8addd1ee3f63f8c0eaa7cd962a1a28eb9c519b1c4a1dc7098be38007fc0060f045ee00f075fbb7a2a4f42abcf61d68323677e11ab98dc16042e + languageName: node + linkType: hard + "check-types@npm:^11.1.1": version: 11.1.2 resolution: "check-types@npm:11.1.2" @@ -11530,23 +11825,25 @@ __metadata: languageName: node linkType: hard -"console-testing-library@npm:0.3.1": - version: 0.3.1 - resolution: "console-testing-library@npm:0.3.1" +"console-testing-library@npm:0.6.1": + version: 0.6.1 + resolution: "console-testing-library@npm:0.6.1" dependencies: - jest-snapshot: ^24.9.0 - pretty-format: ^24.9.0 - checksum: 94438ceb34b035764c62df76effc54a84a8a4f6368c9285d40d379eb90d30f442a24ff8606a33dc02570555974b8102aa53444b382d6403522f8e74a8ff95f8d + jest-snapshot: ^26.0.0 + pretty-format: ^26.0.0 + strip-ansi: ^6.0.0 + checksum: c02251eb42cdf4873c6dfc75fe9a78e7b8ed6450dda08b60d50bde4e98307adbd0ec37b8664ae40a6a40a5761043fb55b2a7516de4fb84aa0c695f086f28eb5a languageName: node linkType: hard -"console-testing-library@patch:console-testing-library@npm:0.3.1#.yarn/patches/console-testing-library__npm_0.3.1.patch::locator=rtk-monorepo%40workspace%3A.": - version: 0.3.1 - resolution: "console-testing-library@patch:console-testing-library@npm%3A0.3.1#.yarn/patches/console-testing-library__npm_0.3.1.patch::version=0.3.1&hash=790984&locator=rtk-monorepo%40workspace%3A." +"console-testing-library@patch:console-testing-library@npm%3A0.6.1#./.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch::locator=rtk-monorepo%40workspace%3A.": + version: 0.6.1 + resolution: "console-testing-library@patch:console-testing-library@npm%3A0.6.1#./.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch::version=0.6.1&hash=6ec7bd&locator=rtk-monorepo%40workspace%3A." dependencies: - jest-snapshot: ^24.9.0 - pretty-format: ^24.9.0 - checksum: 8cf742ea934f40d9c6a71f2c975fb42a93fc24ffaf9b78d98d9cfd420f705bb2e31738d07273d5ce1d099255a6314df3a247a9a8eb6e228d586f8743cdb2565e + jest-snapshot: ^26.0.0 + pretty-format: ^26.0.0 + strip-ansi: ^6.0.0 + checksum: 682a0d6ca96a90285510a9c8fc667b541d8ef628070534516beac959176554e32796e86eaf964e26612edc8b10a869f53d44d283d8250f54b5465be847cc4a23 languageName: node linkType: hard @@ -11600,6 +11897,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -12392,6 +12696,13 @@ __metadata: languageName: node linkType: hard +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 823471aa30091c59e0a305927c30e7768939b6af70405808f8d2ce1ca778cddcb24722717392438329d1691f9a87cb0183b64b8d779b56a961546d54854fde01 + languageName: node + linkType: hard + "cssom@npm:~0.3.6": version: 0.3.8 resolution: "cssom@npm:0.3.8" @@ -12447,6 +12758,17 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + "dataloader@npm:2.0.0": version: 2.0.0 resolution: "dataloader@npm:2.0.0" @@ -12540,6 +12862,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.2": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae + languageName: node + linkType: hard + "decode-uri-component@npm:^0.2.0": version: 0.2.0 resolution: "decode-uri-component@npm:0.2.0" @@ -12572,6 +12901,15 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^4.1.2": + version: 4.1.3 + resolution: "deep-eql@npm:4.1.3" + dependencies: + type-detect: ^4.0.0 + checksum: 7f6d30cb41c713973dc07eaadded848b2ab0b835e518a88b91bea72f34e08c4c71d167a722a6f302d3a6108f05afd8e6d7650689a84d5d29ec7fe6220420397f + languageName: node + linkType: hard + "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -12849,13 +13187,6 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^24.9.0": - version: 24.9.0 - resolution: "diff-sequences@npm:24.9.0" - checksum: b81f906ff1737e0a65e8f7ee3ad1d27b426dcc25498731365aeaccc32333da3bf3a7100c963c7104f12c8e64e545114d4fe4c0b90daf2565b0b00b79f0df45c4 - languageName: node - linkType: hard - "diff-sequences@npm:^26.6.2": version: 26.6.2 resolution: "diff-sequences@npm:26.6.2" @@ -12870,6 +13201,13 @@ __metadata: languageName: node linkType: hard +"diff-sequences@npm:^29.3.1": + version: 29.3.1 + resolution: "diff-sequences@npm:29.3.1" + checksum: 8edab8c383355022e470779a099852d595dd856f9f5bd7af24f177e74138a668932268b4c4fd54096eed643861575c3652d4ecbbb1a9d710488286aed3ffa443 + languageName: node + linkType: hard + "diff@npm:^4.0.1": version: 4.0.2 resolution: "diff@npm:4.0.2" @@ -13036,7 +13374,16 @@ __metadata: languageName: node linkType: hard -"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0": +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: ^7.0.0 + checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0": version: 4.2.0 resolution: "domhandler@npm:4.2.0" dependencies: @@ -13250,6 +13597,13 @@ __metadata: languageName: node linkType: hard +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 + languageName: node + linkType: hard + "emittery@npm:^0.8.1": version: 0.8.1 resolution: "emittery@npm:0.8.1" @@ -13371,6 +13725,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.4.0": + version: 4.4.0 + resolution: "entities@npm:4.4.0" + checksum: 84d250329f4b56b40fa93ed067b194db21e8815e4eb9b59f43a086f0ecd342814f6bc483de8a77da5d64e0f626033192b1b4f1792232a7ea6b970ebe0f3187c2 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -14275,20 +14636,6 @@ __metadata: languageName: node linkType: hard -"expect@npm:^24.9.0": - version: 24.9.0 - resolution: "expect@npm:24.9.0" - dependencies: - "@jest/types": ^24.9.0 - ansi-styles: ^3.2.0 - jest-get-type: ^24.9.0 - jest-matcher-utils: ^24.9.0 - jest-message-util: ^24.9.0 - jest-regex-util: ^24.9.0 - checksum: bfce2243543dd10e3c2047bbe6fc99b7b150cea71b198ddd8feb2e7ebfef1a3dd46ec7519e05d23a20b30c242b13dad97551368a690731d9a591f6f863528cee - languageName: node - linkType: hard - "expect@npm:^27.5.1": version: 27.5.1 resolution: "expect@npm:27.5.1" @@ -14301,6 +14648,19 @@ __metadata: languageName: node linkType: hard +"expect@npm:^29.3.1": + version: 29.3.1 + resolution: "expect@npm:29.3.1" + 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 + checksum: e9588c2a430b558b9a3dc72d4ad05f36b047cb477bc6a7bb9cfeef7614fe7e5edbab424c2c0ce82739ee21ecbbbd24596259528209f84cd72500cc612d910d30 + languageName: node + linkType: hard + "express@npm:^4.17.3": version: 4.18.1 resolution: "express@npm:4.18.1" @@ -14808,15 +15168,6 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 - languageName: node - linkType: hard - "for-in@npm:^1.0.2": version: 1.0.2 resolution: "for-in@npm:1.0.2" @@ -14855,7 +15206,7 @@ __metadata: languageName: node linkType: hard -"form-data@npm:4.0.0": +"form-data@npm:4.0.0, form-data@npm:^4.0.0": version: 4.0.0 resolution: "form-data@npm:4.0.0" dependencies: @@ -15155,6 +15506,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"get-func-name@npm:^2.0.0": + version: 2.0.0 + resolution: "get-func-name@npm:2.0.0" + checksum: 8d82e69f3e7fab9e27c547945dfe5cc0c57fc0adf08ce135dddb01081d75684a03e7a0487466f478872b341d52ac763ae49e660d01ab83741f74932085f693c3 + languageName: node + linkType: hard + "get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": version: 1.1.1 resolution: "get-intrinsic@npm:1.1.1" @@ -15945,6 +16303,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: ^2.0.0 + checksum: 8d806aa00487e279e5ccb573366a951a9f68f65c90298eac9c3a2b440a7ffe46615aff2995a2f61c6746c639234e6179a97e18ca5ccbbf93d3725ef2099a4502 + languageName: node + linkType: hard + "html-entities@npm:^2.1.0, html-entities@npm:^2.3.2": version: 2.3.3 resolution: "html-entities@npm:2.3.3" @@ -16086,6 +16453,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + "http-proxy-middleware@npm:^2.0.3": version: 2.0.6 resolution: "http-proxy-middleware@npm:2.0.6" @@ -16149,6 +16527,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + "human-signals@npm:^1.1.1": version: 1.1.1 resolution: "human-signals@npm:1.1.1" @@ -16202,7 +16590,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -16704,7 +17092,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": +"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": version: 1.2.4 resolution: "is-callable@npm:1.2.4" checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f @@ -17409,6 +17797,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-changed-files@npm:^29.2.0": + version: 29.2.0 + resolution: "jest-changed-files@npm:29.2.0" + dependencies: + execa: ^5.0.0 + p-limit: ^3.1.0 + checksum: 8ad8290324db1de2ee3c9443d3e3fbfdcb6d72ec7054c5796be2854b2bc239dea38a7c797c8c9c2bd959f539d44305790f2f75b18f3046b04317ed77c7480cb1 + languageName: node + linkType: hard + "jest-circus@npm:^27.5.1": version: 27.5.1 resolution: "jest-circus@npm:27.5.1" @@ -17436,6 +17834,33 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-circus@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-circus@npm:29.3.1" + dependencies: + "@jest/environment": ^29.3.1 + "@jest/expect": ^29.3.1 + "@jest/test-result": ^29.3.1 + "@jest/types": ^29.3.1 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^0.7.0 + is-generator-fn: ^2.0.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.3 + checksum: 125710debd998ad9693893e7c1235e271b79f104033b8169d82afe0bc0d883f8f5245feef87adcbb22ad27ff749fd001aa998d11a132774b03b4e2b8af77d5d8 + languageName: node + linkType: hard + "jest-cli@npm:^27.5.1": version: 27.5.1 resolution: "jest-cli@npm:27.5.1" @@ -17463,6 +17888,33 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-cli@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-cli@npm:29.3.1" + dependencies: + "@jest/core": ^29.3.1 + "@jest/test-result": ^29.3.1 + "@jest/types": ^29.3.1 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^29.3.1 + jest-util: ^29.3.1 + jest-validate: ^29.3.1 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 829895d33060042443bd1e9e87eb68993773d74f2c8a9b863acf53cece39d227ae0e7d76df2e9c5934c414bdf70ce398a34b3122cfe22164acb2499a74d7288d + languageName: node + linkType: hard + "jest-config@npm:^27.5.1": version: 27.5.1 resolution: "jest-config@npm:27.5.1" @@ -17500,15 +17952,41 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-diff@npm:^24.9.0": - version: 24.9.0 - resolution: "jest-diff@npm:24.9.0" +"jest-config@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-config@npm:29.3.1" dependencies: - chalk: ^2.0.1 - diff-sequences: ^24.9.0 - jest-get-type: ^24.9.0 - pretty-format: ^24.9.0 - checksum: 462ccb128cb1b64eb285d28245d0c5bfc230cb063624bd117550d6dbc94332f606828a5de86938611d1e6a78489e576c496737ae139084f6049a56b768ad6402 + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^29.3.1 + "@jest/types": ^29.3.1 + babel-jest: ^29.3.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + 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.4 + parse-json: ^5.2.0 + pretty-format: ^29.3.1 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: 6e663f04ae1024a53a4c2c744499b4408ca9a8b74381dd5e31b11bb3c7393311ecff0fb61b06287768709eb2c9e5a2fd166d258f5a9123abbb4c5812f99c12fe languageName: node linkType: hard @@ -17536,6 +18014,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-diff@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-diff@npm:29.3.1" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^29.3.1 + jest-get-type: ^29.2.0 + pretty-format: ^29.3.1 + checksum: ac5c09745f2b1897e6f53216acaf6ed44fc4faed8e8df053ff4ac3db5d2a1d06a17b876e49faaa15c8a7a26f5671bcbed0a93781dcc2835f781c79a716a591a9 + languageName: node + linkType: hard + "jest-docblock@npm:^27.5.1": version: 27.5.1 resolution: "jest-docblock@npm:27.5.1" @@ -17545,6 +18035,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-docblock@npm:^29.2.0": + version: 29.2.0 + resolution: "jest-docblock@npm:29.2.0" + dependencies: + detect-newline: ^3.0.0 + checksum: b3f1227b7d73fc9e4952180303475cf337b36fa65c7f730ac92f0580f1c08439983262fee21cf3dba11429aa251b4eee1e3bc74796c5777116b400d78f9d2bbe + languageName: node + linkType: hard + "jest-each@npm:^27.5.1": version: 27.5.1 resolution: "jest-each@npm:27.5.1" @@ -17558,6 +18057,19 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-each@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-each@npm:29.3.1" + dependencies: + "@jest/types": ^29.3.1 + chalk: ^4.0.0 + jest-get-type: ^29.2.0 + jest-util: ^29.3.1 + pretty-format: ^29.3.1 + checksum: 16d51ef8f96fba44a3479f1c6f7672027e3b39236dc4e41217c38fe60a3b66b022ffcee72f8835a442f7a8a0a65980a93fb8e73a9782d192452526e442ad049a + languageName: node + linkType: hard + "jest-environment-jsdom@npm:^27.5.1": version: 27.5.1 resolution: "jest-environment-jsdom@npm:27.5.1" @@ -17587,10 +18099,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-get-type@npm:^24.9.0": - version: 24.9.0 - resolution: "jest-get-type@npm:24.9.0" - checksum: 821e6cd46434c917370cd362fbc4ce564c6e22780351f3ca468b230fbbc657ae19905ed5cdcc5e112d81a2c79cbd3fbcbe0dd44dc62860414b60ea223009958c +"jest-environment-node@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-environment-node@npm:29.3.1" + dependencies: + "@jest/environment": ^29.3.1 + "@jest/fake-timers": ^29.3.1 + "@jest/types": ^29.3.1 + "@types/node": "*" + jest-mock: ^29.3.1 + jest-util: ^29.3.1 + checksum: 16d4854bd2d35501bd4862ca069baf27ce9f5fd7642fdcab9d2dab49acd28c082d0c8882bf2bb28ed7bbaada486da577c814c9688ddc62d1d9f74a954fde996a languageName: node linkType: hard @@ -17608,6 +18127,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-get-type@npm:^29.2.0": + version: 29.2.0 + resolution: "jest-get-type@npm:29.2.0" + checksum: e396fd880a30d08940ed8a8e43cd4595db1b8ff09649018eb358ca701811137556bae82626af73459e3c0f8c5e972ed1e57fd3b1537b13a260893dac60a90942 + languageName: node + linkType: hard + "jest-haste-map@npm:^26.6.2": version: 26.6.2 resolution: "jest-haste-map@npm:26.6.2" @@ -17657,6 +18183,29 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-haste-map@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-haste-map@npm:29.3.1" + dependencies: + "@jest/types": ^29.3.1 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^29.2.0 + jest-util: ^29.3.1 + jest-worker: ^29.3.1 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: 97ea26af0c28a2ba568c9c65d06211487bbcd501cb4944f9d55e07fd2b00ad96653ea2cc9033f3d5b7dc1feda33e47ae9cc56b400191ea4533be213c9f82e67c + languageName: node + linkType: hard + "jest-jasmine2@npm:^27.5.1": version: 27.5.1 resolution: "jest-jasmine2@npm:27.5.1" @@ -17692,15 +18241,13 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-matcher-utils@npm:^24.9.0": - version: 24.9.0 - resolution: "jest-matcher-utils@npm:24.9.0" +"jest-leak-detector@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-leak-detector@npm:29.3.1" dependencies: - chalk: ^2.0.1 - jest-diff: ^24.9.0 - jest-get-type: ^24.9.0 - pretty-format: ^24.9.0 - checksum: e9dcd4c7a0bf52dccb4890de7ac2da3e857af067e71633b730fdc865dd271b8a2c3d68a2761d5ca6060ea4a455be42176f58462006468b8eb7c216921251e2ee + jest-get-type: ^29.2.0 + pretty-format: ^29.3.1 + checksum: 0dd8ed31ae0b5a3d14f13f567ca8567f2663dd2d540d1e55511d3b3fd7f80a1d075392179674ebe9fab9be0b73678bf4d2f8bbbc0f4bdd52b9815259194da559 languageName: node linkType: hard @@ -17716,19 +18263,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-message-util@npm:^24.9.0": - version: 24.9.0 - resolution: "jest-message-util@npm:24.9.0" +"jest-matcher-utils@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-matcher-utils@npm:29.3.1" dependencies: - "@babel/code-frame": ^7.0.0 - "@jest/test-result": ^24.9.0 - "@jest/types": ^24.9.0 - "@types/stack-utils": ^1.0.1 - chalk: ^2.0.1 - micromatch: ^3.1.10 - slash: ^2.0.0 - stack-utils: ^1.0.1 - checksum: c173117b245090967db4853c28c3452ad2987a10caf28161abbfeb8d96be13f0d9e25422df10162bcc5e46860887e35ec4b4963f85392c4a625e4c37ad242f0b + chalk: ^4.0.0 + jest-diff: ^29.3.1 + jest-get-type: ^29.2.0 + pretty-format: ^29.3.1 + checksum: 311e8d9f1e935216afc7dd8c6acf1fbda67a7415e1afb1bf72757213dfb025c1f2dc5e2c185c08064a35cdc1f2d8e40c57616666774ed1b03e57eb311c20ec77 languageName: node linkType: hard @@ -17766,6 +18309,23 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-message-util@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-message-util@npm:29.3.1" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^29.3.1 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^29.3.1 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 15d0a2fca3919eb4570bbf575734780c4b9e22de6aae903c4531b346699f7deba834c6c86fe6e9a83ad17fac0f7935511cf16dce4d71a93a71ebb25f18a6e07b + languageName: node + linkType: hard + "jest-mock@npm:^27.5.1": version: 27.5.1 resolution: "jest-mock@npm:27.5.1" @@ -17776,7 +18336,18 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-pnp-resolver@npm:^1.2.1, jest-pnp-resolver@npm:^1.2.2": +"jest-mock@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-mock@npm:29.3.1" + dependencies: + "@jest/types": ^29.3.1 + "@types/node": "*" + jest-util: ^29.3.1 + checksum: 9098852cb2866db4a1a59f9f7581741dfc572f648e9e574a1b187fd69f5f2f6190ad387ede21e139a8b80a6a1343ecc3d6751cd2ae1ae11d7ea9fa1950390fb2 + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": version: 1.2.2 resolution: "jest-pnp-resolver@npm:1.2.2" peerDependencies: @@ -17788,13 +18359,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-regex-util@npm:^24.9.0": - version: 24.9.0 - resolution: "jest-regex-util@npm:24.9.0" - checksum: 94299972501ae5dfc3932673b263fd15dba5e28698571687a28cc59b5a173edcbf52b992f4d5a6eded9da5b7e1468d263ef96a1564267832799b41c2986fc423 - languageName: node - linkType: hard - "jest-regex-util@npm:^26.0.0": version: 26.0.0 resolution: "jest-regex-util@npm:26.0.0" @@ -17816,6 +18380,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-regex-util@npm:^29.2.0": + version: 29.2.0 + resolution: "jest-regex-util@npm:29.2.0" + checksum: 7c533e51c51230dac20c0d7395b19b8366cb022f7c6e08e6bcf2921626840ff90424af4c9b4689f02f0addfc9b071c4cd5f8f7a989298a4c8e0f9c94418ca1c3 + languageName: node + linkType: hard + "jest-resolve-dependencies@npm:^27.5.1": version: 27.5.1 resolution: "jest-resolve-dependencies@npm:27.5.1" @@ -17827,16 +18398,13 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-resolve@npm:^24.9.0": - version: 24.9.0 - resolution: "jest-resolve@npm:24.9.0" +"jest-resolve-dependencies@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-resolve-dependencies@npm:29.3.1" dependencies: - "@jest/types": ^24.9.0 - browser-resolve: ^1.11.3 - chalk: ^2.0.1 - jest-pnp-resolver: ^1.2.1 - realpath-native: ^1.1.0 - checksum: 60a84cbd75d5cdab1ad29c8ed62e43fbc374c906e5a0f166fae5170f91c863ee9372aaab7dbdb3a06a38b0362131fa7c907c114be76a8bc1aeac47013ec308e4 + jest-regex-util: ^29.2.0 + jest-snapshot: ^29.3.1 + checksum: 6ec4727a87c6e7954e93de9949ab9967b340ee2f07626144c273355f05a2b65fa47eb8dece2d6e5f4fd99cdb893510a3540aa5e14ba443f70b3feb63f6f98982 languageName: node linkType: hard @@ -17858,6 +18426,23 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-resolve@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-resolve@npm:29.3.1" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.3.1 + jest-pnp-resolver: ^1.2.2 + jest-util: ^29.3.1 + jest-validate: ^29.3.1 + resolve: ^1.20.0 + resolve.exports: ^1.1.0 + slash: ^3.0.0 + checksum: 0dea22ed625e07b8bfee52dea1391d3a4b453c1a0c627a0fa7c22e44bb48e1c289afe6f3c316def70753773f099c4e8f436c7a2cc12fcc6c7dd6da38cba2cd5f + languageName: node + linkType: hard + "jest-runner@npm:^27.5.1": version: 27.5.1 resolution: "jest-runner@npm:27.5.1" @@ -17887,6 +18472,35 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-runner@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-runner@npm:29.3.1" + 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": "*" + chalk: ^4.0.0 + emittery: ^0.13.1 + graceful-fs: ^4.2.9 + 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 + checksum: 61ad445d8a5f29573332f27a21fc942fb0d2a82bf901a0ea1035bf3bd7f349d1e425f71f54c3a3f89b292a54872c3248d395a2829d987f26b6025b15530ea5d2 + languageName: node + linkType: hard + "jest-runtime@npm:^27.5.1": version: 27.5.1 resolution: "jest-runtime@npm:27.5.1" @@ -17917,6 +18531,36 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-runtime@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-runtime@npm:29.3.1" + 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": "*" + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + 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 + checksum: 82f27b48f000be074064a854e16e768f9453e9b791d8c5f9316606c37f871b5b10f70544c1b218ab9784f00bd972bb77f868c5ab6752c275be2cd219c351f5a7 + languageName: node + linkType: hard + "jest-serializer@npm:^26.6.2": version: 26.6.2 resolution: "jest-serializer@npm:26.6.2" @@ -17937,54 +18581,35 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-snapshot@npm:^24.9.0": - version: 24.9.0 - resolution: "jest-snapshot@npm:24.9.0" - dependencies: - "@babel/types": ^7.0.0 - "@jest/types": ^24.9.0 - chalk: ^2.0.1 - expect: ^24.9.0 - jest-diff: ^24.9.0 - jest-get-type: ^24.9.0 - jest-matcher-utils: ^24.9.0 - jest-message-util: ^24.9.0 - jest-resolve: ^24.9.0 - mkdirp: ^0.5.1 - natural-compare: ^1.4.0 - pretty-format: ^24.9.0 - semver: ^6.2.0 - checksum: 474dc05ededdb8b39fb79801498fcd16c1a13a01b4701a27172be0ee3ebc5640e2bfb2780a9afa49bd825b19fc2be1e2ec5fc3d501afa76a5f7bc40f0120aaf3 - languageName: node - linkType: hard - -"jest-snapshot@npm:^27.5.1": - version: 27.5.1 - resolution: "jest-snapshot@npm:27.5.1" +"jest-snapshot@npm:29.3.1": + version: 29.3.1 + resolution: "jest-snapshot@npm:29.3.1" dependencies: - "@babel/core": ^7.7.2 + "@babel/core": ^7.11.6 "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-jsx": ^7.7.2 "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/traverse": ^7.7.2 - "@babel/types": ^7.0.0 - "@jest/transform": ^27.5.1 - "@jest/types": ^27.5.1 - "@types/babel__traverse": ^7.0.4 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^29.3.1 + "@jest/transform": ^29.3.1 + "@jest/types": ^29.3.1 + "@types/babel__traverse": ^7.0.6 "@types/prettier": ^2.1.5 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^27.5.1 + expect: ^29.3.1 graceful-fs: ^4.2.9 - jest-diff: ^27.5.1 - jest-get-type: ^27.5.1 - jest-haste-map: ^27.5.1 - jest-matcher-utils: ^27.5.1 - jest-message-util: ^27.5.1 - jest-util: ^27.5.1 + 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: ^27.5.1 - semver: ^7.3.2 - checksum: a5cfadf0d21cd76063925d1434bc076443ed6d87847d0e248f0b245f11db3d98ff13e45cc03b15404027dabecd712d925f47b6eae4f64986f688640a7d362514 + pretty-format: ^29.3.1 + semver: ^7.3.5 + checksum: d7d0077935e78c353c828be78ccb092e12ba7622cb0577f21641fadd728ae63a7c1f4a0d8113bfb38db3453a64bfa232fb1cdeefe0e2b48c52ef4065b0ab75ae languageName: node linkType: hard @@ -18030,6 +18655,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-util@npm:^29.0.0, jest-util@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-util@npm:29.3.1" + dependencies: + "@jest/types": ^29.3.1 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: f67c60f062b94d21cb60e84b3b812d64b7bfa81fe980151de5c17a74eb666042d0134e2e756d099b7606a1fcf1d633824d2e58197d01d76dde1e2dc00dfcd413 + languageName: node + linkType: hard + "jest-validate@npm:^27.5.1": version: 27.5.1 resolution: "jest-validate@npm:27.5.1" @@ -18044,6 +18683,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-validate@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-validate@npm:29.3.1" + dependencies: + "@jest/types": ^29.3.1 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^29.2.0 + leven: ^3.1.0 + pretty-format: ^29.3.1 + checksum: 92584f0b8ac284235f12b3b812ccbc43ef6dea080a3b98b1aa81adbe009e962d0aa6131f21c8157b30ac3d58f335961694238a93d553d1d1e02ab264c923778c + languageName: node + linkType: hard + "jest-watch-typeahead@npm:^1.0.0, jest-watch-typeahead@npm:^1.1.0": version: 1.1.0 resolution: "jest-watch-typeahead@npm:1.1.0" @@ -18092,6 +18745,22 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-watcher@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-watcher@npm:29.3.1" + dependencies: + "@jest/test-result": ^29.3.1 + "@jest/types": ^29.3.1 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.13.1 + jest-util: ^29.3.1 + string-length: ^4.0.1 + checksum: 60d189473486c73e9d540406a30189da5a3c67bfb0fb4ad4a83991c189135ef76d929ec99284ca5a505fe4ee9349ae3c99b54d2e00363e72837b46e77dec9642 + languageName: node + linkType: hard + "jest-worker@npm:^26.2.1, jest-worker@npm:^26.6.2": version: 26.6.2 resolution: "jest-worker@npm:26.6.2" @@ -18114,6 +18783,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-worker@npm:^29.3.1": + version: 29.3.1 + resolution: "jest-worker@npm:29.3.1" + dependencies: + "@types/node": "*" + jest-util: ^29.3.1 + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 38687fcbdc2b7ddc70bbb5dfc703ae095b46b3c7f206d62ecdf5f4d16e336178e217302138f3b906125576bb1cfe4cfe8d43681276fa5899d138ed9422099fb3 + languageName: node + linkType: hard + "jest@npm:^27, jest@npm:^27.4.3": version: 27.5.1 resolution: "jest@npm:27.5.1" @@ -18132,6 +18813,25 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest@npm:^29": + version: 29.3.1 + resolution: "jest@npm:29.3.1" + dependencies: + "@jest/core": ^29.3.1 + "@jest/types": ^29.3.1 + import-local: ^3.0.2 + jest-cli: ^29.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 613f4ec657b14dd84c0056b2fef1468502927fd551bef0b19d4a91576a609678fb316c6a5b5fc6120dd30dd4ff4569070ffef3cb507db9bb0260b28ddaa18d7a + languageName: node + linkType: hard + "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -18260,6 +18960,45 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jsdom@npm:^21.0.0": + version: 21.0.0 + resolution: "jsdom@npm:21.0.0" + dependencies: + abab: ^2.0.6 + acorn: ^8.8.1 + acorn-globals: ^7.0.0 + cssom: ^0.5.0 + cssstyle: ^2.3.0 + data-urls: ^3.0.2 + decimal.js: ^10.4.2 + domexception: ^4.0.0 + escodegen: ^2.0.0 + form-data: ^4.0.0 + html-encoding-sniffer: ^3.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.1 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.2 + parse5: ^7.1.1 + saxes: ^6.0.0 + symbol-tree: ^3.2.4 + tough-cookie: ^4.1.2 + w3c-xmlserializer: ^4.0.0 + webidl-conversions: ^7.0.0 + whatwg-encoding: ^2.0.0 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + ws: ^8.11.0 + xml-name-validator: ^4.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 5e553f8a106716a7fc8084350418c69bbbe9121e792760a9b153d5eb184464497c660f2dadcc425f3a17fdde31a3ed4c8bc7b9e9515832f4bbc9d877041bce3a + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -18380,6 +19119,22 @@ fsevents@^1.2.7: languageName: node linkType: hard +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.2.0": + version: 3.2.0 + resolution: "jsonc-parser@npm:3.2.0" + checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 + languageName: node + linkType: hard + "jsonfile@npm:^4.0.0": version: 4.0.0 resolution: "jsonfile@npm:4.0.0" @@ -18712,6 +19467,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"local-pkg@npm:^0.4.2": + version: 0.4.2 + resolution: "local-pkg@npm:0.4.2" + checksum: 22be451353c25c4411b552bf01880ebc9e995b93574b2facc7757968d888356df59199cacada14162ab53bbc9da055bb692c907b4171f008dbce45a2afc777c1 + languageName: node + linkType: hard + "locate-path@npm:^2.0.0": version: 2.0.0 resolution: "locate-path@npm:2.0.0" @@ -18952,6 +19714,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"loupe@npm:^2.3.1": + version: 2.3.6 + resolution: "loupe@npm:2.3.6" + dependencies: + get-func-name: ^2.0.0 + checksum: cc83f1b124a1df7384601d72d8d1f5fe95fd7a8185469fec48bb2e4027e45243949e7a013e8d91051a138451ff0552310c32aa9786e60b6a30d1e801bdc2163f + languageName: node + linkType: hard + "lower-case-first@npm:^2.0.2": version: 2.0.2 resolution: "lower-case-first@npm:2.0.2" @@ -19085,6 +19856,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: 1.0.5 + checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 + languageName: node + linkType: hard + "makeerror@npm:1.0.x": version: 1.0.11 resolution: "makeerror@npm:1.0.11" @@ -19682,6 +20462,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mlly@npm:^1.0.0, mlly@npm:^1.1.0": + version: 1.1.0 + resolution: "mlly@npm:1.1.0" + dependencies: + acorn: ^8.8.1 + pathe: ^1.0.0 + pkg-types: ^1.0.1 + ufo: ^1.0.1 + checksum: d53147a2f5f83499589c47a00e00df30cbae2e630dfcfdfdeee2b70b49aff6612f2fa13195a1c6268b8f8ecd6064cb9a35febbdf895b2cbfeacdf9a9b3e31493 + languageName: node + linkType: hard + "move-concurrently@npm:^1.0.1": version: 1.0.1 resolution: "move-concurrently@npm:1.0.1" @@ -20228,6 +21020,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"nwsapi@npm:^2.2.2": + version: 2.2.2 + resolution: "nwsapi@npm:2.2.2" + checksum: 43769106292bc95f776756ca2f3513dab7b4d506a97c67baec32406447841a35f65f29c1f95ab5d42785210fd41668beed33ca16fa058780be43b101ad73e205 + languageName: node + linkType: hard + "oas-kit-common@npm:^1.0.8": version: 1.0.8 resolution: "oas-kit-common@npm:1.0.8" @@ -20368,7 +21167,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object.getownpropertydescriptors@npm:^2.1.0, object.getownpropertydescriptors@npm:^2.1.1": +"object.getownpropertydescriptors@npm:^2.1.0": version: 2.1.2 resolution: "object.getownpropertydescriptors@npm:2.1.2" dependencies: @@ -20615,7 +21414,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"p-limit@npm:3.1.0, p-limit@npm:^3.0.2": +"p-limit@npm:3.1.0, p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -20903,6 +21702,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"parse5@npm:^7.1.1": + version: 7.1.2 + resolution: "parse5@npm:7.1.2" + dependencies: + entities: ^4.4.0 + checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 + languageName: node + linkType: hard + "parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -21053,6 +21861,27 @@ fsevents@^1.2.7: languageName: node linkType: hard +"pathe@npm:^0.2.0": + version: 0.2.0 + resolution: "pathe@npm:0.2.0" + checksum: 9a8149ce152088f30d15b0b03a7c128ba21f16b4dc1f3f90fe38eee9f6d0f1d6da8e4e47bd2a4f9e14aaac7c30ed01cfc86216479011de2bdc598b65e6f19f41 + languageName: node + linkType: hard + +"pathe@npm:^1.0.0": + version: 1.0.0 + resolution: "pathe@npm:1.0.0" + checksum: 7b71a4930a5b46111c92149632f74b0e87bade3eabe6c9168dcc4846857a4e124eacc0c2bf044fe0d2a8b7f87ae62b9b2cb11938c61899d485cc36dd1a243a23 + languageName: node + linkType: hard + +"pathval@npm:^1.1.1": + version: 1.1.1 + resolution: "pathval@npm:1.1.1" + checksum: 090e3147716647fb7fb5b4b8c8e5b55e5d0a6086d085b6cd23f3d3c01fcf0ff56fd3cc22f2f4a033bd2e46ed55d61ed8379e123b42afe7d531a2a5fc8bb556d6 + languageName: node + linkType: hard + "pbkdf2@npm:^3.0.3": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" @@ -21149,6 +21978,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"pkg-types@npm:^1.0.1": + version: 1.0.1 + resolution: "pkg-types@npm:1.0.1" + dependencies: + jsonc-parser: ^3.2.0 + mlly: ^1.0.0 + pathe: ^1.0.0 + checksum: fe73cc22fb72ddb09227e2837a7b2ed1e0706a18e69a58a6ce13cde2b7eab122cb98de44d5c54fca5715d203ef3d2eb004b3ec84a3c05decb11e7c49a80fe2f9 + languageName: node + linkType: hard + "pkg-up@npm:^3.1.0": version: 3.1.0 resolution: "pkg-up@npm:3.1.0" @@ -22441,6 +23281,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"postcss@npm:^8.4.20": + version: 8.4.21 + resolution: "postcss@npm:8.4.21" + dependencies: + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: e39ac60ccd1542d4f9d93d894048aac0d686b3bb38e927d8386005718e6793dbbb46930f0a523fe382f1bbd843c6d980aaea791252bf5e176180e5a4336d9679 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -22506,18 +23357,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pretty-format@npm:^24.9.0": - version: 24.9.0 - resolution: "pretty-format@npm:24.9.0" - dependencies: - "@jest/types": ^24.9.0 - ansi-regex: ^4.0.0 - ansi-styles: ^3.2.0 - react-is: ^16.8.4 - checksum: ba9291c8dafd50d2fea1fbad5d2863a6f94e0c8835cce9778ec03bc11bb0f52b9ed0e4ee56aaa331d022ccae2fe52b92f73465a0af58fd0edb59deb6391c6847 - languageName: node - linkType: hard - "pretty-format@npm:^26.0.0, pretty-format@npm:^26.6.2": version: 26.6.2 resolution: "pretty-format@npm:26.6.2" @@ -22553,6 +23392,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"pretty-format@npm:^29.3.1": + version: 29.3.1 + resolution: "pretty-format@npm:29.3.1" + dependencies: + "@jest/schemas": ^29.0.0 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: 9917a0bb859cd7a24a343363f70d5222402c86d10eb45bcc2f77b23a4e67586257390e959061aec22762a782fe6bafb59bf34eb94527bc2e5d211afdb287eb4e + languageName: node + linkType: hard + "pretty-quick@npm:^3.1.0": version: 3.1.1 resolution: "pretty-quick@npm:3.1.1" @@ -22854,6 +23704,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -23090,7 +23947,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"react-is@npm:^16.13.1, react-is@npm:^16.6.0, react-is@npm:^16.7.0, react-is@npm:^16.8.4": +"react-is@npm:^16.13.1, react-is@npm:^16.6.0, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f @@ -23493,15 +24350,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"realpath-native@npm:^1.1.0": - version: 1.1.0 - resolution: "realpath-native@npm:1.1.0" - dependencies: - util.promisify: ^1.0.0 - checksum: 75ef0595dea6186384b785a9e0993c58ec604f8be2e39b602fec6d7837c7f770af4a4eb3c81f864a7d81c518a7167a6eaabbc7695b7a88c56e1ef04b91c1d586 - languageName: node - linkType: hard - "recast@npm:^0.20.3, recast@npm:^0.20.4": version: 0.20.5 resolution: "recast@npm:0.20.5" @@ -24362,6 +25210,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"rollup@npm:^3.7.0": + version: 3.10.0 + resolution: "rollup@npm:3.10.0" + dependencies: + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 31a882689c58d084ac36362aeaf2422dc4b80d671bd88c856693c37d63a26ddac9b9819dfba7f79c2d50d5207868b0e3d75f728fe551bbc347cf5dedf8ece18e + languageName: node + linkType: hard + "rsvp@npm:^4.8.4": version: 4.8.5 resolution: "rsvp@npm:4.8.5" @@ -24565,6 +25427,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: ^2.2.0 + checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b + languageName: node + linkType: hard + "scheduler@npm:^0.22.0": version: 0.22.0 resolution: "scheduler@npm:0.22.0" @@ -25031,6 +25902,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 8aa5a98640ca09fe00d74416eca97551b3e42991614a3d1b824b115fc1401543650914f651ab1311518177e4d297e80b953f4cd4cd7ea1eabe824e8f2091de01 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": version: 3.0.3 resolution: "signal-exit@npm:3.0.3" @@ -25038,6 +25916,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + "signedsource@npm:^1.0.0": version: 1.0.0 resolution: "signedsource@npm:1.0.0" @@ -25111,13 +25996,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"slash@npm:^2.0.0": - version: 2.0.0 - resolution: "slash@npm:2.0.0" - checksum: 512d4350735375bd11647233cb0e2f93beca6f53441015eea241fe784d8068281c3987fbaa93e7ef1c38df68d9c60013045c92837423c69115297d6169aa85e6 - languageName: node - linkType: hard - "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -25292,6 +26170,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 + languageName: node + linkType: hard + "source-map-support@npm:0.5.19": version: 0.5.19 resolution: "source-map-support@npm:0.5.19" @@ -25488,15 +26376,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"stack-utils@npm:^1.0.1": - version: 1.0.5 - resolution: "stack-utils@npm:1.0.5" - dependencies: - escape-string-regexp: ^2.0.0 - checksum: f82baf8d89536252a55c76866d5be3d04c96b09693a8d2ab3794b9fdec3674e05bd3f3d19345093e2cbba116a1f8f413858e0537bc3c81c605249261c3d26182 - languageName: node - linkType: hard - "stack-utils@npm:^2.0.3": version: 2.0.5 resolution: "stack-utils@npm:2.0.5" @@ -25506,6 +26385,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99 + languageName: node + linkType: hard + "stackframe@npm:^1.1.1": version: 1.2.0 resolution: "stackframe@npm:1.2.0" @@ -25866,6 +26752,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"strip-literal@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-literal@npm:1.0.0" + dependencies: + acorn: ^8.8.1 + checksum: ada9b60f322ce3e3fd167b65a186ab77a8c76b8f9074dcdbad4c1a810b46f21c9dca30d4d807e98af580cbe99bfbccd6d8176f69183a454ae2868d8ddd6d4f88 + languageName: node + linkType: hard + "style-inject@npm:^0.3.0": version: 0.3.0 resolution: "style-inject@npm:0.3.0" @@ -26420,6 +27315,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"tinybench@npm:^2.3.1": + version: 2.3.1 + resolution: "tinybench@npm:2.3.1" + checksum: 74d45fa546d964a8123f98847fc59550945ed7f0d3e5a4ce0f9596d836b51c1d340c2ae0277a8023c15dc9ea3d7cb948a79173bfc46338c9b367c6323ea1eaf3 + languageName: node + linkType: hard + "tinycolor2@npm:1.4.1": version: 1.4.1 resolution: "tinycolor2@npm:1.4.1" @@ -26427,6 +27329,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"tinypool@npm:^0.3.0": + version: 0.3.0 + resolution: "tinypool@npm:0.3.0" + checksum: 92291c309ed8d004c1ee1ef7f610cd90352383f12c52b0ec16abd9ebc665c03626e7afbc9993df97f63e67fea002b5cc18ba5e8f90260643867cbcac278a183c + languageName: node + linkType: hard + +"tinyspy@npm:^1.0.2": + version: 1.0.2 + resolution: "tinyspy@npm:1.0.2" + checksum: 32096121aa8d52bb625ad62c9314b3e4daba4ab9ac428217b12b1e1dfe9860e3c94d54a7affa279cc70dc6f10d88c6ba46b51de68896b318a06d02f05e87dcc3 + languageName: node + linkType: hard + "title-case@npm:^3.0.3": version: 3.0.3 resolution: "title-case@npm:3.0.3" @@ -26454,6 +27370,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 + languageName: node + linkType: hard + "tmpl@npm:1.0.x": version: 1.0.4 resolution: "tmpl@npm:1.0.4" @@ -26554,6 +27477,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"tough-cookie@npm:^4.1.2": + version: 4.1.2 + resolution: "tough-cookie@npm:4.1.2" + dependencies: + psl: ^1.1.33 + punycode: ^2.1.1 + universalify: ^0.2.0 + url-parse: ^1.5.3 + checksum: a7359e9a3e875121a84d6ba40cc184dec5784af84f67f3a56d1d2ae39b87c0e004e6ba7c7331f9622a7d2c88609032473488b28fe9f59a1fec115674589de39a + languageName: node + linkType: hard + "tr46@npm:^1.0.1": version: 1.0.1 resolution: "tr46@npm:1.0.1" @@ -26572,6 +27507,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: ^2.1.1 + checksum: 44c3cc6767fb800490e6e9fd64fd49041aa4e49e1f6a012b34a75de739cc9ed3a6405296072c1df8b6389ae139c5e7c6496f659cfe13a04a4bff3a1422981270 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -26656,6 +27600,39 @@ fsevents@^1.2.7: languageName: node linkType: hard +"ts-jest@npm:^29": + version: 29.0.5 + resolution: "ts-jest@npm:29.0.5" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^29.0.0 + json5: ^2.2.3 + lodash.memoize: 4.x + make-error: 1.x + semver: 7.x + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: f60f129c2287f4c963d9ee2677132496c5c5a5d39c27ad234199a1140c26318a7d5bda34890ab0e30636ec42a8de28f84487c09e9dcec639c9c67812b3a38373 + languageName: node + linkType: hard + "ts-log@npm:^2.2.3": version: 2.2.3 resolution: "ts-log@npm:2.2.3" @@ -26823,7 +27800,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"type-detect@npm:4.0.8": +"type-detect@npm:4.0.8, type-detect@npm:^4.0.0, type-detect@npm:^4.0.5": version: 4.0.8 resolution: "type-detect@npm:4.0.8" checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 @@ -26990,6 +27967,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"ufo@npm:^1.0.1": + version: 1.0.1 + resolution: "ufo@npm:1.0.1" + checksum: 63024876f21b7cc44267255a8043062046d3215e09212bd682787a13ccf1e0c5d23f7686a7f1bc7ac9f34c7e8a88100af234f42b509db50f17ce638af6ac87cc + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -27228,6 +28212,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 + languageName: node + linkType: hard + "universalify@npm:^2.0.0": version: 2.0.0 resolution: "universalify@npm:2.0.0" @@ -27378,6 +28369,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + languageName: node + linkType: hard + "url@npm:^0.11.0": version: 0.11.0 resolution: "url@npm:0.11.0" @@ -27473,19 +28474,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"util.promisify@npm:^1.0.0": - version: 1.1.1 - resolution: "util.promisify@npm:1.1.1" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - for-each: ^0.3.3 - has-symbols: ^1.0.1 - object.getownpropertydescriptors: ^2.1.1 - checksum: ea371c30b90576862487ae4efd7182aa5855019549a4019d82629acc2709e8ccb0f38944403eebec622fff8ebb44ac3f46a52d745d5f543d30606132a4905f96 - languageName: node - linkType: hard - "util.promisify@npm:~1.0.0": version: 1.0.1 resolution: "util.promisify@npm:1.0.1" @@ -27564,6 +28552,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"v8-to-istanbul@npm:^9.0.1": + version: 9.0.1 + resolution: "v8-to-istanbul@npm:9.0.1" + dependencies: + "@jridgewell/trace-mapping": ^0.3.12 + "@types/istanbul-lib-coverage": ^2.0.1 + convert-source-map: ^1.6.0 + checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 + languageName: node + linkType: hard + "valid-url@npm:1.0.9, valid-url@npm:^1.0.9": version: 1.0.9 resolution: "valid-url@npm:1.0.9" @@ -27645,6 +28644,107 @@ fsevents@^1.2.7: languageName: node linkType: hard +"vite-node@npm:0.27.2": + version: 0.27.2 + resolution: "vite-node@npm:0.27.2" + dependencies: + cac: ^6.7.14 + debug: ^4.3.4 + mlly: ^1.1.0 + pathe: ^0.2.0 + picocolors: ^1.0.0 + source-map: ^0.6.1 + source-map-support: ^0.5.21 + vite: ^3.0.0 || ^4.0.0 + bin: + vite-node: vite-node.mjs + checksum: 4cdb4fd952481548dbece6bc86c339cf806f07d58b9e95e7f9e57e4a4f7d5faaf1629dcea4d2a7366080884c1d82b2794ab595e9e5e003c0cf63f17e32a17d13 + languageName: node + linkType: hard + +"vite@npm:^3.0.0 || ^4.0.0": + version: 4.0.4 + resolution: "vite@npm:4.0.4" + dependencies: + esbuild: ^0.16.3 + fsevents: ~2.3.2 + postcss: ^8.4.20 + resolve: ^1.22.1 + rollup: ^3.7.0 + peerDependencies: + "@types/node": ">= 14" + less: "*" + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: eb86c8cdfe8dcb6644005486b31cb60bc596f2aa683cb194abb5c0afca7c2a5dfdb02bbc7f83f419ad170227ac9c3b898f4406a6d1433105fb61d79d78e47d52 + languageName: node + linkType: hard + +"vitest@npm:^0.27.2": + version: 0.27.2 + resolution: "vitest@npm:0.27.2" + dependencies: + "@types/chai": ^4.3.4 + "@types/chai-subset": ^1.3.3 + "@types/node": "*" + acorn: ^8.8.1 + acorn-walk: ^8.2.0 + cac: ^6.7.14 + chai: ^4.3.7 + debug: ^4.3.4 + local-pkg: ^0.4.2 + picocolors: ^1.0.0 + source-map: ^0.6.1 + strip-literal: ^1.0.0 + tinybench: ^2.3.1 + tinypool: ^0.3.0 + tinyspy: ^1.0.2 + vite: ^3.0.0 || ^4.0.0 + vite-node: 0.27.2 + why-is-node-running: ^2.2.2 + peerDependencies: + "@edge-runtime/vm": "*" + "@vitest/browser": "*" + "@vitest/ui": "*" + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 0c441656f476ed49fb3d0238a070e836272156d80161ff2153397aa06e711abd6779fad6769126840eda2b1d12568b77aea953e14fbad8569cde2d6fb900f165 + languageName: node + linkType: hard + "vm-browserify@npm:^1.0.1": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" @@ -27670,6 +28770,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: ^4.0.0 + checksum: eba070e78deb408ae8defa4d36b429f084b2b47a4741c4a9be3f27a0a3d1845e277e3072b04391a138f7e43776842627d1334e448ff13ff90ad9fb1214ee7091 + languageName: node + linkType: hard + "wait-on@npm:^6.0.1": version: 6.0.1 resolution: "wait-on@npm:6.0.1" @@ -27694,6 +28803,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: 1.0.12 + checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + languageName: node + linkType: hard + "warning@npm:^4.0.3": version: 4.0.3 resolution: "warning@npm:4.0.3" @@ -27792,6 +28910,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + "webpack-bundle-analyzer@npm:^4.4.2, webpack-bundle-analyzer@npm:^4.5.0": version: 4.5.0 resolution: "webpack-bundle-analyzer@npm:4.5.0" @@ -28132,6 +29257,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: 0.6.3 + checksum: 7087810c410aa9b689cbd6af8773341a53cdc1f3aae2a882c163bd5522ec8ca4cdfc269aef417a5792f411807d5d77d50df4c24e3abb00bb60192858a40cc675 + languageName: node + linkType: hard + "whatwg-fetch@npm:^3.4.1, whatwg-fetch@npm:^3.6.2": version: 3.6.2 resolution: "whatwg-fetch@npm:3.6.2" @@ -28146,6 +29280,23 @@ fsevents@^1.2.7: languageName: node linkType: hard +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: ce08bbb36b6aaf64f3a84da89707e3e6a31e5ab1c1a2379fd68df79ba712a4ab090904f0b50e6693b0dafc8e6343a6157e40bf18fdffd26e513cf95ee2a59824 + languageName: node + linkType: hard + +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: ^3.0.0 + webidl-conversions: ^7.0.0 + checksum: ed4826aaa57e66bb3488a4b25c9cd476c46ba96052747388b5801f137dd740b73fde91ad207d96baf9f17fbcc80fc1a477ad65181b5eb5fa718d27c69501d7af + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -28227,6 +29378,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"why-is-node-running@npm:^2.2.2": + version: 2.2.2 + resolution: "why-is-node-running@npm:2.2.2" + dependencies: + siginfo: ^2.0.0 + stackback: 0.0.2 + bin: + why-is-node-running: cli.js + checksum: 50820428f6a82dfc3cbce661570bcae9b658723217359b6037b67e495255409b4c8bc7931745f5c175df71210450464517cab32b2f7458ac9c40b4925065200a + languageName: node + linkType: hard + "wide-align@npm:^1.1.0": version: 1.1.3 resolution: "wide-align@npm:1.1.3" @@ -28571,6 +29734,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"write-file-atomic@npm:^4.0.1": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^3.0.7 + checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c + languageName: node + linkType: hard + "ws@npm:7.4.5": version: 7.4.5 resolution: "ws@npm:7.4.5" @@ -28601,6 +29774,21 @@ fsevents@^1.2.7: languageName: node linkType: hard +"ws@npm:^8.11.0": + version: 8.12.0 + resolution: "ws@npm:8.12.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 818ff3f8749c172a95a114cceb8b89cedd27e43a82d65c7ad0f7882b1e96a2ee6709e3746a903c3fa88beec0c8bae9a9fcd75f20858b32a166dfb7519316a5d7 + languageName: node + linkType: hard + "ws@npm:^8.4.2": version: 8.8.0 resolution: "ws@npm:8.8.0" @@ -28641,6 +29829,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: af100b79c29804f05fa35aa3683e29a321db9b9685d5e5febda3fa1e40f13f85abc40f45a6b2bf7bee33f68a1dc5e8eaef4cec100a304a9db565e6061d4cb5ad + languageName: node + linkType: hard + "xmlchars@npm:^2.2.0": version: 2.2.0 resolution: "xmlchars@npm:2.2.0" @@ -28739,6 +29934,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"yargs-parser@npm:^21.0.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + "yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1"