From 4aaaa51b375bee287677e68ae201f473ef809c6c Mon Sep 17 00:00:00 2001 From: Zachary DeRose Date: Fri, 10 Mar 2023 05:03:09 -0700 Subject: [PATCH] chore: Jest to vitest migration (#5097) * eslint-lugin-query updated * migrating from jest to vitest * fixing error in ci pipeline * adding coverage * re-introduction vi.fn generics and addressing comments * fixes from vi.fn generics second pass * reverting vue-query tsconfig to not use esnext * fixing frozen lock file error * adding coverage option on vitest command * resetting bad merge from alpha * bumping node version in CI --- .github/workflows/ci.yml | 2 +- .github/workflows/pr.yml | 2 +- jest-preset.js | 46 -- jest.setup.js | 9 - package.json | 1 + packages/codemods/jest.config.ts | 4 - packages/codemods/package.json | 2 +- .../v4/__tests__/key-transformation.test.js | 2 - .../replace-import-specifier.test.js | 2 - .../__tests__/remove-overloads.test.js | 2 - packages/codemods/vitest.config.ts | 10 + packages/eslint-plugin-query/jest.config.ts | 4 - packages/eslint-plugin-query/package.json | 2 +- packages/eslint-plugin-query/vitest.config.ts | 10 + .../jest.config.ts | 4 - .../package.json | 2 +- .../src/__tests__/asyncThrottle.test.ts | 12 +- .../vitest.config.ts | 10 + packages/query-core/jest.config.ts | 4 - packages/query-core/package.json | 2 +- .../src/tests/focusManager.test.tsx | 26 +- .../query-core/src/tests/hydration.test.tsx | 29 +- .../src/tests/infiniteQueryBehavior.test.tsx | 16 +- .../src/tests/infiniteQueryObserver.test.tsx | 3 +- .../src/tests/mutationCache.test.tsx | 21 +- .../src/tests/mutationObserver.test.tsx | 5 +- .../query-core/src/tests/mutations.test.tsx | 21 +- .../src/tests/notifyManager.test.tsx | 13 +- .../src/tests/onlineManager.test.tsx | 29 +- .../src/tests/queriesObserver.test.tsx | 35 +- packages/query-core/src/tests/query.test.tsx | 35 +- .../query-core/src/tests/queryCache.test.tsx | 27 +- .../query-core/src/tests/queryClient.test.tsx | 97 +-- .../src/tests/queryObserver.test.tsx | 19 +- packages/query-core/src/tests/utils.test.tsx | 3 +- packages/query-core/src/tests/utils.ts | 9 +- packages/query-core/vitest.config.ts | 11 + .../query-persist-client-core/jest.config.ts | 4 - .../query-persist-client-core/package.json | 2 +- .../src/__tests__/persist.test.ts | 5 +- .../src/__tests__/utils.ts | 7 +- .../vitest.config.ts | 16 + .../jest.config.ts | 4 - .../query-sync-storage-persister/package.json | 2 +- .../vitest.config.ts | 22 + packages/react-query-devtools/jest.config.ts | 5 - packages/react-query-devtools/package.json | 2 +- .../src/__tests__/Explorer.test.tsx | 5 +- .../src/__tests__/devtools.test.tsx | 17 +- .../{jest.setup.ts => test-setup.ts} | 0 .../react-query-devtools/vitest.config.ts | 25 + .../react-query-persist-client/jest.config.ts | 5 - .../react-query-persist-client/package.json | 2 +- .../PersistQueryClientProvider.test.tsx | 15 +- .../{jest.setup.ts => test-setup.ts} | 0 .../vitest.config.ts | 25 + packages/react-query/jest.config.ts | 6 - packages/react-query/package.json | 2 +- .../src/__tests__/HydrationBoundary.test.tsx | 7 +- .../__tests__/QueryClientProvider.test.tsx | 3 +- .../QueryResetErrorBoundary.test.tsx | 23 +- .../src/__tests__/ssr-hydration.test.tsx | 21 +- .../react-query/src/__tests__/ssr.test.tsx | 11 +- .../src/__tests__/suspense.test.tsx | 27 +- .../src/__tests__/useInfiniteQuery.test.tsx | 34 +- .../src/__tests__/useMutation.test.tsx | 41 +- .../src/__tests__/useMutationState.test.tsx | 59 +- .../src/__tests__/useQueries.test.tsx | 86 +-- .../src/__tests__/useQuery.test.tsx | 66 +-- packages/react-query/src/__tests__/utils.tsx | 5 +- .../{jest.setup.ts => test-setup.ts} | 0 packages/react-query/vitest.config.ts | 18 + packages/solid-query/jest-preset.js | 7 - packages/solid-query/jest.config.ts | 5 - packages/solid-query/package.json | 5 +- .../__tests__/QueryClientProvider.test.tsx | 3 +- .../__tests__/createInfiniteQuery.test.tsx | 34 +- .../src/__tests__/createMutation.test.tsx | 37 +- .../src/__tests__/createQueries.test.tsx | 28 +- .../src/__tests__/createQuery.test.tsx | 52 +- .../src/__tests__/suspense.test.tsx | 11 +- .../src/__tests__/useIsMutating.test.tsx | 62 +- packages/solid-query/src/__tests__/utils.tsx | 5 +- packages/solid-query/transform.js | 9 - packages/solid-query/vitest.config.ts | 21 + packages/vue-query/jest.config.ts | 4 - packages/vue-query/package.json | 6 +- .../vue-query/src/__mocks__/useBaseQuery.ts | 7 +- .../vue-query/src/__mocks__/useQueryClient.ts | 3 +- .../src/__tests__/mutationCache.test.ts | 5 +- .../src/__tests__/queryCache.test.ts | 5 +- .../src/__tests__/queryClient.test.ts | 3 +- .../src/__tests__/useInfiniteQuery.test.ts | 3 +- .../src/__tests__/useIsFetching.test.ts | 6 +- .../src/__tests__/useIsMutating.test.ts | 3 +- .../src/__tests__/useMutation.test.ts | 25 +- .../src/__tests__/useQueries.test.ts | 10 +- .../vue-query/src/__tests__/useQuery.test.ts | 18 +- .../src/__tests__/useQueryClient.test.ts | 10 +- .../src/__tests__/vueQueryPlugin.test.ts | 46 +- packages/vue-query/src/devtools/devtools.ts | 2 +- packages/vue-query/src/useBaseQuery.ts | 6 +- packages/vue-query/test-setup.ts | 12 + packages/vue-query/tsconfig.json | 4 +- packages/vue-query/vitest.config.ts | 19 + pnpm-lock.yaml | 559 +++++++++++------- 106 files changed, 1130 insertions(+), 1008 deletions(-) delete mode 100644 jest-preset.js delete mode 100644 jest.setup.js delete mode 100644 packages/codemods/jest.config.ts create mode 100644 packages/codemods/vitest.config.ts delete mode 100644 packages/eslint-plugin-query/jest.config.ts create mode 100644 packages/eslint-plugin-query/vitest.config.ts delete mode 100644 packages/query-async-storage-persister/jest.config.ts create mode 100644 packages/query-async-storage-persister/vitest.config.ts delete mode 100644 packages/query-core/jest.config.ts create mode 100644 packages/query-core/vitest.config.ts delete mode 100644 packages/query-persist-client-core/jest.config.ts create mode 100644 packages/query-persist-client-core/vitest.config.ts delete mode 100644 packages/query-sync-storage-persister/jest.config.ts create mode 100644 packages/query-sync-storage-persister/vitest.config.ts delete mode 100644 packages/react-query-devtools/jest.config.ts rename packages/react-query-devtools/{jest.setup.ts => test-setup.ts} (100%) create mode 100644 packages/react-query-devtools/vitest.config.ts delete mode 100644 packages/react-query-persist-client/jest.config.ts rename packages/react-query-persist-client/{jest.setup.ts => test-setup.ts} (100%) create mode 100644 packages/react-query-persist-client/vitest.config.ts delete mode 100644 packages/react-query/jest.config.ts rename packages/react-query/{jest.setup.ts => test-setup.ts} (100%) create mode 100644 packages/react-query/vitest.config.ts delete mode 100644 packages/solid-query/jest-preset.js delete mode 100644 packages/solid-query/jest.config.ts delete mode 100644 packages/solid-query/transform.js create mode 100644 packages/solid-query/vitest.config.ts delete mode 100644 packages/vue-query/jest.config.ts create mode 100644 packages/vue-query/test-setup.ts create mode 100644 packages/vue-query/vitest.config.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 68ebc8e171..955225630f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: version: 7 - uses: actions/setup-node@v3 with: - node-version: 16.14.2 + node-version: 16.19.0 registry-url: https://registry.npmjs.org/ cache: 'pnpm' - name: Install dependencies diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index b49220ecb9..22fac1f9f2 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -11,7 +11,7 @@ jobs: version: 7 - uses: actions/setup-node@v3 with: - node-version: 16.14.2 + node-version: 16.19.0 cache: 'pnpm' - name: Install dependencies run: pnpm --filter "./packages/**" --filter query --prefer-offline install diff --git a/jest-preset.js b/jest-preset.js deleted file mode 100644 index d26fda9caf..0000000000 --- a/jest-preset.js +++ /dev/null @@ -1,46 +0,0 @@ -const path = require('path') -const { lstatSync, readdirSync } = require('fs') - -// get listing of packages in the mono repo -const basePath = path.resolve(__dirname, 'packages') -const packages = readdirSync(basePath) - .filter((name) => { - return lstatSync(path.join(basePath, name)).isDirectory() - }) - .sort((a, b) => b.length - a.length) - -const { namespace } = require('./package.json') - -const moduleNameMapper = { - ...packages.reduce( - (acc, name) => ({ - ...acc, - [`${namespace}/${name}(.*)$`]: `/../../packages/./${name}/src/$1`, - }), - {}, - ), -} - -module.exports = { - collectCoverage: true, - coverageReporters: ['json', 'lcov', 'text', 'clover', 'text-summary'], - testMatch: ['/**/src/**/*.test.[jt]s?(x)'], - transform: { - '^.+\\.(ts|tsx)$': [ - 'ts-jest', - { - isolatedModules: true, - diagnostics: { - exclude: ['**'], - }, - }, - ], - }, - setupFilesAfterEnv: ['../../jest.setup.js'], - clearMocks: true, - testEnvironment: 'jsdom', - snapshotFormat: { - printBasicPrototype: false, - }, - moduleNameMapper, -} diff --git a/jest.setup.js b/jest.setup.js deleted file mode 100644 index 71f8493ea3..0000000000 --- a/jest.setup.js +++ /dev/null @@ -1,9 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const failOnConsole = require('jest-fail-on-console') -const { TextEncoder } = require('util') - -failOnConsole() - -// jsdom assumes the availability of a global TextEncoder, which jest-environment-jsdom does not provide -// eslint-disable-next-line no-undef -globalThis.TextEncoder = TextEncoder diff --git a/package.json b/package.json index fa963ff451..ced7746c0d 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,7 @@ "ts-jest": "^29.0.5", "ts-node": "^10.9.1", "typescript": "4.7.4", + "vitest": "^0.27.1", "vue": "^3.2.47" }, "bundlewatch": { diff --git a/packages/codemods/jest.config.ts b/packages/codemods/jest.config.ts deleted file mode 100644 index 4af30741b6..0000000000 --- a/packages/codemods/jest.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default { - displayName: 'query-codemods', - preset: '../../jest-preset.js' -} diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 28b6d5df84..0b0ff13f3a 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -16,7 +16,7 @@ "sideEffects": false, "scripts": { "test:eslint": "eslint --ext .ts,.tsx ./src", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch" }, "files": [ diff --git a/packages/codemods/src/v4/__tests__/key-transformation.test.js b/packages/codemods/src/v4/__tests__/key-transformation.test.js index 99a06d5e67..f66cd38204 100644 --- a/packages/codemods/src/v4/__tests__/key-transformation.test.js +++ b/packages/codemods/src/v4/__tests__/key-transformation.test.js @@ -1,8 +1,6 @@ // eslint-disable-next-line @typescript-eslint/no-var-requires const defineTest = require('jscodeshift/dist/testUtils').defineTest -jest.autoMockOff() - defineTest(__dirname, 'key-transformation', null, 'default-import', { parser: 'tsx', }) diff --git a/packages/codemods/src/v4/__tests__/replace-import-specifier.test.js b/packages/codemods/src/v4/__tests__/replace-import-specifier.test.js index b56cd04fe3..f51ac94ee4 100644 --- a/packages/codemods/src/v4/__tests__/replace-import-specifier.test.js +++ b/packages/codemods/src/v4/__tests__/replace-import-specifier.test.js @@ -1,8 +1,6 @@ // eslint-disable-next-line @typescript-eslint/no-var-requires const defineTest = require('jscodeshift/dist/testUtils').defineTest -jest.autoMockOff() - defineTest( __dirname, 'replace-import-specifier', diff --git a/packages/codemods/src/v5/remove-overloads/__tests__/remove-overloads.test.js b/packages/codemods/src/v5/remove-overloads/__tests__/remove-overloads.test.js index a8be29a69a..69363eae1e 100644 --- a/packages/codemods/src/v5/remove-overloads/__tests__/remove-overloads.test.js +++ b/packages/codemods/src/v5/remove-overloads/__tests__/remove-overloads.test.js @@ -1,8 +1,6 @@ // eslint-disable-next-line @typescript-eslint/no-var-requires const defineTest = require('jscodeshift/dist/testUtils').defineTest -jest.autoMockOff() - defineTest(__dirname, 'remove-overloads', null, 'default-import', { parser: 'tsx', }) diff --git a/packages/codemods/vitest.config.ts b/packages/codemods/vitest.config.ts new file mode 100644 index 0000000000..b3934e5fae --- /dev/null +++ b/packages/codemods/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'codemods', + watch: false, + globals: true, + coverage: { provider: 'istanbul' }, + }, +}) diff --git a/packages/eslint-plugin-query/jest.config.ts b/packages/eslint-plugin-query/jest.config.ts deleted file mode 100644 index 17a8c2c914..0000000000 --- a/packages/eslint-plugin-query/jest.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default { - displayName: 'eslint-plugin-query', - preset: '../../jest-preset.js', -} diff --git a/packages/eslint-plugin-query/package.json b/packages/eslint-plugin-query/package.json index 9bbf3c7c3a..a9e2bab42f 100644 --- a/packages/eslint-plugin-query/package.json +++ b/packages/eslint-plugin-query/package.json @@ -16,7 +16,7 @@ "dev": "tsup --watch --sourcemap", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build": "tsup --minify" }, diff --git a/packages/eslint-plugin-query/vitest.config.ts b/packages/eslint-plugin-query/vitest.config.ts new file mode 100644 index 0000000000..c44be1b9a8 --- /dev/null +++ b/packages/eslint-plugin-query/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'eslint-plugin-query', + watch: false, + globals: true, + coverage: { provider: 'istanbul' }, + }, +}) diff --git a/packages/query-async-storage-persister/jest.config.ts b/packages/query-async-storage-persister/jest.config.ts deleted file mode 100644 index c4f2eb945d..0000000000 --- a/packages/query-async-storage-persister/jest.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default { - displayName: 'query-async-storage-persister', - preset: '../../jest-preset.js', -} diff --git a/packages/query-async-storage-persister/package.json b/packages/query-async-storage-persister/package.json index 47cf192484..2bb1ea6907 100644 --- a/packages/query-async-storage-persister/package.json +++ b/packages/query-async-storage-persister/package.json @@ -31,7 +31,7 @@ "clean": "rimraf ./build", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build" }, diff --git a/packages/query-async-storage-persister/src/__tests__/asyncThrottle.test.ts b/packages/query-async-storage-persister/src/__tests__/asyncThrottle.test.ts index d1cf9567fe..87d2f87b42 100644 --- a/packages/query-async-storage-persister/src/__tests__/asyncThrottle.test.ts +++ b/packages/query-async-storage-persister/src/__tests__/asyncThrottle.test.ts @@ -1,11 +1,12 @@ import { asyncThrottle } from '../asyncThrottle' import { sleep as delay } from './utils' +import { vi } from 'vitest' describe('asyncThrottle', () => { test('basic', async () => { const interval = 10 const execTimeStamps: number[] = [] - const mockFunc = jest.fn( + const mockFunc = vi.fn( async (id: number, complete?: (value?: unknown) => void) => { await delay(1) execTimeStamps.push(Date.now()) @@ -33,7 +34,7 @@ describe('asyncThrottle', () => { test('Bug #3331 case 1: Special timing', async () => { const interval = 1000 const execTimeStamps: number[] = [] - const mockFunc = jest.fn( + const mockFunc = vi.fn( async (id: number, complete?: (value?: unknown) => void) => { await delay(30) execTimeStamps.push(Date.now()) @@ -62,7 +63,7 @@ describe('asyncThrottle', () => { test('Bug #3331 case 2: "func" execution time is greater than the interval.', async () => { const interval = 1000 const execTimeStamps: number[] = [] - const mockFunc = jest.fn( + const mockFunc = vi.fn( async (id: number, complete?: (value?: unknown) => void) => { await delay(interval + 10) execTimeStamps.push(Date.now()) @@ -86,7 +87,7 @@ describe('asyncThrottle', () => { }) test('"func" throw error not break next invoke', async () => { - const mockFunc = jest.fn( + const mockFunc = vi.fn( async (id: number, complete?: (value?: unknown) => void) => { if (id === 1) throw new Error('error') await delay(1) @@ -105,11 +106,10 @@ describe('asyncThrottle', () => { expect(mockFunc.mock.calls[1]?.[0]).toBe(2) }) - test('"onError" should be called when "func" throw error', (done) => { + test('"onError" should be called when "func" throw error', () => { const err = new Error('error') const handleError = (e: unknown) => { expect(e).toBe(err) - done() } const testFunc = asyncThrottle( diff --git a/packages/query-async-storage-persister/vitest.config.ts b/packages/query-async-storage-persister/vitest.config.ts new file mode 100644 index 0000000000..dc1f523e67 --- /dev/null +++ b/packages/query-async-storage-persister/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'query-async-storage-persister', + watch: false, + globals: true, + coverage: { provider: 'istanbul' }, + }, +}) diff --git a/packages/query-core/jest.config.ts b/packages/query-core/jest.config.ts deleted file mode 100644 index a6563d822f..0000000000 --- a/packages/query-core/jest.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default { - displayName: 'query-core', - preset: '../../jest-preset.js', -} diff --git a/packages/query-core/package.json b/packages/query-core/package.json index 6c4051e357..6ca0c58852 100644 --- a/packages/query-core/package.json +++ b/packages/query-core/package.json @@ -31,7 +31,7 @@ "clean": "rimraf ./build", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build" } diff --git a/packages/query-core/src/tests/focusManager.test.tsx b/packages/query-core/src/tests/focusManager.test.tsx index 68b6bdfcd5..c4f457e447 100644 --- a/packages/query-core/src/tests/focusManager.test.tsx +++ b/packages/query-core/src/tests/focusManager.test.tsx @@ -1,17 +1,18 @@ import { sleep } from '../utils' import { FocusManager } from '../focusManager' import { setIsServer } from './utils' +import { vi } from 'vitest' describe('focusManager', () => { let focusManager: FocusManager beforeEach(() => { - jest.resetModules() + vi.resetModules() focusManager = new FocusManager() }) it('should call previous remove handler when replacing an event listener', () => { - const remove1Spy = jest.fn() - const remove2Spy = jest.fn() + const remove1Spy = vi.fn() + const remove2Spy = vi.fn() focusManager.setEventListener(() => remove1Spy) focusManager.setEventListener(() => remove2Spy) @@ -39,7 +40,7 @@ describe('focusManager', () => { }) it('should not notify listeners on focus if already focused', async () => { - const subscriptionSpy = jest.fn() + const subscriptionSpy = vi.fn() const unsubscribe = focusManager.subscribe(subscriptionSpy) focusManager.setFocused(true) @@ -66,7 +67,7 @@ describe('focusManager', () => { test('cleanup (removeEventListener) should not be called if window is not defined', async () => { const restoreIsServer = setIsServer(true) - const removeEventListenerSpy = jest.spyOn(globalThis, 'removeEventListener') + const removeEventListenerSpy = vi.spyOn(globalThis, 'removeEventListener') const unsubscribe = focusManager.subscribe(() => undefined) @@ -83,7 +84,7 @@ describe('focusManager', () => { // @ts-expect-error globalThis.window.addEventListener = undefined - const removeEventListenerSpy = jest.spyOn(globalThis, 'removeEventListener') + const removeEventListenerSpy = vi.spyOn(globalThis, 'removeEventListener') const unsubscribe = focusManager.subscribe(() => undefined) @@ -95,8 +96,8 @@ describe('focusManager', () => { }) it('should replace default window listener when a new event listener is set', async () => { - const unsubscribeSpy = jest.fn().mockImplementation(() => undefined) - const handlerSpy = jest.fn().mockImplementation(() => unsubscribeSpy) + const unsubscribeSpy = vi.fn().mockImplementation(() => undefined) + const handlerSpy = vi.fn().mockImplementation(() => unsubscribeSpy) focusManager.setEventListener(() => handlerSpy()) @@ -115,12 +116,9 @@ describe('focusManager', () => { }) test('should call removeEventListener when last listener unsubscribes', () => { - const addEventListenerSpy = jest.spyOn( - globalThis.window, - 'addEventListener', - ) + const addEventListenerSpy = vi.spyOn(globalThis.window, 'addEventListener') - const removeEventListenerSpy = jest.spyOn( + const removeEventListenerSpy = vi.spyOn( globalThis.window, 'removeEventListener', ) @@ -136,7 +134,7 @@ describe('focusManager', () => { }) test('should keep setup function even if last listener unsubscribes', () => { - const setupSpy = jest.fn().mockImplementation(() => () => undefined) + const setupSpy = vi.fn().mockImplementation(() => () => undefined) focusManager.setEventListener(setupSpy) diff --git a/packages/query-core/src/tests/hydration.test.tsx b/packages/query-core/src/tests/hydration.test.tsx index c78a6643cd..9093c39671 100644 --- a/packages/query-core/src/tests/hydration.test.tsx +++ b/packages/query-core/src/tests/hydration.test.tsx @@ -6,6 +6,7 @@ import { } from './utils' import { QueryCache } from '../queryCache' import { dehydrate, hydrate } from '../hydration' +import { vi } from 'vitest' async function fetchData(value: TData, ms?: number): Promise { await sleep(ms || 0) @@ -67,7 +68,7 @@ describe('dehydration and rehydration', () => { key: [{ nestedKey: 1 }], }) - const fetchDataAfterHydration = jest.fn() + const fetchDataAfterHydration = vi.fn() await hydrationClient.prefetchQuery({ queryKey: ['string'], queryFn: fetchDataAfterHydration, @@ -192,7 +193,7 @@ describe('dehydration and rehydration', () => { })?.state.data, ).toBe('string') - const fetchDataAfterHydration = jest.fn() + const fetchDataAfterHydration = vi.fn() await hydrationClient.prefetchQuery({ queryKey: ['string', { key: ['string'], key2: 0 }], queryFn: fetchDataAfterHydration, @@ -205,7 +206,7 @@ describe('dehydration and rehydration', () => { }) test('should only hydrate successful queries by default', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) const queryCache = new QueryCache() @@ -341,18 +342,18 @@ describe('dehydration and rehydration', () => { }) test('should be able to dehydrate mutations and continue on hydration', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) const onlineMock = mockNavigatorOnLine(false) - const serverAddTodo = jest + const serverAddTodo = vi .fn() .mockImplementation(() => Promise.reject(new Error('offline'))) - const serverOnMutate = jest.fn().mockImplementation((variables) => { + const serverOnMutate = vi.fn().mockImplementation((variables) => { const optimisticTodo = { id: 1, text: variables.text } return { optimisticTodo } }) - const serverOnSuccess = jest.fn() + const serverOnSuccess = vi.fn() const serverClient = createQueryClient() @@ -386,14 +387,14 @@ describe('dehydration and rehydration', () => { const parsed = JSON.parse(stringified) const client = createQueryClient() - const clientAddTodo = jest.fn().mockImplementation((variables) => { + const clientAddTodo = vi.fn().mockImplementation((variables) => { return { id: 2, text: variables.text } }) - const clientOnMutate = jest.fn().mockImplementation((variables) => { + const clientOnMutate = vi.fn().mockImplementation((variables) => { const optimisticTodo = { id: 1, text: variables.text } return { optimisticTodo } }) - const clientOnSuccess = jest.fn() + const clientOnSuccess = vi.fn() client.setMutationDefaults(['addTodo'], { mutationFn: clientAddTodo, @@ -422,10 +423,10 @@ describe('dehydration and rehydration', () => { }) test('should not dehydrate mutations if dehydrateMutations is set to false', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const serverAddTodo = jest + const serverAddTodo = vi .fn() .mockImplementation(() => Promise.reject(new Error('offline'))) @@ -454,10 +455,10 @@ describe('dehydration and rehydration', () => { }) test('should not dehydrate mutation if mutation state is set to pause', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const serverAddTodo = jest + const serverAddTodo = vi .fn() .mockImplementation(() => Promise.reject(new Error('offline'))) diff --git a/packages/query-core/src/tests/infiniteQueryBehavior.test.tsx b/packages/query-core/src/tests/infiniteQueryBehavior.test.tsx index 86ec02c485..cc96c8d8df 100644 --- a/packages/query-core/src/tests/infiniteQueryBehavior.test.tsx +++ b/packages/query-core/src/tests/infiniteQueryBehavior.test.tsx @@ -1,10 +1,8 @@ import { waitFor } from '@testing-library/react' -import type { - QueryClient, - InfiniteQueryObserverResult, -} from '@tanstack/query-core' -import { InfiniteQueryObserver, CancelledError } from '@tanstack/query-core' +import type { QueryClient, InfiniteQueryObserverResult } from '..' +import { InfiniteQueryObserver, CancelledError } from '..' import { createQueryClient, queryKey, sleep } from './utils' +import { vi } from 'vitest' describe('InfiniteQueryBehavior', () => { let queryClient: QueryClient @@ -50,7 +48,7 @@ describe('InfiniteQueryBehavior', () => { const key = queryKey() let abortSignal: AbortSignal | null = null - const queryFnSpy = jest.fn().mockImplementation(({ pageParam, signal }) => { + const queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => { abortSignal = signal return pageParam }) @@ -185,7 +183,7 @@ describe('InfiniteQueryBehavior', () => { const key = queryKey() let abortSignal: AbortSignal | null = null - const queryFnSpy = jest.fn().mockImplementation(({ pageParam, signal }) => { + const queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => { abortSignal = signal sleep(10) return pageParam @@ -236,7 +234,7 @@ describe('InfiniteQueryBehavior', () => { const key = queryKey() let abortSignal: AbortSignal | null = null - let queryFnSpy = jest.fn().mockImplementation(({ pageParam, signal }) => { + let queryFnSpy = vi.fn().mockImplementation(({ pageParam, signal }) => { abortSignal = signal return pageParam }) @@ -284,7 +282,7 @@ describe('InfiniteQueryBehavior', () => { signal: abortSignal, }) - queryFnSpy = jest.fn().mockImplementation(({ pageParam = 1, signal }) => { + queryFnSpy = vi.fn().mockImplementation(({ pageParam = 1, signal }) => { abortSignal = signal sleep(10) return pageParam diff --git a/packages/query-core/src/tests/infiniteQueryObserver.test.tsx b/packages/query-core/src/tests/infiniteQueryObserver.test.tsx index 302183af1a..dbf9ded219 100644 --- a/packages/query-core/src/tests/infiniteQueryObserver.test.tsx +++ b/packages/query-core/src/tests/infiniteQueryObserver.test.tsx @@ -1,6 +1,7 @@ import { createQueryClient, queryKey, sleep } from './utils' import type { QueryClient } from '..' import { InfiniteQueryObserver } from '..' +import { vi } from 'vitest' describe('InfiniteQueryObserver', () => { let queryClient: QueryClient @@ -43,7 +44,7 @@ describe('InfiniteQueryObserver', () => { } const key = queryKey() - const queryFn = jest.fn(() => 1) + const queryFn = vi.fn(() => 1) const observer = new InfiniteQueryObserver(queryClient, { meta, queryKey: key, diff --git a/packages/query-core/src/tests/mutationCache.test.tsx b/packages/query-core/src/tests/mutationCache.test.tsx index a54d79a9b3..19bf7fc43c 100644 --- a/packages/query-core/src/tests/mutationCache.test.tsx +++ b/packages/query-core/src/tests/mutationCache.test.tsx @@ -1,14 +1,15 @@ import { waitFor } from '@testing-library/react' import { queryKey, sleep, executeMutation, createQueryClient } from './utils' import { MutationCache, MutationObserver } from '..' +import { vi } from 'vitest' describe('mutationCache', () => { describe('MutationCacheConfig error callbacks', () => { test('should call onError and onSettled when a mutation errors', async () => { const key = queryKey() - const onError = jest.fn() - const onSuccess = jest.fn() - const onSettled = jest.fn() + const onError = vi.fn() + const onSuccess = vi.fn() + const onSettled = vi.fn() const testCache = new MutationCache({ onError, onSuccess, onSettled }) const testClient = createQueryClient({ mutationCache: testCache }) @@ -86,9 +87,9 @@ describe('mutationCache', () => { describe('MutationCacheConfig success callbacks', () => { test('should call onSuccess and onSettled when a mutation is successful', async () => { const key = queryKey() - const onError = jest.fn() - const onSuccess = jest.fn() - const onSettled = jest.fn() + const onError = vi.fn() + const onSuccess = vi.fn() + const onSettled = vi.fn() const testCache = new MutationCache({ onError, onSuccess, onSettled }) const testClient = createQueryClient({ mutationCache: testCache }) @@ -163,7 +164,7 @@ describe('mutationCache', () => { describe('MutationCacheConfig.onMutate', () => { test('should be called before a mutation executes', async () => { const key = queryKey() - const onMutate = jest.fn() + const onMutate = vi.fn() const testCache = new MutationCache({ onMutate }) const testClient = createQueryClient({ mutationCache: testCache }) @@ -286,7 +287,7 @@ describe('mutationCache', () => { test('should remove unused mutations after gcTime has elapsed', async () => { const testCache = new MutationCache() const testClient = createQueryClient({ mutationCache: testCache }) - const onSuccess = jest.fn() + const onSuccess = vi.fn() await executeMutation( testClient, { @@ -329,7 +330,7 @@ describe('mutationCache', () => { test('should be garbage collected later when unsubscribed and mutation is pending', async () => { const queryClient = createQueryClient() - const onSuccess = jest.fn() + const onSuccess = vi.fn() const observer = new MutationObserver(queryClient, { gcTime: 10, mutationFn: async () => { @@ -355,7 +356,7 @@ describe('mutationCache', () => { test('should call callbacks even with gcTime 0 and mutation still pending', async () => { const queryClient = createQueryClient() - const onSuccess = jest.fn() + const onSuccess = vi.fn() const observer = new MutationObserver(queryClient, { gcTime: 0, mutationFn: async () => { diff --git a/packages/query-core/src/tests/mutationObserver.test.tsx b/packages/query-core/src/tests/mutationObserver.test.tsx index 7af9534222..2bb5014a90 100644 --- a/packages/query-core/src/tests/mutationObserver.test.tsx +++ b/packages/query-core/src/tests/mutationObserver.test.tsx @@ -2,6 +2,7 @@ import { waitFor } from '@testing-library/react' import { createQueryClient, sleep } from './utils' import type { QueryClient } from '..' import { MutationObserver } from '..' +import { vi } from 'vitest' describe('mutationObserver', () => { let queryClient: QueryClient @@ -23,8 +24,8 @@ describe('mutationObserver', () => { }, }) - const subscription1Handler = jest.fn() - const subscription2Handler = jest.fn() + const subscription1Handler = vi.fn() + const subscription2Handler = vi.fn() const unsubscribe1 = mutation.subscribe(subscription1Handler) const unsubscribe2 = mutation.subscribe(subscription2Handler) diff --git a/packages/query-core/src/tests/mutations.test.tsx b/packages/query-core/src/tests/mutations.test.tsx index 67b9b6fc77..2cff57ec04 100644 --- a/packages/query-core/src/tests/mutations.test.tsx +++ b/packages/query-core/src/tests/mutations.test.tsx @@ -2,6 +2,7 @@ import type { QueryClient } from '..' import { createQueryClient, executeMutation, queryKey, sleep } from './utils' import type { MutationState } from '../mutation' import { MutationObserver } from '../mutationObserver' +import { vi } from 'vitest' import { waitFor } from '@testing-library/react' describe('mutations', () => { @@ -33,7 +34,7 @@ describe('mutations', () => { test('setMutationDefaults should be able to set defaults', async () => { const key = queryKey() - const fn = jest.fn() + const fn = vi.fn() queryClient.setMutationDefaults(key, { mutationFn: fn, @@ -250,9 +251,9 @@ describe('mutations', () => { test('should be able to restore a mutation', async () => { const key = queryKey() - const onMutate = jest.fn() - const onSuccess = jest.fn() - const onSettled = jest.fn() + const onMutate = vi.fn() + const onSuccess = vi.fn() + const onSettled = vi.fn() queryClient.setMutationDefaults(key, { mutationFn: async (text: string) => text, @@ -317,7 +318,7 @@ describe('mutations', () => { const observer = new MutationObserver(queryClient, {}) const currentMutation = mutationCache.build(queryClient, {}) - const fn = jest.fn() + const fn = vi.fn() const unsubscribe = mutationCache.subscribe((event) => { fn(event.type) @@ -348,8 +349,8 @@ describe('mutations', () => { }) test('mutate update the mutation state even without an active subscription', async () => { - const onSuccess = jest.fn() - const onSettled = jest.fn() + const onSuccess = vi.fn() + const onSettled = vi.fn() const mutation = new MutationObserver(queryClient, { mutationFn: async () => { @@ -364,8 +365,8 @@ describe('mutations', () => { }) test('mutate update the mutation state even without an active subscription', async () => { - const onSuccess = jest.fn() - const onSettled = jest.fn() + const onSuccess = vi.fn() + const onSettled = vi.fn() const mutation = new MutationObserver(queryClient, { mutationFn: async () => { @@ -380,7 +381,7 @@ describe('mutations', () => { }) test('mutation callbacks should see updated options', async () => { - const onSuccess = jest.fn() + const onSuccess = vi.fn() const mutation = new MutationObserver(queryClient, { mutationFn: async () => { diff --git a/packages/query-core/src/tests/notifyManager.test.tsx b/packages/query-core/src/tests/notifyManager.test.tsx index 3464b522e5..cdd26eab4c 100644 --- a/packages/query-core/src/tests/notifyManager.test.tsx +++ b/packages/query-core/src/tests/notifyManager.test.tsx @@ -1,10 +1,11 @@ import { createNotifyManager } from '../notifyManager' import { sleep } from './utils' +import { vi } from 'vitest' describe('notifyManager', () => { it('should use default notifyFn', async () => { const notifyManagerTest = createNotifyManager() - const callbackSpy = jest.fn() + const callbackSpy = vi.fn() notifyManagerTest.schedule(callbackSpy) await sleep(1) expect(callbackSpy).toHaveBeenCalled() @@ -12,13 +13,13 @@ describe('notifyManager', () => { it('should use default batchNotifyFn', async () => { const notifyManagerTest = createNotifyManager() - const callbackScheduleSpy = jest + const callbackScheduleSpy = vi .fn() .mockImplementation(async () => await sleep(20)) - const callbackBatchLevel2Spy = jest.fn().mockImplementation(async () => { + const callbackBatchLevel2Spy = vi.fn().mockImplementation(async () => { notifyManagerTest.schedule(callbackScheduleSpy) }) - const callbackBatchLevel1Spy = jest.fn().mockImplementation(async () => { + const callbackBatchLevel1Spy = vi.fn().mockImplementation(async () => { notifyManagerTest.batch(callbackBatchLevel2Spy) }) @@ -32,13 +33,13 @@ describe('notifyManager', () => { it('should notify if error is thrown', async () => { const notifyManagerTest = createNotifyManager() - const notifySpy = jest.fn() + const notifySpy = vi.fn() notifyManagerTest.setNotifyFunction(notifySpy) try { notifyManagerTest.batch(() => { - notifyManagerTest.schedule(jest.fn) + notifyManagerTest.schedule(vi.fn) throw new Error('Foo') }) } catch {} diff --git a/packages/query-core/src/tests/onlineManager.test.tsx b/packages/query-core/src/tests/onlineManager.test.tsx index 78cf936977..27e8e8902c 100644 --- a/packages/query-core/src/tests/onlineManager.test.tsx +++ b/packages/query-core/src/tests/onlineManager.test.tsx @@ -1,5 +1,6 @@ import { OnlineManager } from '../onlineManager' import { setIsServer, sleep } from './utils' +import { vi } from 'vitest' describe('onlineManager', () => { let onlineManager: OnlineManager @@ -8,7 +9,7 @@ describe('onlineManager', () => { }) test('isOnline should return true if navigator is undefined', () => { - const navigatorSpy = jest.spyOn(globalThis, 'navigator', 'get') + const navigatorSpy = vi.spyOn(globalThis, 'navigator', 'get') // Force navigator to be undefined //@ts-expect-error @@ -19,7 +20,7 @@ describe('onlineManager', () => { }) test('isOnline should return true if navigator.onLine is true', () => { - const navigatorSpy = jest.spyOn(navigator, 'onLine', 'get') + const navigatorSpy = vi.spyOn(navigator, 'onLine', 'get') navigatorSpy.mockImplementation(() => true) expect(onlineManager.isOnline()).toBeTruthy() @@ -46,8 +47,8 @@ describe('onlineManager', () => { }) test('setEventListener should call previous remove handler when replacing an event listener', () => { - const remove1Spy = jest.fn() - const remove2Spy = jest.fn() + const remove1Spy = vi.fn() + const remove2Spy = vi.fn() onlineManager.setEventListener(() => remove1Spy) onlineManager.setEventListener(() => remove2Spy) @@ -59,7 +60,7 @@ describe('onlineManager', () => { test('cleanup (removeEventListener) should not be called if window is not defined', async () => { const restoreIsServer = setIsServer(true) - const removeEventListenerSpy = jest.spyOn(globalThis, 'removeEventListener') + const removeEventListenerSpy = vi.spyOn(globalThis, 'removeEventListener') const unsubscribe = onlineManager.subscribe(() => undefined) @@ -76,7 +77,7 @@ describe('onlineManager', () => { // @ts-expect-error globalThis.window.addEventListener = undefined - const removeEventListenerSpy = jest.spyOn(globalThis, 'removeEventListener') + const removeEventListenerSpy = vi.spyOn(globalThis, 'removeEventListener') const unsubscribe = onlineManager.subscribe(() => undefined) @@ -88,12 +89,9 @@ describe('onlineManager', () => { }) test('it should replace default window listener when a new event listener is set', async () => { - const addEventListenerSpy = jest.spyOn( - globalThis.window, - 'addEventListener', - ) + const addEventListenerSpy = vi.spyOn(globalThis.window, 'addEventListener') - const removeEventListenerSpy = jest.spyOn( + const removeEventListenerSpy = vi.spyOn( globalThis.window, 'removeEventListener', ) @@ -116,12 +114,9 @@ describe('onlineManager', () => { }) test('should call removeEventListener when last listener unsubscribes', () => { - const addEventListenerSpy = jest.spyOn( - globalThis.window, - 'addEventListener', - ) + const addEventListenerSpy = vi.spyOn(globalThis.window, 'addEventListener') - const removeEventListenerSpy = jest.spyOn( + const removeEventListenerSpy = vi.spyOn( globalThis.window, 'removeEventListener', ) @@ -137,7 +132,7 @@ describe('onlineManager', () => { }) test('should keep setup function even if last listener unsubscribes', () => { - const setupSpy = jest.fn().mockImplementation(() => () => undefined) + const setupSpy = vi.fn().mockImplementation(() => () => undefined) onlineManager.setEventListener(setupSpy) diff --git a/packages/query-core/src/tests/queriesObserver.test.tsx b/packages/query-core/src/tests/queriesObserver.test.tsx index f07130c09d..916c8d9119 100644 --- a/packages/query-core/src/tests/queriesObserver.test.tsx +++ b/packages/query-core/src/tests/queriesObserver.test.tsx @@ -2,6 +2,7 @@ import { waitFor } from '@testing-library/react' import { sleep, queryKey, createQueryClient } from './utils' import type { QueryClient, QueryObserverResult } from '..' import { QueriesObserver } from '..' +import { vi } from 'vitest' describe('queriesObserver', () => { let queryClient: QueryClient @@ -18,8 +19,8 @@ describe('queriesObserver', () => { test('should return an array with all query results', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue(1) - const queryFn2 = jest.fn().mockReturnValue(2) + const queryFn1 = vi.fn().mockReturnValue(1) + const queryFn2 = vi.fn().mockReturnValue(2) const observer = new QueriesObserver(queryClient, [ { queryKey: key1, queryFn: queryFn1 }, { queryKey: key2, queryFn: queryFn2 }, @@ -34,11 +35,11 @@ describe('queriesObserver', () => { }) test('should still return value for undefined query key', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) const key1 = queryKey() - const queryFn1 = jest.fn().mockReturnValue(1) - const queryFn2 = jest.fn().mockReturnValue(2) + const queryFn1 = vi.fn().mockReturnValue(1) + const queryFn2 = vi.fn().mockReturnValue(2) const observer = new QueriesObserver(queryClient, [ { queryKey: key1, queryFn: queryFn1 }, { queryKey: undefined, queryFn: queryFn2 }, @@ -61,8 +62,8 @@ describe('queriesObserver', () => { test('should update when a query updates', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue(1) - const queryFn2 = jest.fn().mockReturnValue(2) + const queryFn1 = vi.fn().mockReturnValue(1) + const queryFn2 = vi.fn().mockReturnValue(2) const observer = new QueriesObserver(queryClient, [ { queryKey: key1, queryFn: queryFn1 }, { queryKey: key2, queryFn: queryFn2 }, @@ -106,8 +107,8 @@ describe('queriesObserver', () => { test('should update when a query is removed', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue(1) - const queryFn2 = jest.fn().mockReturnValue(2) + const queryFn1 = vi.fn().mockReturnValue(1) + const queryFn2 = vi.fn().mockReturnValue(2) const observer = new QueriesObserver(queryClient, [ { queryKey: key1, queryFn: queryFn1 }, { queryKey: key2, queryFn: queryFn2 }, @@ -153,8 +154,8 @@ describe('queriesObserver', () => { test('should update when a query changed position', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue(1) - const queryFn2 = jest.fn().mockReturnValue(2) + const queryFn1 = vi.fn().mockReturnValue(1) + const queryFn2 = vi.fn().mockReturnValue(2) const observer = new QueriesObserver(queryClient, [ { queryKey: key1, queryFn: queryFn1 }, { queryKey: key2, queryFn: queryFn2 }, @@ -201,8 +202,8 @@ describe('queriesObserver', () => { test('should not update when nothing has changed', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue(1) - const queryFn2 = jest.fn().mockReturnValue(2) + const queryFn1 = vi.fn().mockReturnValue(1) + const queryFn2 = vi.fn().mockReturnValue(2) const observer = new QueriesObserver(queryClient, [ { queryKey: key1, queryFn: queryFn1 }, { queryKey: key2, queryFn: queryFn2 }, @@ -245,8 +246,8 @@ describe('queriesObserver', () => { test('should trigger all fetches when subscribed', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue(1) - const queryFn2 = jest.fn().mockReturnValue(2) + const queryFn1 = vi.fn().mockReturnValue(1) + const queryFn2 = vi.fn().mockReturnValue(2) const observer = new QueriesObserver(queryClient, [ { queryKey: key1, queryFn: queryFn1 }, { queryKey: key2, queryFn: queryFn2 }, @@ -270,8 +271,8 @@ describe('queriesObserver', () => { }, ]) - const subscription1Handler = jest.fn() - const subscription2Handler = jest.fn() + const subscription1Handler = vi.fn() + const subscription2Handler = vi.fn() const unsubscribe1 = observer.subscribe(subscription1Handler) const unsubscribe2 = observer.subscribe(subscription2Handler) diff --git a/packages/query-core/src/tests/query.test.tsx b/packages/query-core/src/tests/query.test.tsx index 85a2d6b990..6a24fb822b 100644 --- a/packages/query-core/src/tests/query.test.tsx +++ b/packages/query-core/src/tests/query.test.tsx @@ -12,6 +12,7 @@ import type { } from '..' import { QueryObserver, isCancelledError, onlineManager } from '..' import { waitFor } from '@testing-library/react' +import { vi } from 'vitest' describe('query', () => { let queryClient: QueryClient @@ -186,10 +187,10 @@ describe('query', () => { test('should provide context to queryFn', async () => { const key = queryKey() - const queryFn = jest + const queryFn = vi .fn< - Promise<'data'>, - [QueryFunctionContext>] + [QueryFunctionContext>], + Promise<'data'> >() .mockResolvedValue('data') @@ -273,12 +274,12 @@ describe('query', () => { test('should provide an AbortSignal to the queryFn that provides info about the cancellation state', async () => { const key = queryKey() - const queryFn = jest.fn< - Promise, - [QueryFunctionContext>] + const queryFn = vi.fn< + [QueryFunctionContext>], + Promise >() - const onAbort = jest.fn() - const abortListener = jest.fn() + const onAbort = vi.fn() + const abortListener = vi.fn() let error queryFn.mockImplementation(async ({ signal }) => { @@ -323,7 +324,7 @@ describe('query', () => { test('should not continue if explicitly cancelled', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(async () => { await sleep(10) @@ -355,7 +356,7 @@ describe('query', () => { test('should not error if reset while pending', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(async () => { await sleep(10) @@ -382,7 +383,7 @@ describe('query', () => { test('should be able to refetch a cancelled query', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(async () => { await sleep(50) @@ -631,7 +632,7 @@ describe('query', () => { it: 'works', } - const queryFn = jest.fn(() => 'data') + const queryFn = vi.fn(() => 'data') const key = queryKey() @@ -652,7 +653,7 @@ describe('query', () => { queryFn: () => 'data', }) - const refetchSpy = jest.spyOn(observer, 'refetch') + const refetchSpy = vi.spyOn(observer, 'refetch') const unsubscribe = observer.subscribe(() => undefined) queryCache.onOnline() @@ -692,7 +693,7 @@ describe('query', () => { }) expect(query.getObserversCount()).toEqual(0) - const notifySpy = jest.spyOn(queryCache, 'notify') + const notifySpy = vi.spyOn(queryCache, 'notify') expect(() => query.removeObserver(observer)).not.toThrow() expect(notifySpy).not.toHaveBeenCalled() @@ -769,7 +770,7 @@ describe('query', () => { }) test('fetch should dispatch an error if the queryFn returns undefined', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) const key = queryKey() @@ -804,7 +805,7 @@ describe('query', () => { test('constructor should call initialDataUpdatedAt if defined as a function', async () => { const key = queryKey() - const initialDataUpdatedAtSpy = jest.fn() + const initialDataUpdatedAtSpy = vi.fn() await queryClient.prefetchQuery({ queryKey: key, @@ -821,7 +822,7 @@ describe('query', () => { queryClient.setQueryDefaults(key, { gcTime: 10 }) - const fn = jest.fn() + const fn = vi.fn() const unsubscribe = queryClient.getQueryCache().subscribe(fn) diff --git a/packages/query-core/src/tests/queryCache.test.tsx b/packages/query-core/src/tests/queryCache.test.tsx index 0a479088e4..08edec68bb 100644 --- a/packages/query-core/src/tests/queryCache.test.tsx +++ b/packages/query-core/src/tests/queryCache.test.tsx @@ -2,6 +2,7 @@ import { sleep, queryKey, createQueryClient } from './utils' import { QueryClient } from '..' import { QueryCache, QueryObserver } from '..' import { waitFor } from '@testing-library/react' +import { vi } from 'vitest' describe('queryCache', () => { let queryClient: QueryClient @@ -19,7 +20,7 @@ describe('queryCache', () => { describe('subscribe', () => { test('should pass the correct query', async () => { const key = queryKey() - const subscriber = jest.fn() + const subscriber = vi.fn() const unsubscribe = queryCache.subscribe(subscriber) queryClient.setQueryData(key, 'foo') const query = queryCache.find({ queryKey: key }) @@ -30,7 +31,7 @@ describe('queryCache', () => { test('should notify listeners when new query is added', async () => { const key = queryKey() - const callback = jest.fn() + const callback = vi.fn() queryCache.subscribe(callback) queryClient.prefetchQuery({ queryKey: key, queryFn: () => 'data' }) await sleep(100) @@ -50,7 +51,7 @@ describe('queryCache', () => { staleTime: 10, }) - const unsubScribeObserver = observer.subscribe(jest.fn) + const unsubScribeObserver = observer.subscribe(vi.fn()) await waitFor(() => { expect(events.length).toBe(8) @@ -73,7 +74,7 @@ describe('queryCache', () => { test('should include the queryCache and query when notifying listeners', async () => { const key = queryKey() - const callback = jest.fn() + const callback = vi.fn() queryCache.subscribe(callback) queryClient.prefetchQuery({ queryKey: key, queryFn: () => 'data' }) const query = queryCache.find({ queryKey: key }) @@ -83,7 +84,7 @@ describe('queryCache', () => { test('should notify subscribers when new query with initialData is added', async () => { const key = queryKey() - const callback = jest.fn() + const callback = vi.fn() queryCache.subscribe(callback) queryClient.prefetchQuery({ queryKey: key, @@ -289,9 +290,9 @@ describe('queryCache', () => { describe('QueryCacheConfig error callbacks', () => { test('should call onError and onSettled when a query errors', async () => { const key = queryKey() - const onSuccess = jest.fn() - const onSettled = jest.fn() - const onError = jest.fn() + const onSuccess = vi.fn() + const onSettled = vi.fn() + const onError = vi.fn() const testCache = new QueryCache({ onSuccess, onError, onSettled }) const testClient = createQueryClient({ queryCache: testCache }) await testClient.prefetchQuery({ @@ -310,9 +311,9 @@ describe('queryCache', () => { describe('QueryCacheConfig success callbacks', () => { test('should call onSuccess and onSettled when a query is successful', async () => { const key = queryKey() - const onSuccess = jest.fn() - const onSettled = jest.fn() - const onError = jest.fn() + const onSuccess = vi.fn() + const onSettled = vi.fn() + const onError = vi.fn() const testCache = new QueryCache({ onSuccess, onError, onSettled }) const testClient = createQueryClient({ queryCache: testCache }) await testClient.prefetchQuery({ @@ -330,14 +331,14 @@ describe('queryCache', () => { describe('QueryCacheConfig.createStore', () => { test('should call createStore', async () => { - const createStore = jest.fn().mockImplementation(() => new Map()) + const createStore = vi.fn().mockImplementation(() => new Map()) new QueryCache({ createStore }) expect(createStore).toHaveBeenCalledWith() }) test('should use created store', async () => { const store = new Map() - const spy = jest.spyOn(store, 'get') + const spy = vi.spyOn(store, 'get') new QueryCache({ createStore: () => store }).get('key') diff --git a/packages/query-core/src/tests/queryClient.test.tsx b/packages/query-core/src/tests/queryClient.test.tsx index 87a0c4aa54..51a55a67b7 100644 --- a/packages/query-core/src/tests/queryClient.test.tsx +++ b/packages/query-core/src/tests/queryClient.test.tsx @@ -11,6 +11,7 @@ import type { import { MutationObserver, QueryObserver } from '..' import { focusManager, onlineManager } from '..' import { noop } from '../utils' +import { vi } from 'vitest' describe('queryClient', () => { let queryClient: QueryClient @@ -223,7 +224,7 @@ describe('queryClient', () => { test('should accept an update function', () => { const key = queryKey() - const updater = jest.fn((oldData) => `new data + ${oldData}`) + const updater = vi.fn((oldData) => `new data + ${oldData}`) queryClient.setQueryData(key, 'test data') queryClient.setQueryData(key, updater) @@ -802,7 +803,7 @@ describe('queryClient', () => { describe('refetchQueries', () => { test('should not refetch if all observers are disabled', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') await queryClient.fetchQuery({ queryKey: key, queryFn }) const observer1 = new QueryObserver(queryClient, { queryKey: key, @@ -816,7 +817,7 @@ describe('queryClient', () => { }) test('should refetch if at least one observer is enabled', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') await queryClient.fetchQuery({ queryKey: key, queryFn }) const observer1 = new QueryObserver(queryClient, { queryKey: key, @@ -838,8 +839,8 @@ describe('queryClient', () => { test('should refetch all queries when no arguments are given', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer1 = new QueryObserver(queryClient, { @@ -864,8 +865,8 @@ describe('queryClient', () => { test('should be able to refetch all fresh queries', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -883,8 +884,8 @@ describe('queryClient', () => { test('should be able to refetch all stale queries', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -903,8 +904,8 @@ describe('queryClient', () => { test('should be able to refetch all stale and active queries', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) queryClient.invalidateQueries({ queryKey: key1 }) @@ -925,8 +926,8 @@ describe('queryClient', () => { test('should be able to refetch all active and inactive queries', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -944,8 +945,8 @@ describe('queryClient', () => { test('should be able to refetch all active and inactive queries', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -963,8 +964,8 @@ describe('queryClient', () => { test('should be able to refetch only active queries', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -982,8 +983,8 @@ describe('queryClient', () => { test('should be able to refetch only inactive queries', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -1025,8 +1026,8 @@ describe('queryClient', () => { test('should refetch active queries by default', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -1044,8 +1045,8 @@ describe('queryClient', () => { test('should not refetch inactive queries by default', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -1063,8 +1064,8 @@ describe('queryClient', () => { test('should not refetch active queries when "refetch" is "none"', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -1085,8 +1086,8 @@ describe('queryClient', () => { test('should refetch inactive queries when "refetch" is "inactive"', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -1109,8 +1110,8 @@ describe('queryClient', () => { test('should refetch active and inactive queries when "refetch" is "all"', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') await queryClient.fetchQuery({ queryKey: key1, queryFn: queryFn1 }) await queryClient.fetchQuery({ queryKey: key2, queryFn: queryFn2 }) const observer = new QueryObserver(queryClient, { @@ -1129,7 +1130,7 @@ describe('queryClient', () => { test('should cancel ongoing fetches if cancelRefetch option is set (default value)', async () => { const key = queryKey() - const abortFn = jest.fn() + const abortFn = vi.fn() let fetchCount = 0 const observer = new QueryObserver(queryClient, { queryKey: key, @@ -1152,7 +1153,7 @@ describe('queryClient', () => { test('should not cancel ongoing fetches if cancelRefetch option is set to false', async () => { const key = queryKey() - const abortFn = jest.fn() + const abortFn = vi.fn() let fetchCount = 0 const observer = new QueryObserver(queryClient, { queryKey: key, @@ -1178,7 +1179,7 @@ describe('queryClient', () => { test('should notify listeners when a query is reset', async () => { const key = queryKey() - const callback = jest.fn() + const callback = vi.fn() await queryClient.prefetchQuery({ queryKey: key, queryFn: () => 'data' }) @@ -1231,8 +1232,8 @@ describe('queryClient', () => { test('should refetch all active queries', async () => { const key1 = queryKey() const key2 = queryKey() - const queryFn1 = jest.fn().mockReturnValue('data1') - const queryFn2 = jest.fn().mockReturnValue('data2') + const queryFn1 = vi.fn().mockReturnValue('data1') + const queryFn2 = vi.fn().mockReturnValue('data2') const observer1 = new QueryObserver(queryClient, { queryKey: key1, queryFn: queryFn1, @@ -1258,15 +1259,15 @@ describe('queryClient', () => { const testClient = createQueryClient() testClient.mount() - const queryCacheOnFocusSpy = jest.spyOn( + const queryCacheOnFocusSpy = vi.spyOn( testClient.getQueryCache(), 'onFocus', ) - const queryCacheOnOnlineSpy = jest.spyOn( + const queryCacheOnOnlineSpy = vi.spyOn( testClient.getQueryCache(), 'onOnline', ) - const mutationCacheResumePausedMutationsSpy = jest.spyOn( + const mutationCacheResumePausedMutationsSpy = vi.spyOn( testClient.getMutationCache(), 'resumePausedMutations', ) @@ -1291,15 +1292,15 @@ describe('queryClient', () => { const testClient = createQueryClient() testClient.mount() - const queryCacheOnFocusSpy = jest.spyOn( + const queryCacheOnFocusSpy = vi.spyOn( testClient.getQueryCache(), 'onFocus', ) - const queryCacheOnOnlineSpy = jest.spyOn( + const queryCacheOnOnlineSpy = vi.spyOn( testClient.getQueryCache(), 'onOnline', ) - const mutationCacheResumePausedMutationsSpy = jest.spyOn( + const mutationCacheResumePausedMutationsSpy = vi.spyOn( testClient.getMutationCache(), 'resumePausedMutations', ) @@ -1321,7 +1322,7 @@ describe('queryClient', () => { }) test('should resume paused mutations when coming online', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) onlineManager.setOnline(false) @@ -1351,7 +1352,7 @@ describe('queryClient', () => { }) test('should resume paused mutations one after the other when invoked manually at the same time', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) onlineManager.setOnline(false) @@ -1401,15 +1402,15 @@ describe('queryClient', () => { testClient.mount() testClient.unmount() - const queryCacheOnFocusSpy = jest.spyOn( + const queryCacheOnFocusSpy = vi.spyOn( testClient.getQueryCache(), 'onFocus', ) - const queryCacheOnOnlineSpy = jest.spyOn( + const queryCacheOnOnlineSpy = vi.spyOn( testClient.getQueryCache(), 'onOnline', ) - const mutationCacheResumePausedMutationsSpy = jest.spyOn( + const mutationCacheResumePausedMutationsSpy = vi.spyOn( testClient.getMutationCache(), 'resumePausedMutations', ) @@ -1436,15 +1437,15 @@ describe('queryClient', () => { testClient.unmount() testClient.unmount() - const queryCacheOnFocusSpy = jest.spyOn( + const queryCacheOnFocusSpy = vi.spyOn( testClient.getQueryCache(), 'onFocus', ) - const queryCacheOnOnlineSpy = jest.spyOn( + const queryCacheOnOnlineSpy = vi.spyOn( testClient.getQueryCache(), 'onOnline', ) - const mutationCacheResumePausedMutationsSpy = jest.spyOn( + const mutationCacheResumePausedMutationsSpy = vi.spyOn( testClient.getMutationCache(), 'resumePausedMutations', ) diff --git a/packages/query-core/src/tests/queryObserver.test.tsx b/packages/query-core/src/tests/queryObserver.test.tsx index 22bd32cb12..47d1567402 100644 --- a/packages/query-core/src/tests/queryObserver.test.tsx +++ b/packages/query-core/src/tests/queryObserver.test.tsx @@ -1,6 +1,7 @@ import { sleep, queryKey, expectType, createQueryClient } from './utils' import type { QueryClient, QueryObserverResult } from '..' import { QueryObserver, focusManager } from '..' +import { vi } from 'vitest' describe('queryObserver', () => { let queryClient: QueryClient @@ -16,7 +17,7 @@ describe('queryObserver', () => { test('should trigger a fetch when subscribed', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') const observer = new QueryObserver(queryClient, { queryKey: key, queryFn }) const unsubscribe = observer.subscribe(() => undefined) await sleep(1) @@ -348,7 +349,7 @@ describe('queryObserver', () => { test('should not trigger a fetch when subscribed and disabled', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') const observer = new QueryObserver(queryClient, { queryKey: key, queryFn, @@ -362,7 +363,7 @@ describe('queryObserver', () => { test('should not trigger a fetch when not subscribed', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') new QueryObserver(queryClient, { queryKey: key, queryFn }) await sleep(1) expect(queryFn).toHaveBeenCalledTimes(0) @@ -370,8 +371,8 @@ describe('queryObserver', () => { test('should be able to watch a query without defining a query function', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') - const callback = jest.fn() + const queryFn = vi.fn().mockReturnValue('data') + const callback = vi.fn() const observer = new QueryObserver(queryClient, { queryKey: key, enabled: false, @@ -385,7 +386,7 @@ describe('queryObserver', () => { test('should accept unresolved query config in update function', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') const observer = new QueryObserver(queryClient, { queryKey: key, enabled: false, @@ -407,7 +408,7 @@ describe('queryObserver', () => { test('should be able to handle multiple subscribers', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') const observer = new QueryObserver(queryClient, { queryKey: key, enabled: false, @@ -567,7 +568,7 @@ describe('queryObserver', () => { test('should not refetch in background if refetchIntervalInBackground is false', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') focusManager.setFocused(false) const observer = new QueryObserver(queryClient, { @@ -697,7 +698,7 @@ describe('queryObserver', () => { queryKey: key, }) - const spy = jest.fn() + const spy = vi.fn() const unsubscribe = queryClient.getQueryCache().subscribe(spy) observer.setOptions({ enabled: false }) diff --git a/packages/query-core/src/tests/utils.test.tsx b/packages/query-core/src/tests/utils.test.tsx index 9dda06b733..529876a498 100644 --- a/packages/query-core/src/tests/utils.test.tsx +++ b/packages/query-core/src/tests/utils.test.tsx @@ -11,6 +11,7 @@ import { } from '../utils' import { Mutation } from '../mutation' import { createQueryClient } from './utils' +import { vi } from 'vitest' describe('core/utils', () => { describe('isPlainObject', () => { @@ -343,7 +344,7 @@ describe('core/utils', () => { describe('scheduleMicrotask', () => { it('should defer execution of callback', async () => { - const callback = jest.fn() + const callback = vi.fn() scheduleMicrotask(callback) expect(callback).not.toHaveBeenCalled() diff --git a/packages/query-core/src/tests/utils.ts b/packages/query-core/src/tests/utils.ts index 5713546ab3..343ba3d132 100644 --- a/packages/query-core/src/tests/utils.ts +++ b/packages/query-core/src/tests/utils.ts @@ -1,7 +1,8 @@ import { act } from '@testing-library/react' +import { vi } from 'vitest' -import type { MutationOptions, QueryClientConfig } from '@tanstack/query-core' -import { QueryClient } from '@tanstack/query-core' +import type { MutationOptions, QueryClientConfig } from '..' +import { QueryClient } from '..' import * as utils from '../utils' export function createQueryClient(config?: QueryClientConfig): QueryClient { @@ -9,11 +10,11 @@ export function createQueryClient(config?: QueryClientConfig): QueryClient { } export function mockVisibilityState(value: DocumentVisibilityState) { - return jest.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) + return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) } export function mockNavigatorOnLine(value: boolean) { - return jest.spyOn(navigator, 'onLine', 'get').mockReturnValue(value) + return vi.spyOn(navigator, 'onLine', 'get').mockReturnValue(value) } let queryKeyCount = 0 diff --git a/packages/query-core/vitest.config.ts b/packages/query-core/vitest.config.ts new file mode 100644 index 0000000000..61f089325d --- /dev/null +++ b/packages/query-core/vitest.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'query-core', + watch: false, + environment: 'jsdom', + globals: true, + coverage: { provider: 'istanbul' }, + }, +}) diff --git a/packages/query-persist-client-core/jest.config.ts b/packages/query-persist-client-core/jest.config.ts deleted file mode 100644 index 0721fcbed0..0000000000 --- a/packages/query-persist-client-core/jest.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default { - displayName: 'query-persist-client-core', - preset: '../../jest-preset.js', -} diff --git a/packages/query-persist-client-core/package.json b/packages/query-persist-client-core/package.json index b52edad114..16b8b6aafd 100644 --- a/packages/query-persist-client-core/package.json +++ b/packages/query-persist-client-core/package.json @@ -31,7 +31,7 @@ "clean": "rimraf ./build", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build" }, diff --git a/packages/query-persist-client-core/src/__tests__/persist.test.ts b/packages/query-persist-client-core/src/__tests__/persist.test.ts index 1e25233c07..828a3bfbde 100644 --- a/packages/query-persist-client-core/src/__tests__/persist.test.ts +++ b/packages/query-persist-client-core/src/__tests__/persist.test.ts @@ -5,6 +5,7 @@ import { } from './utils' import { persistQueryClientSubscribe } from '../persist' import { QueriesObserver } from '@tanstack/query-core' +import { vi } from 'vitest' describe('persistQueryClientSubscribe', () => { test('should persist mutations', async () => { @@ -42,9 +43,9 @@ describe('persistQueryClientSave', () => { }) const queryKey = ['test'] - const queryFn = jest.fn().mockReturnValue(1) + const queryFn = vi.fn().mockReturnValue(1) const observer = new QueriesObserver(queryClient, [{ queryKey, queryFn }]) - const unsubscribeObserver = observer.subscribe(jest.fn()) + const unsubscribeObserver = observer.subscribe(vi.fn()) observer.getObservers()[0]?.setOptions({ refetchOnWindowFocus: false }) unsubscribeObserver() diff --git a/packages/query-persist-client-core/src/__tests__/utils.ts b/packages/query-persist-client-core/src/__tests__/utils.ts index 26eb00b22d..513feef9b8 100644 --- a/packages/query-persist-client-core/src/__tests__/utils.ts +++ b/packages/query-persist-client-core/src/__tests__/utils.ts @@ -4,6 +4,7 @@ import type { Persister, PersistedClient, } from '@tanstack/query-persist-client-core' +import { vi } from 'vitest' export function createQueryClient(config?: QueryClientConfig): QueryClient { return new QueryClient(config) @@ -34,8 +35,8 @@ export const createMockPersister = (): Persister => { export const createSpyablePersister = (): Persister => { return { - persistClient: jest.fn(), - restoreClient: jest.fn(), - removeClient: jest.fn(), + persistClient: vi.fn(), + restoreClient: vi.fn(), + removeClient: vi.fn(), } } diff --git a/packages/query-persist-client-core/vitest.config.ts b/packages/query-persist-client-core/vitest.config.ts new file mode 100644 index 0000000000..c3331d786a --- /dev/null +++ b/packages/query-persist-client-core/vitest.config.ts @@ -0,0 +1,16 @@ +import { resolve } from 'path' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'query-persist-client-core', + watch: false, + globals: true, + coverage: { provider: 'istanbul' }, + }, + resolve: { + alias: { + '@tanstack/query-core': resolve(__dirname, '..', 'query-core', 'src'), + }, + }, +}) diff --git a/packages/query-sync-storage-persister/jest.config.ts b/packages/query-sync-storage-persister/jest.config.ts deleted file mode 100644 index bd980d00c2..0000000000 --- a/packages/query-sync-storage-persister/jest.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default { - displayName: 'query-sync-storage-persister', - preset: '../../jest-preset.js', -} diff --git a/packages/query-sync-storage-persister/package.json b/packages/query-sync-storage-persister/package.json index cc36d49db0..9079f3c6a5 100644 --- a/packages/query-sync-storage-persister/package.json +++ b/packages/query-sync-storage-persister/package.json @@ -31,7 +31,7 @@ "clean": "rimraf ./build", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build" }, diff --git a/packages/query-sync-storage-persister/vitest.config.ts b/packages/query-sync-storage-persister/vitest.config.ts new file mode 100644 index 0000000000..984352a25f --- /dev/null +++ b/packages/query-sync-storage-persister/vitest.config.ts @@ -0,0 +1,22 @@ +import { resolve } from 'path' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'query-sync-storage-persister', + watch: false, + globals: true, + coverage: { provider: 'istanbul' }, + }, + resolve: { + alias: { + '@tanstack/query-core': resolve(__dirname, '..', 'query-core', 'src'), + '@tanstack/query-persist-client-core': resolve( + __dirname, + '..', + 'query-persist-client-core', + 'src', + ), + }, + }, +}) diff --git a/packages/react-query-devtools/jest.config.ts b/packages/react-query-devtools/jest.config.ts deleted file mode 100644 index 22963500f4..0000000000 --- a/packages/react-query-devtools/jest.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default { - displayName: 'react-query-devtools', - preset: '../../jest-preset.js', - setupFilesAfterEnv: ['./jest.setup.ts'], -} diff --git a/packages/react-query-devtools/package.json b/packages/react-query-devtools/package.json index c98224a2b5..baed6806e9 100644 --- a/packages/react-query-devtools/package.json +++ b/packages/react-query-devtools/package.json @@ -41,7 +41,7 @@ "clean": "rimraf ./build", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build && cp build/lib/index.d.ts build/lib/index.prod.d.ts" }, diff --git a/packages/react-query-devtools/src/__tests__/Explorer.test.tsx b/packages/react-query-devtools/src/__tests__/Explorer.test.tsx index cf5e15443c..81fb26c918 100644 --- a/packages/react-query-devtools/src/__tests__/Explorer.test.tsx +++ b/packages/react-query-devtools/src/__tests__/Explorer.test.tsx @@ -3,6 +3,7 @@ import * as React from 'react' import { chunkArray, CopyButton, DefaultRenderer } from '../Explorer' import { displayValue } from '../utils' +import { vi } from 'vitest' describe('Explorer', () => { describe('chunkArray', () => { @@ -30,7 +31,7 @@ describe('Explorer', () => { describe('DefaultRenderer', () => { it('when the entry label is clicked, toggle expanded', async () => { - const toggleExpanded = jest.fn() + const toggleExpanded = vi.fn() render( { }) it('when the copy button is clicked but there is an error, show error state', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) // Mock clipboard with error state diff --git a/packages/react-query-devtools/src/__tests__/devtools.test.tsx b/packages/react-query-devtools/src/__tests__/devtools.test.tsx index fe77062006..4185d8e7ca 100644 --- a/packages/react-query-devtools/src/__tests__/devtools.test.tsx +++ b/packages/react-query-devtools/src/__tests__/devtools.test.tsx @@ -9,18 +9,19 @@ import { sleep, createQueryClient, } from './utils' +import { vi } from 'vitest' Object.defineProperty(window, 'matchMedia', { writable: true, - value: jest.fn().mockImplementation((query: string) => ({ + value: vi.fn().mockImplementation((query: string) => ({ matches: false, media: query, onchange: null, - addListener: jest.fn(), // deprecated - removeListener: jest.fn(), // deprecated - addEventListener: jest.fn(), - removeEventListener: jest.fn(), - dispatchEvent: jest.fn(), + addListener: vi.fn(), // deprecated + removeListener: vi.fn(), // deprecated + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + dispatchEvent: vi.fn(), })), }) @@ -31,8 +32,8 @@ describe('ReactQueryDevtools', () => { }) it('should be able to open and close devtools', async () => { const { queryClient } = createQueryClient() - const onCloseClick = jest.fn() - const onToggleClick = jest.fn() + const onCloseClick = vi.fn() + const onToggleClick = vi.fn() function Page() { const { data = 'default' } = useQuery({ diff --git a/packages/react-query-devtools/jest.setup.ts b/packages/react-query-devtools/test-setup.ts similarity index 100% rename from packages/react-query-devtools/jest.setup.ts rename to packages/react-query-devtools/test-setup.ts diff --git a/packages/react-query-devtools/vitest.config.ts b/packages/react-query-devtools/vitest.config.ts new file mode 100644 index 0000000000..d8e53193dc --- /dev/null +++ b/packages/react-query-devtools/vitest.config.ts @@ -0,0 +1,25 @@ +import { resolve } from 'path' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'react-query-persist-client', + watch: false, + setupFiles: ['test-setup.ts'], + environment: 'jsdom', + globals: true, + coverage: { provider: 'istanbul' }, + }, + resolve: { + alias: { + '@tanstack/query-core': resolve(__dirname, '..', 'query-core', 'src'), + '@tanstack/react-query': resolve(__dirname, '..', 'react-query', 'src'), + '@tanstack/query-persist-client-core': resolve( + __dirname, + '..', + 'query-persist-client-core', + 'src', + ), + }, + }, +}) diff --git a/packages/react-query-persist-client/jest.config.ts b/packages/react-query-persist-client/jest.config.ts deleted file mode 100644 index 50314cf83b..0000000000 --- a/packages/react-query-persist-client/jest.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default { - displayName: 'react-query-persist-client', - preset: '../../jest-preset.js', - setupFilesAfterEnv: ['./jest.setup.ts'], -} diff --git a/packages/react-query-persist-client/package.json b/packages/react-query-persist-client/package.json index bf16c45e3a..1649727560 100644 --- a/packages/react-query-persist-client/package.json +++ b/packages/react-query-persist-client/package.json @@ -31,7 +31,7 @@ "clean": "rimraf ./build", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build" }, diff --git a/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx b/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx index 986a8bd153..8c3a0c59c4 100644 --- a/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx +++ b/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -1,5 +1,6 @@ import * as React from 'react' import { render, waitFor } from '@testing-library/react' +import { vi } from 'vitest' import type { UseQueryResult, @@ -382,7 +383,7 @@ describe('PersistQueryClientProvider', () => { ) } - const onSuccess = jest.fn() + const onSuccess = vi.fn() const rendered = render( { test('should remove cache after non-successful restoring', async () => { const key = queryKey() - const consoleMock = jest.spyOn(console, 'error') - const consoleWarn = jest + const consoleMock = vi.spyOn(console, 'error') + const consoleWarn = vi .spyOn(console, 'warn') .mockImplementation(() => undefined) consoleMock.mockImplementation(() => undefined) const queryClient = createQueryClient() - const removeClient = jest.fn() + const removeClient = vi.fn() const [error, persister] = createMockErrorPersister(removeClient) @@ -463,13 +464,13 @@ describe('PersistQueryClientProvider', () => { queryClient.clear() - const onSuccess = jest.fn() + const onSuccess = vi.fn() - const queryFn1 = jest.fn().mockImplementation(async () => { + const queryFn1 = vi.fn().mockImplementation(async () => { await sleep(10) return 'queryFn1' }) - const queryFn2 = jest.fn().mockImplementation(async () => { + const queryFn2 = vi.fn().mockImplementation(async () => { await sleep(10) return 'queryFn2' }) diff --git a/packages/react-query-persist-client/jest.setup.ts b/packages/react-query-persist-client/test-setup.ts similarity index 100% rename from packages/react-query-persist-client/jest.setup.ts rename to packages/react-query-persist-client/test-setup.ts diff --git a/packages/react-query-persist-client/vitest.config.ts b/packages/react-query-persist-client/vitest.config.ts new file mode 100644 index 0000000000..d8e53193dc --- /dev/null +++ b/packages/react-query-persist-client/vitest.config.ts @@ -0,0 +1,25 @@ +import { resolve } from 'path' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'react-query-persist-client', + watch: false, + setupFiles: ['test-setup.ts'], + environment: 'jsdom', + globals: true, + coverage: { provider: 'istanbul' }, + }, + resolve: { + alias: { + '@tanstack/query-core': resolve(__dirname, '..', 'query-core', 'src'), + '@tanstack/react-query': resolve(__dirname, '..', 'react-query', 'src'), + '@tanstack/query-persist-client-core': resolve( + __dirname, + '..', + 'query-persist-client-core', + 'src', + ), + }, + }, +}) diff --git a/packages/react-query/jest.config.ts b/packages/react-query/jest.config.ts deleted file mode 100644 index 38e6f708ab..0000000000 --- a/packages/react-query/jest.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default { - displayName: 'react-query', - preset: '../../jest-preset.js', - setupFilesAfterEnv: ['./jest.setup.ts'], - testMatch: ['/src/**/*.test.tsx'], -} diff --git a/packages/react-query/package.json b/packages/react-query/package.json index af06413470..8c5c0cfcfe 100644 --- a/packages/react-query/package.json +++ b/packages/react-query/package.json @@ -26,7 +26,7 @@ "clean": "rimraf ./build", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build" }, diff --git a/packages/react-query/src/__tests__/HydrationBoundary.test.tsx b/packages/react-query/src/__tests__/HydrationBoundary.test.tsx index 0e278d1f74..fa34288d3b 100644 --- a/packages/react-query/src/__tests__/HydrationBoundary.test.tsx +++ b/packages/react-query/src/__tests__/HydrationBoundary.test.tsx @@ -8,9 +8,10 @@ import { useQuery, dehydrate, HydrationBoundary, -} from '@tanstack/react-query' +} from '..' import { createQueryClient, sleep } from './utils' import * as coreModule from '@tanstack/query-core' +import { vi } from 'vitest' describe('React hydration', () => { const fetchData: (value: string) => Promise = (value) => @@ -213,7 +214,7 @@ describe('React hydration', () => { const queryCache = new QueryCache() const queryClient = createQueryClient({ queryCache }) - const hydrateSpy = jest.spyOn(coreModule, 'hydrate') + const hydrateSpy = vi.spyOn(coreModule, 'hydrate') function Page() { return null @@ -237,7 +238,7 @@ describe('React hydration', () => { const queryCache = new QueryCache() const queryClient = createQueryClient({ queryCache }) - const hydrateSpy = jest.spyOn(coreModule, 'hydrate') + const hydrateSpy = vi.spyOn(coreModule, 'hydrate') function Page() { return null diff --git a/packages/react-query/src/__tests__/QueryClientProvider.test.tsx b/packages/react-query/src/__tests__/QueryClientProvider.test.tsx index 8b1f9ee203..b868a1ef65 100644 --- a/packages/react-query/src/__tests__/QueryClientProvider.test.tsx +++ b/packages/react-query/src/__tests__/QueryClientProvider.test.tsx @@ -3,6 +3,7 @@ import { render, waitFor } from '@testing-library/react' import { sleep, queryKey, createQueryClient } from './utils' import { QueryClientProvider, QueryCache, useQuery, useQueryClient } from '..' +import { vi } from 'vitest' describe('QueryClientProvider', () => { test('sets a specific cache for all queries to use', async () => { @@ -142,7 +143,7 @@ describe('QueryClientProvider', () => { describe('useQueryClient', () => { test('should throw an error if no query client has been set', () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) diff --git a/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx b/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx index 680aab6859..ea6f37194d 100644 --- a/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx +++ b/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx @@ -4,6 +4,7 @@ import * as React from 'react' import { createQueryClient, queryKey, renderWithClient, sleep } from './utils' import { QueryCache, QueryErrorResetBoundary, useQuery } from '..' +import { vi } from 'vitest' // TODO: This should be removed with the types for react-error-boundary get updated. declare module 'react-error-boundary' { @@ -17,7 +18,7 @@ describe('QueryErrorResetBoundary', () => { const queryClient = createQueryClient({ queryCache }) it('should retry fetch if the reset error boundary has been reset', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -75,7 +76,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should not throw error if query is disabled', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -139,7 +140,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should not throw error if query is disabled, and refetch if query becomes enabled again', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -205,7 +206,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should throw error if query is disabled and manually refetched', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -267,7 +268,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should not retry fetch if the reset error boundary has not been reset', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -325,7 +326,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should retry fetch if the reset error boundary has been reset and the query contains data from a previous fetch', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -385,7 +386,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should not retry fetch if the reset error boundary has not been reset after a previous reset', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -453,7 +454,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should throw again on error after the reset error boundary has been reset', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -511,7 +512,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should never render the component while the query is in error state', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -578,7 +579,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should render children', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -602,7 +603,7 @@ describe('QueryErrorResetBoundary', () => { }) it('should show error boundary when using tracked queries even though we do not track the error field', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) diff --git a/packages/react-query/src/__tests__/ssr-hydration.test.tsx b/packages/react-query/src/__tests__/ssr-hydration.test.tsx index b11e7b6d87..b7ee55503d 100644 --- a/packages/react-query/src/__tests__/ssr-hydration.test.tsx +++ b/packages/react-query/src/__tests__/ssr-hydration.test.tsx @@ -4,6 +4,7 @@ import ReactDOMTestUtils from 'react-dom/test-utils' import ReactDOMServer from 'react-dom/server' // eslint-disable-next-line import/no-unresolved -- types only for module augmentation import type {} from 'react-dom/next' +import { vi } from 'vitest' import { useQuery, @@ -46,12 +47,12 @@ describe('Server side rendering with de/rehydration', () => { globalThis.IS_REACT_ACT_ENVIRONMENT = previousIsReactActEnvironment }) it('should not mismatch on success', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const fetchDataSuccess = jest.fn< - ReturnType, - Parameters + const fetchDataSuccess = vi.fn< + Parameters, + ReturnType >(fetchData) // -- Shared part -- @@ -127,10 +128,10 @@ describe('Server side rendering with de/rehydration', () => { }) it('should not mismatch on error', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const fetchDataError = jest.fn(() => { + const fetchDataError = vi.fn(() => { throw new Error('fetchDataError') }) @@ -207,12 +208,12 @@ describe('Server side rendering with de/rehydration', () => { }) it('should not mismatch on queries that were not prefetched', async () => { - const consoleMock = jest.spyOn(console, 'error') + const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const fetchDataSuccess = jest.fn< - ReturnType, - Parameters + const fetchDataSuccess = vi.fn< + Parameters, + ReturnType >(fetchData) // -- Shared part -- diff --git a/packages/react-query/src/__tests__/ssr.test.tsx b/packages/react-query/src/__tests__/ssr.test.tsx index 9d87b4f255..f7656b359c 100644 --- a/packages/react-query/src/__tests__/ssr.test.tsx +++ b/packages/react-query/src/__tests__/ssr.test.tsx @@ -1,20 +1,17 @@ -/** - * @jest-environment node - */ - import * as React from 'react' // @ts-ignore import { renderToString } from 'react-dom/server' import { sleep, queryKey, createQueryClient } from './utils' import { useQuery, QueryClientProvider, QueryCache, useInfiniteQuery } from '..' +import { vi } from 'vitest' describe('Server Side Rendering', () => { it('should not trigger fetch', () => { const queryCache = new QueryCache() const queryClient = createQueryClient({ queryCache }) const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') function Page() { const query = useQuery({ queryKey: key, queryFn }) @@ -57,7 +54,7 @@ describe('Server Side Rendering', () => { const queryCache = new QueryCache() const queryClient = createQueryClient({ queryCache }) const key = queryKey() - const queryFn = jest.fn(() => { + const queryFn = vi.fn(() => { sleep(10) return 'data' }) @@ -125,7 +122,7 @@ describe('Server Side Rendering', () => { const queryCache = new QueryCache() const queryClient = createQueryClient({ queryCache }) const key = queryKey() - const queryFn = jest.fn(async () => { + const queryFn = vi.fn(async () => { await sleep(5) return 'page 1' }) diff --git a/packages/react-query/src/__tests__/suspense.test.tsx b/packages/react-query/src/__tests__/suspense.test.tsx index 15daf6edec..794004dcc4 100644 --- a/packages/react-query/src/__tests__/suspense.test.tsx +++ b/packages/react-query/src/__tests__/suspense.test.tsx @@ -11,6 +11,7 @@ import { useQueryErrorResetBoundary, } from '..' import { createQueryClient, queryKey, renderWithClient, sleep } from './utils' +import { vi } from 'vitest' describe("useQuery's in Suspense mode", () => { const queryCache = new QueryCache() @@ -119,7 +120,7 @@ describe("useQuery's in Suspense mode", () => { it('should not call the queryFn twice when used in Suspense mode', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => { sleep(10) return 'data' @@ -192,7 +193,7 @@ describe("useQuery's in Suspense mode", () => { it('should call onSuccess on the first successful call', async () => { const key = queryKey() - const successFn = jest.fn() + const successFn = vi.fn() function Page() { useQuery({ @@ -225,8 +226,8 @@ describe("useQuery's in Suspense mode", () => { it('should call every onSuccess handler within a suspense boundary', async () => { const key = queryKey() - const successFn1 = jest.fn() - const successFn2 = jest.fn() + const successFn1 = vi.fn() + const successFn2 = vi.fn() function FirstComponent() { useQuery({ @@ -273,7 +274,7 @@ describe("useQuery's in Suspense mode", () => { // https://github.com/tannerlinsley/react-query/issues/468 it('should reset error state if new component instances are mounted', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -345,7 +346,7 @@ describe("useQuery's in Suspense mode", () => { }) it('should retry fetch if the reset error boundary has been reset', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -510,7 +511,7 @@ describe("useQuery's in Suspense mode", () => { }) it('should retry fetch if the reset error boundary has been reset with global hook', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -574,7 +575,7 @@ describe("useQuery's in Suspense mode", () => { }) it('should throw errors to the error boundary by default', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -655,7 +656,7 @@ describe("useQuery's in Suspense mode", () => { }) it('should throw errors to the error boundary when a throwErrors function returns true', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -739,7 +740,7 @@ describe("useQuery's in Suspense mode", () => { it('should not call the queryFn when not enabled', async () => { const key = queryKey() - const queryFn = jest.fn, unknown[]>() + const queryFn = vi.fn>() queryFn.mockImplementation(async () => { await sleep(10) return '23' @@ -781,7 +782,7 @@ describe("useQuery's in Suspense mode", () => { }) it('should error catched in error boundary without infinite loop', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -854,7 +855,7 @@ describe("useQuery's in Suspense mode", () => { }) it('should error catched in error boundary without infinite loop when query keys changed', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) let succeed = true @@ -921,7 +922,7 @@ describe("useQuery's in Suspense mode", () => { }) it('should error catched in error boundary without infinite loop when enabled changed', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) function Page() { diff --git a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx index b1ea73a243..d2a0c7785a 100644 --- a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx @@ -14,6 +14,8 @@ import type { UseInfiniteQueryResult, } from '..' import { QueryCache, useInfiniteQuery, keepPreviousData } from '..' +import { vi } from 'vitest' +import type { Mock } from 'vitest' interface Result { items: number[] @@ -680,14 +682,14 @@ describe('useInfiniteQuery', () => { it('should silently cancel an ongoing fetchNextPage request when another fetchNextPage is invoked', async () => { const key = queryKey() const start = 10 - const onAborts: jest.Mock[] = [] - const abortListeners: jest.Mock[] = [] - const fetchPage = jest.fn< - Promise, - [QueryFunctionContext] + const onAborts: Mock[] = [] + const abortListeners: Mock[] = [] + const fetchPage = vi.fn< + [QueryFunctionContext], + Promise >(async ({ pageParam, signal }) => { - const onAbort = jest.fn() - const abortListener = jest.fn() + const onAbort = vi.fn() + const abortListener = vi.fn() onAborts.push(onAbort) abortListeners.push(abortListener) signal.onabort = onAbort @@ -756,14 +758,14 @@ describe('useInfiniteQuery', () => { it('should not cancel an ongoing fetchNextPage request when another fetchNextPage is invoked if `cancelRefetch: false` is used ', async () => { const key = queryKey() const start = 10 - const onAborts: jest.Mock[] = [] - const abortListeners: jest.Mock[] = [] - const fetchPage = jest.fn< - Promise, - [QueryFunctionContext] + const onAborts: Mock[] = [] + const abortListeners: Mock[] = [] + const fetchPage = vi.fn< + [QueryFunctionContext], + Promise >(async ({ pageParam, signal }) => { - const onAbort = jest.fn() - const abortListener = jest.fn() + const onAbort = vi.fn() + const abortListener = vi.fn() onAborts.push(onAbort) abortListeners.push(abortListener) signal.onabort = onAbort @@ -1491,11 +1493,11 @@ describe('useInfiniteQuery', () => { it('should cancel the query function when there are no more subscriptions', async () => { const key = queryKey() - let cancelFn: jest.Mock = jest.fn() + let cancelFn: Mock = vi.fn() const queryFn = ({ signal }: { signal?: AbortSignal }) => { const promise = new Promise((resolve, reject) => { - cancelFn = jest.fn(() => reject('Cancelled')) + cancelFn = vi.fn(() => reject('Cancelled')) signal?.addEventListener('abort', cancelFn) sleep(1000).then(() => resolve('OK')) }) diff --git a/packages/react-query/src/__tests__/useMutation.test.tsx b/packages/react-query/src/__tests__/useMutation.test.tsx index 1f43a5c8d6..ac3d99a37f 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -13,6 +13,7 @@ import { setActTimeout, sleep, } from './utils' +import { vi } from 'vitest' describe('useMutation', () => { const queryCache = new QueryCache() @@ -95,8 +96,8 @@ describe('useMutation', () => { it('should be able to call `onSuccess` and `onSettled` after each successful mutate', async () => { let count = 0 - const onSuccessMock = jest.fn() - const onSettledMock = jest.fn() + const onSuccessMock = vi.fn() + const onSettledMock = vi.fn() function Page() { const { mutate } = useMutation({ @@ -151,7 +152,7 @@ describe('useMutation', () => { let count = 0 type Value = { count: number } - const mutateFn = jest.fn, [value: Value]>() + const mutateFn = vi.fn<[value: Value], Promise>() mutateFn.mockImplementationOnce(() => { return Promise.reject(new Error('Error test Jonas')) @@ -197,8 +198,8 @@ describe('useMutation', () => { }) it('should be able to call `onError` and `onSettled` after each failed mutate', async () => { - const onErrorMock = jest.fn() - const onSettledMock = jest.fn() + const onErrorMock = vi.fn() + const onSettledMock = vi.fn() let count = 0 function Page() { @@ -488,7 +489,7 @@ describe('useMutation', () => { it('should call onMutate even if paused', async () => { const onlineMock = mockNavigatorOnLine(false) - const onMutate = jest.fn() + const onMutate = vi.fn() let count = 0 function Page() { @@ -688,7 +689,7 @@ describe('useMutation', () => { }) it('should be able to throw an error when throwErrors is set to true', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) function Page() { @@ -735,7 +736,7 @@ describe('useMutation', () => { }) it('should be able to throw an error when throwErrors is a function that returns true', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) let boundary = false @@ -788,8 +789,8 @@ describe('useMutation', () => { }) it('should pass meta to mutation', async () => { - const errorMock = jest.fn() - const successMock = jest.fn() + const errorMock = vi.fn() + const successMock = vi.fn() const queryClientMutationMeta = createQueryClient({ mutationCache: new MutationCache({ @@ -847,10 +848,10 @@ describe('useMutation', () => { }) it('should call cache callbacks when unmounted', async () => { - const onSuccess = jest.fn() - const onSuccessMutate = jest.fn() - const onSettled = jest.fn() - const onSettledMutate = jest.fn() + const onSuccess = vi.fn() + const onSuccessMutate = vi.fn() + const onSettled = vi.fn() + const onSettledMutate = vi.fn() const mutationKey = queryKey() let count = 0 @@ -919,10 +920,10 @@ describe('useMutation', () => { }) it('should call mutate callbacks only for the last observer', async () => { - const onSuccess = jest.fn() - const onSuccessMutate = jest.fn() - const onSettled = jest.fn() - const onSettledMutate = jest.fn() + const onSuccess = vi.fn() + const onSuccessMutate = vi.fn() + const onSettled = vi.fn() + const onSettledMutate = vi.fn() let count = 0 function Page() { @@ -1008,7 +1009,7 @@ describe('useMutation', () => { it('should go to error state if onSuccess callback errors', async () => { const error = new Error('error from onSuccess') - const onError = jest.fn() + const onError = vi.fn() function Page() { const mutation = useMutation({ @@ -1076,7 +1077,7 @@ describe('useMutation', () => { it('should go to error state if onSettled callback errors', async () => { const error = new Error('error from onSettled') const mutateFnError = new Error('mutateFnError') - const onError = jest.fn() + const onError = vi.fn() function Page() { const mutation = useMutation({ diff --git a/packages/react-query/src/__tests__/useMutationState.test.tsx b/packages/react-query/src/__tests__/useMutationState.test.tsx index ebc71ab4fa..65a3036c5c 100644 --- a/packages/react-query/src/__tests__/useMutationState.test.tsx +++ b/packages/react-query/src/__tests__/useMutationState.test.tsx @@ -8,8 +8,6 @@ import { setActTimeout, sleep, } from './utils' -import * as MutationCacheModule from '../../../query-core/src/mutationCache' -import { screen } from 'solid-testing-library' describe('useIsMutating', () => { it('should return the number of fetching mutations', async () => { @@ -140,61 +138,6 @@ describe('useIsMutating', () => { await waitFor(() => expect(isMutatings).toEqual([0, 1, 0])) }) - it('should not change state if unmounted', async () => { - // We have to mock the MutationCache to not unsubscribe - // the listener when the component is unmounted - class MutationCacheMock extends MutationCacheModule.MutationCache { - subscribe(listener: any) { - super.subscribe(listener) - return () => void 0 - } - } - - const MutationCacheSpy = jest - .spyOn(MutationCacheModule, 'MutationCache') - .mockImplementation((fn) => { - return new MutationCacheMock(fn) - }) - - const queryClient = createQueryClient() - - function IsMutating() { - useIsMutating() - return null - } - - function Page() { - const [mounted, setMounted] = React.useState(true) - const { mutate: mutate1 } = useMutation({ - mutationKey: ['mutation1'], - mutationFn: async () => { - await sleep(10) - return 'data' - }, - }) - - React.useEffect(() => { - mutate1() - }, [mutate1]) - - return ( -
- - {mounted && } -
- ) - } - - const { getByText } = renderWithClient(queryClient, ) - fireEvent.click(getByText('unmount')) - - // Should not display the console error - // "Warning: Can't perform a React state update on an unmounted component" - - await sleep(20) - MutationCacheSpy.mockRestore() - }) - it('should use provided custom queryClient', async () => { const queryClient = createQueryClient() @@ -275,7 +218,7 @@ describe('useMutationState', () => { await waitFor(() => rendered.getByText('data: null')) - fireEvent.click(screen.getByRole('button', { name: /mutate/i })) + fireEvent.click(rendered.getByRole('button', { name: /mutate/i })) await waitFor(() => rendered.getByText('data: data1')) diff --git a/packages/react-query/src/__tests__/useQueries.test.tsx b/packages/react-query/src/__tests__/useQueries.test.tsx index c6a86215a3..f582c7698d 100644 --- a/packages/react-query/src/__tests__/useQueries.test.tsx +++ b/packages/react-query/src/__tests__/useQueries.test.tsx @@ -1,9 +1,17 @@ -import { fireEvent, render, waitFor } from '@testing-library/react' +import { render, waitFor } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' -import * as QueriesObserverModule from '../../../query-core/src/queriesObserver' - +import type { QueryFunctionContext } from '@tanstack/query-core' +import { vi } from 'vitest' +import type { + QueryFunction, + QueryKey, + QueryObserverResult, + UseQueryOptions, + UseQueryResult, +} from '..' +import { QueryCache, useQueries } from '..' import { createQueryClient, expectType, @@ -12,15 +20,6 @@ import { renderWithClient, sleep, } from './utils' -import type { - QueryFunction, - QueryKey, - QueryObserverResult, - UseQueryOptions, - UseQueryResult, -} from '..' -import { QueriesObserver, QueryCache, useQueries } from '..' -import type { QueryFunctionContext } from '@tanstack/query-core' describe('useQueries', () => { const queryCache = new QueryCache() @@ -716,67 +715,8 @@ describe('useQueries', () => { } }) - it('should not change state if unmounted', async () => { - const key1 = queryKey() - - // We have to mock the QueriesObserver to not unsubscribe - // the listener when the component is unmounted - class QueriesObserverMock extends QueriesObserver { - subscribe(listener: any) { - super.subscribe(listener) - return () => void 0 - } - } - - const QueriesObserverSpy = jest - .spyOn(QueriesObserverModule, 'QueriesObserver') - .mockImplementation((fn) => { - return new QueriesObserverMock(fn) - }) - - function Queries() { - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: async () => { - await sleep(10) - return 1 - }, - }, - ], - }) - - return ( -
- queries -
- ) - } - - function Page() { - const [mounted, setMounted] = React.useState(true) - - return ( -
- - {mounted && } -
- ) - } - - const { getByText } = renderWithClient(queryClient, ) - fireEvent.click(getByText('unmount')) - - // Should not display the console error - // "Warning: Can't perform a React state update on an unmounted component" - - await sleep(20) - QueriesObserverSpy.mockRestore() - }) - it("should throw error if in one of queries' queryFn throws and throwErrors is in use", async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key1 = queryKey() @@ -841,7 +781,7 @@ describe('useQueries', () => { }) it("should throw error if in one of queries' queryFn throws and throwErrors function resolves to true", async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key1 = queryKey() diff --git a/packages/react-query/src/__tests__/useQuery.test.tsx b/packages/react-query/src/__tests__/useQuery.test.tsx index f0513de6bc..58bb17457e 100644 --- a/packages/react-query/src/__tests__/useQuery.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.test.tsx @@ -21,6 +21,8 @@ import type { } from '..' import { QueryCache, useQuery, keepPreviousData } from '..' import { ErrorBoundary } from 'react-error-boundary' +import { vi } from 'vitest' +import type { Mock } from 'vitest' describe('useQuery', () => { const queryCache = new QueryCache() @@ -451,7 +453,7 @@ describe('useQuery', () => { it('should call onSuccess after a query has been fetched', async () => { const key = queryKey() const states: UseQueryResult[] = [] - const onSuccess = jest.fn() + const onSuccess = vi.fn() function Page() { const state = useQuery({ @@ -477,7 +479,7 @@ describe('useQuery', () => { it('should call onSuccess after a query has been refetched', async () => { const key = queryKey() const states: UseQueryResult[] = [] - const onSuccess = jest.fn() + const onSuccess = vi.fn() let count = 0 function Page() { @@ -515,7 +517,7 @@ describe('useQuery', () => { it('should call onSuccess after a disabled query has been fetched', async () => { const key = queryKey() const states: UseQueryResult[] = [] - const onSuccess = jest.fn() + const onSuccess = vi.fn() function Page() { const state = useQuery({ @@ -554,7 +556,7 @@ describe('useQuery', () => { it('should not call onSuccess if a component has unmounted', async () => { const key = queryKey() const states: UseQueryResult[] = [] - const onSuccess = jest.fn() + const onSuccess = vi.fn() function Page() { const [show, setShow] = React.useState(true) @@ -589,7 +591,7 @@ describe('useQuery', () => { it('should call onError after a query has been fetched with an error', async () => { const key = queryKey() const states: UseQueryResult[] = [] - const onError = jest.fn() + const onError = vi.fn() function Page() { const state = useQuery({ @@ -612,7 +614,7 @@ describe('useQuery', () => { it('should not call onError when receiving a CancelledError', async () => { const key = queryKey() - const onError = jest.fn() + const onError = vi.fn() function Page() { const { status, fetchStatus } = useQuery({ @@ -646,7 +648,7 @@ describe('useQuery', () => { it('should call onSettled after a query has been fetched', async () => { const key = queryKey() const states: UseQueryResult[] = [] - const onSettled = jest.fn() + const onSettled = vi.fn() function Page() { const state = useQuery({ @@ -672,7 +674,7 @@ describe('useQuery', () => { it('should call onSettled after a query has been fetched with an error', async () => { const key = queryKey() - const onSettled = jest.fn() + const onSettled = vi.fn() const error = new Error('error') function Page() { @@ -2584,7 +2586,7 @@ describe('useQuery', () => { it('should not refetch query on focus when `enabled` is set to `false`', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') function Page() { const { data = 'default' } = useQuery({ @@ -2895,7 +2897,7 @@ describe('useQuery', () => { }) it('should throw error if queryFn throws and throwErrors is in use', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) const key = queryKey() @@ -2987,7 +2989,7 @@ describe('useQuery', () => { }) it('should throw error instead of setting status when error should be thrown', async () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -3355,7 +3357,7 @@ describe('useQuery', () => { it('should retry specified number of times', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => { return Promise.reject(new Error('Error test Barrett')) }) @@ -3392,7 +3394,7 @@ describe('useQuery', () => { it('should not retry if retry function `false`', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementationOnce(() => { return Promise.reject(new Error('Error test Tanner')) @@ -3438,7 +3440,7 @@ describe('useQuery', () => { type DelayError = { delay: number } - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => { return Promise.reject({ delay: 50 }) }) @@ -3631,10 +3633,10 @@ describe('useQuery', () => { const key = queryKey() const states: UseQueryResult[] = [] - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => 'data') - const prefetchQueryFn = jest.fn() + const prefetchQueryFn = vi.fn() prefetchQueryFn.mockImplementation(() => 'not yet...') await queryClient.prefetchQuery({ @@ -3662,10 +3664,10 @@ describe('useQuery', () => { it('should not refetch if not stale after a prefetch', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => 'data') - const prefetchQueryFn = jest.fn, unknown[]>() + const prefetchQueryFn = vi.fn>() prefetchQueryFn.mockImplementation(async () => { await sleep(10) return 'not yet...' @@ -3971,7 +3973,7 @@ describe('useQuery', () => { it('it should support enabled:false in query object syntax', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => 'data') function Page() { @@ -4030,15 +4032,11 @@ describe('useQuery', () => { const rendered = renderWithClient(queryClient, ) await waitFor(() => rendered.getByText('fetched data')) - jest.useFakeTimers({ - legacyFakeTimers: true, - }) - const setTimeoutSpy = jest.spyOn(globalThis.window, 'setTimeout') + const setTimeoutSpy = vi.spyOn(globalThis.window, 'setTimeout') rendered.unmount() expect(setTimeoutSpy).not.toHaveBeenCalled() - jest.useRealTimers() }) test('should schedule garbage collection, if gcTimeout is not set to infinity', async () => { @@ -4057,10 +4055,7 @@ describe('useQuery', () => { await waitFor(() => rendered.getByText('fetched data')) - jest.useFakeTimers({ - legacyFakeTimers: true, - }) - const setTimeoutSpy = jest.spyOn(globalThis.window, 'setTimeout') + const setTimeoutSpy = vi.spyOn(globalThis.window, 'setTimeout') rendered.unmount() @@ -4068,13 +4063,12 @@ describe('useQuery', () => { expect.any(Function), 1000 * 60 * 10, ) - jest.useRealTimers() }) it('should not cause memo churn when data does not change', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') - const memoFn = jest.fn() + const queryFn = vi.fn().mockReturnValue('data') + const memoFn = vi.fn() function Page() { const result = useQuery({ @@ -4281,7 +4275,7 @@ describe('useQuery', () => { it('should refetch if any query instance becomes enabled', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') function Disabled() { useQuery({ queryKey: key, queryFn, enabled: false }) @@ -4640,11 +4634,11 @@ describe('useQuery', () => { it('should cancel the query function when there are no more subscriptions', async () => { const key = queryKey() - let cancelFn: jest.Mock = jest.fn() + let cancelFn: Mock = vi.fn() const queryFn = ({ signal }: { signal?: AbortSignal }) => { const promise = new Promise((resolve, reject) => { - cancelFn = jest.fn(() => reject('Cancelled')) + cancelFn = vi.fn(() => reject('Cancelled')) signal?.addEventListener('abort', cancelFn) sleep(20).then(() => resolve('OK')) }) @@ -4963,7 +4957,7 @@ describe('useQuery', () => { }) it('should refetch when changed enabled to true in error state', async () => { - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(async () => { await sleep(10) return Promise.reject(new Error('Suspense Error Bingo')) @@ -5981,7 +5975,7 @@ describe('useQuery', () => { it('setQueryData - should not call onSuccess callback of active observers', async () => { const key = queryKey() - const onSuccess = jest.fn() + const onSuccess = vi.fn() function Page() { const state = useQuery({ diff --git a/packages/react-query/src/__tests__/utils.tsx b/packages/react-query/src/__tests__/utils.tsx index bc7d2c6ee9..268b60672b 100644 --- a/packages/react-query/src/__tests__/utils.tsx +++ b/packages/react-query/src/__tests__/utils.tsx @@ -3,6 +3,7 @@ import { act, render } from '@testing-library/react' import type { QueryClientConfig } from '..' import { QueryClient, QueryClientProvider } from '..' import * as utils from '@tanstack/query-core' +import { vi } from 'vitest' export function renderWithClient( client: QueryClient, @@ -45,11 +46,11 @@ export function createQueryClient(config?: QueryClientConfig): QueryClient { } export function mockVisibilityState(value: DocumentVisibilityState) { - return jest.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) + return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) } export function mockNavigatorOnLine(value: boolean) { - return jest.spyOn(navigator, 'onLine', 'get').mockReturnValue(value) + return vi.spyOn(navigator, 'onLine', 'get').mockReturnValue(value) } let queryKeyCount = 0 diff --git a/packages/react-query/jest.setup.ts b/packages/react-query/test-setup.ts similarity index 100% rename from packages/react-query/jest.setup.ts rename to packages/react-query/test-setup.ts diff --git a/packages/react-query/vitest.config.ts b/packages/react-query/vitest.config.ts new file mode 100644 index 0000000000..2de6741868 --- /dev/null +++ b/packages/react-query/vitest.config.ts @@ -0,0 +1,18 @@ +import { resolve } from 'path' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'react-query', + watch: false, + environment: 'jsdom', + setupFiles: ['test-setup.ts'], + globals: true, + coverage: { provider: 'istanbul' }, + }, + resolve: { + alias: { + '@tanstack/query-core': resolve(__dirname, '..', 'query-core', 'src'), + }, + }, +}) diff --git a/packages/solid-query/jest-preset.js b/packages/solid-query/jest-preset.js deleted file mode 100644 index cc0a653b64..0000000000 --- a/packages/solid-query/jest-preset.js +++ /dev/null @@ -1,7 +0,0 @@ -const solidPreset = require('solid-jest/preset/browser/jest-preset') -const tanStackPreset = require('../../jest-preset') - -module.exports = { - ...tanStackPreset, - ...solidPreset, -} diff --git a/packages/solid-query/jest.config.ts b/packages/solid-query/jest.config.ts deleted file mode 100644 index 46aedae757..0000000000 --- a/packages/solid-query/jest.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default { - displayName: 'solid-query', - preset: './jest-preset.js', - transform: { '^.+\\.(ts|tsx)$': './transform.js' }, -} diff --git a/packages/solid-query/package.json b/packages/solid-query/package.json index 1392de5e05..623fac93db 100644 --- a/packages/solid-query/package.json +++ b/packages/solid-query/package.json @@ -35,7 +35,7 @@ "clean": "rimraf ./build", "test:eslint": "eslint --ext .ts,.tsx ./src", "test:types": "tsc", - "test:lib": "jest --config ./jest.config.ts", + "test:lib": "vitest run --coverage", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build" }, @@ -48,7 +48,8 @@ "src" ], "devDependencies": { - "solid-jest": "^0.2.0" + "solid-jest": "^0.2.0", + "vite-plugin-solid": "^2.3.9" }, "dependencies": { "@tanstack/query-core": "workspace:*" diff --git a/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx b/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx index c4018544e0..292c18a3e1 100644 --- a/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx +++ b/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx @@ -4,6 +4,7 @@ import { queryKey } from './utils' import { QueryCache } from '@tanstack/query-core' import { createQuery, QueryClientProvider, useQueryClient } from '..' import { createQueryClient, sleep } from './utils' +import { vi } from 'vitest' describe('QueryClientProvider', () => { it('sets a specific cache for all queries to use', async () => { @@ -145,7 +146,7 @@ describe('QueryClientProvider', () => { describe('useQueryClient', () => { it('should throw an error if no query client has been set', () => { - const consoleMock = jest + const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) diff --git a/packages/solid-query/src/__tests__/createInfiniteQuery.test.tsx b/packages/solid-query/src/__tests__/createInfiniteQuery.test.tsx index 4e93a79c28..f1f130a3c4 100644 --- a/packages/solid-query/src/__tests__/createInfiniteQuery.test.tsx +++ b/packages/solid-query/src/__tests__/createInfiniteQuery.test.tsx @@ -23,6 +23,8 @@ import { keepPreviousData, } from '..' import { Blink, queryKey, setActTimeout } from './utils' +import { vi } from 'vitest' +import type { Mock } from 'vitest' interface Result { items: number[] @@ -712,14 +714,14 @@ describe('useInfiniteQuery', () => { it('should silently cancel an ongoing fetchNextPage request when another fetchNextPage is invoked', async () => { const key = queryKey() const start = 10 - const onAborts: jest.Mock[] = [] - const abortListeners: jest.Mock[] = [] - const fetchPage = jest.fn< - Promise, - [QueryFunctionContext] + const onAborts: Mock[] = [] + const abortListeners: Mock[] = [] + const fetchPage = vi.fn< + [QueryFunctionContext], + Promise >(async ({ pageParam, signal }) => { - const onAbort = jest.fn() - const abortListener = jest.fn() + const onAbort = vi.fn() + const abortListener = vi.fn() onAborts.push(onAbort) abortListeners.push(abortListener) signal.onabort = onAbort @@ -794,14 +796,14 @@ describe('useInfiniteQuery', () => { it('should not cancel an ongoing fetchNextPage request when another fetchNextPage is invoked if `cancelRefetch: false` is used ', async () => { const key = queryKey() const start = 10 - const onAborts: jest.Mock[] = [] - const abortListeners: jest.Mock[] = [] - const fetchPage = jest.fn< - Promise, - [QueryFunctionContext] + const onAborts: Mock[] = [] + const abortListeners: Mock[] = [] + const fetchPage = vi.fn< + [QueryFunctionContext], + Promise >(async ({ pageParam, signal }) => { - const onAbort = jest.fn() - const abortListener = jest.fn() + const onAbort = vi.fn() + const abortListener = vi.fn() onAborts.push(onAbort) abortListeners.push(abortListener) signal.onabort = onAbort @@ -1587,11 +1589,11 @@ describe('useInfiniteQuery', () => { it('should cancel the query function when there are no more subscriptions', async () => { const key = queryKey() - let cancelFn: jest.Mock = jest.fn() + let cancelFn: Mock = vi.fn() const queryFn = ({ signal }: { signal?: AbortSignal }) => { const promise = new Promise((resolve, reject) => { - cancelFn = jest.fn(() => reject('Cancelled')) + cancelFn = vi.fn(() => reject('Cancelled')) signal?.addEventListener('abort', cancelFn) sleep(20).then(() => resolve('OK')) }) diff --git a/packages/solid-query/src/__tests__/createMutation.test.tsx b/packages/solid-query/src/__tests__/createMutation.test.tsx index 1426da29b2..fb0798d27f 100644 --- a/packages/solid-query/src/__tests__/createMutation.test.tsx +++ b/packages/solid-query/src/__tests__/createMutation.test.tsx @@ -20,6 +20,7 @@ import { setActTimeout, sleep, } from './utils' +import { vi } from 'vitest' describe('createMutation', () => { const queryCache = new QueryCache() @@ -108,8 +109,8 @@ describe('createMutation', () => { it('should be able to call `onSuccess` and `onSettled` after each successful mutate', async () => { const [count, setCount] = createSignal(0) - const onSuccessMock = jest.fn() - const onSettledMock = jest.fn() + const onSuccessMock = vi.fn() + const onSettledMock = vi.fn() function Page() { const mutation = createMutation(() => ({ @@ -174,7 +175,7 @@ describe('createMutation', () => { const [count, setCount] = createSignal(0) type Value = { count: number } - const mutateFn = jest.fn, [value: Value]>() + const mutateFn = vi.fn<[value: Value], Promise>() mutateFn.mockImplementationOnce(() => { return Promise.reject(new Error('Error test Jonas')) @@ -231,8 +232,8 @@ describe('createMutation', () => { }) it('should be able to call `onError` and `onSettled` after each failed mutate', async () => { - const onErrorMock = jest.fn() - const onSettledMock = jest.fn() + const onErrorMock = vi.fn() + const onSettledMock = vi.fn() const [count, setCount] = createSignal(0) function Page() { @@ -562,7 +563,7 @@ describe('createMutation', () => { it('should call onMutate even if paused', async () => { const onlineMock = mockNavigatorOnLine(false) - const onMutate = jest.fn() + const onMutate = vi.fn() let count = 0 function Page() { @@ -870,8 +871,8 @@ describe('createMutation', () => { }) it('should pass meta to mutation', async () => { - const errorMock = jest.fn() - const successMock = jest.fn() + const errorMock = vi.fn() + const successMock = vi.fn() const queryClientMutationMeta = createQueryClient({ mutationCache: new MutationCache({ @@ -930,10 +931,10 @@ describe('createMutation', () => { }) it('should call cache callbacks when unmounted', async () => { - const onSuccess = jest.fn() - const onSuccessMutate = jest.fn() - const onSettled = jest.fn() - const onSettledMutate = jest.fn() + const onSuccess = vi.fn() + const onSuccessMutate = vi.fn() + const onSettled = vi.fn() + const onSettledMutate = vi.fn() const mutationKey = queryKey() let count = 0 @@ -1006,10 +1007,10 @@ describe('createMutation', () => { }) it('should call mutate callbacks only for the last observer', async () => { - const onSuccess = jest.fn() - const onSuccessMutate = jest.fn() - const onSettled = jest.fn() - const onSettledMutate = jest.fn() + const onSuccess = vi.fn() + const onSuccessMutate = vi.fn() + const onSettled = vi.fn() + const onSettledMutate = vi.fn() let count = 0 function Page() { @@ -1072,7 +1073,7 @@ describe('createMutation', () => { it('should go to error state if onSuccess callback errors', async () => { const error = new Error('error from onSuccess') - const onError = jest.fn() + const onError = vi.fn() function Page() { const mutation = createMutation(() => ({ @@ -1148,7 +1149,7 @@ describe('createMutation', () => { it('should go to error state if onSettled callback errors', async () => { const error = new Error('error from onSettled') const mutateFnError = new Error('mutateFnError') - const onError = jest.fn() + const onError = vi.fn() function Page() { const mutation = createMutation(() => ({ diff --git a/packages/solid-query/src/__tests__/createQueries.test.tsx b/packages/solid-query/src/__tests__/createQueries.test.tsx index 6c25328bf2..db16ceb6cb 100644 --- a/packages/solid-query/src/__tests__/createQueries.test.tsx +++ b/packages/solid-query/src/__tests__/createQueries.test.tsx @@ -23,6 +23,7 @@ import { queryKey, sleep, } from './utils' +import { vi } from 'vitest' describe('useQueries', () => { const queryCache = new QueryCache() @@ -739,7 +740,7 @@ describe('useQueries', () => { } } - const QueriesObserverSpy = jest + const QueriesObserverSpy = vi .spyOn(QueriesObserverModule, 'QueriesObserver') .mockImplementation((fn) => { return new QueriesObserverMock(fn) @@ -789,29 +790,4 @@ describe('useQueries', () => { await sleep(20) QueriesObserverSpy.mockRestore() }) - - it('should use provided custom queryClient', async () => { - const key = queryKey() - const queryFn = () => { - return Promise.resolve('custom client') - } - - function Page() { - const state = createQueries( - () => ({ - queries: [{ queryKey: key, queryFn }], - }), - () => queryClient, - ) - return ( -
-

Status: {state[0].data}

-
- ) - } - - render(() => ) - - await waitFor(() => screen.getByText('Status: custom client')) - }) }) diff --git a/packages/solid-query/src/__tests__/createQuery.test.tsx b/packages/solid-query/src/__tests__/createQuery.test.tsx index b39fdab66f..bb6228aab6 100644 --- a/packages/solid-query/src/__tests__/createQuery.test.tsx +++ b/packages/solid-query/src/__tests__/createQuery.test.tsx @@ -33,6 +33,8 @@ import { setActTimeout, sleep, } from './utils' +import { vi } from 'vitest' +import type { Mock } from 'vitest' describe('createQuery', () => { const queryCache = new QueryCache() @@ -491,7 +493,7 @@ describe('createQuery', () => { it('should call onSuccess after a query has been fetched', async () => { const key = queryKey() const states: CreateQueryResult[] = [] - const onSuccess = jest.fn() + const onSuccess = vi.fn() function Page() { const state = createQuery(() => ({ @@ -523,7 +525,7 @@ describe('createQuery', () => { it('should call onSuccess after a disabled query has been fetched', async () => { const key = queryKey() const states: CreateQueryResult[] = [] - const onSuccess = jest.fn() + const onSuccess = vi.fn() function Page() { const state = createQuery(() => ({ @@ -561,7 +563,7 @@ describe('createQuery', () => { it('should not call onSuccess if a component has unmounted', async () => { const key = queryKey() const states: CreateQueryResult[] = [] - const onSuccess = jest.fn() + const onSuccess = vi.fn() function Page() { const [show, setShow] = createSignal(true) @@ -601,7 +603,7 @@ describe('createQuery', () => { it('should call onError after a query has been fetched with an error', async () => { const key = queryKey() const states: CreateQueryResult[] = [] - const onError = jest.fn() + const onError = vi.fn() function Page() { const state = createQuery(() => ({ @@ -632,7 +634,7 @@ describe('createQuery', () => { it('should not call onError when receiving a CancelledError', async () => { const key = queryKey() - const onError = jest.fn() + const onError = vi.fn() function Page() { const state = createQuery(() => ({ @@ -666,7 +668,7 @@ describe('createQuery', () => { it('should call onSettled after a query has been fetched', async () => { const key = queryKey() const states: CreateQueryResult[] = [] - const onSettled = jest.fn() + const onSettled = vi.fn() function Page() { const state = createQuery(() => ({ @@ -696,7 +698,7 @@ describe('createQuery', () => { it('should call onSettled after a query has been fetched with an error', async () => { const key = queryKey() const states: CreateQueryResult[] = [] - const onSettled = jest.fn() + const onSettled = vi.fn() function Page() { const state = createQuery(() => ({ @@ -2452,7 +2454,7 @@ describe('createQuery', () => { it('should not refetch query on focus when `enabled` is set to `false`', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') function Page() { const { data = 'default' } = createQuery(() => ({ @@ -3296,7 +3298,7 @@ describe('createQuery', () => { it('should retry specified number of times', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => { return Promise.reject(new Error('Error test Barrett')) }) @@ -3337,7 +3339,7 @@ describe('createQuery', () => { it('should not retry if retry function `false`', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementationOnce(() => { return Promise.reject(new Error('Error test Tanner')) @@ -3385,7 +3387,7 @@ describe('createQuery', () => { type DelayError = { delay: number } - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => { return Promise.reject({ delay: 50 }) }) @@ -3596,10 +3598,10 @@ describe('createQuery', () => { const key = queryKey() const states: CreateQueryResult[] = [] - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => 'data') - const prefetchQueryFn = jest.fn() + const prefetchQueryFn = vi.fn() prefetchQueryFn.mockImplementation(() => 'not yet...') await queryClient.prefetchQuery({ @@ -3633,10 +3635,10 @@ describe('createQuery', () => { it('should not refetch if not stale after a prefetch', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => 'data') - const prefetchQueryFn = jest.fn, unknown[]>() + const prefetchQueryFn = vi.fn>() prefetchQueryFn.mockImplementation(async () => { await sleep(10) return 'not yet...' @@ -3909,7 +3911,7 @@ describe('createQuery', () => { it('it should support enabled:false in query object syntax', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => 'data') function Page() { @@ -3981,7 +3983,7 @@ describe('createQuery', () => { )) await waitFor(() => screen.getByText('fetched data')) - const setTimeoutSpy = jest.spyOn(window, 'setTimeout') + const setTimeoutSpy = vi.spyOn(window, 'setTimeout') result.unmount() @@ -4007,7 +4009,7 @@ describe('createQuery', () => { )) await waitFor(() => screen.getByText('fetched data')) - const setTimeoutSpy = jest.spyOn(window, 'setTimeout') + const setTimeoutSpy = vi.spyOn(window, 'setTimeout') result.unmount() @@ -4019,8 +4021,8 @@ describe('createQuery', () => { it('should not cause memo churn when data does not change', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') - const memoFn = jest.fn() + const queryFn = vi.fn().mockReturnValue('data') + const memoFn = vi.fn() function Page() { const result = createQuery(() => ({ @@ -4255,7 +4257,7 @@ describe('createQuery', () => { it('should refetch if any query instance becomes enabled', async () => { const key = queryKey() - const queryFn = jest.fn().mockReturnValue('data') + const queryFn = vi.fn().mockReturnValue('data') function Disabled() { createQuery(() => ({ queryKey: key, queryFn, enabled: false })) @@ -4610,11 +4612,11 @@ describe('createQuery', () => { it('should cancel the query function when there are no more subscriptions', async () => { const key = queryKey() - let cancelFn: jest.Mock = jest.fn() + let cancelFn: Mock = vi.fn() const queryFn = ({ signal }: { signal?: AbortSignal }) => { const promise = new Promise((resolve, reject) => { - cancelFn = jest.fn(() => reject('Cancelled')) + cancelFn = vi.fn(() => reject('Cancelled')) signal?.addEventListener('abort', cancelFn) sleep(20).then(() => resolve('OK')) }) @@ -4958,7 +4960,7 @@ describe('createQuery', () => { }) it('should refetch when changed enabled to true in error state', async () => { - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(async () => { await sleep(10) return Promise.reject(new Error('Suspense Error Bingo')) @@ -6052,7 +6054,7 @@ describe('createQuery', () => { it('setQueryData - should not call onSuccess callback of active observers', async () => { const key = queryKey() - const onSuccess = jest.fn() + const onSuccess = vi.fn() function Page() { const state = createQuery(() => ({ diff --git a/packages/solid-query/src/__tests__/suspense.test.tsx b/packages/solid-query/src/__tests__/suspense.test.tsx index 69588d94ca..e50afce71d 100644 --- a/packages/solid-query/src/__tests__/suspense.test.tsx +++ b/packages/solid-query/src/__tests__/suspense.test.tsx @@ -20,6 +20,7 @@ import { QueryClientProvider, } from '..' import { createQueryClient, queryKey, sleep } from './utils' +import { vi } from 'vitest' describe("useQuery's in Suspense mode", () => { const queryCache = new QueryCache() @@ -142,7 +143,7 @@ describe("useQuery's in Suspense mode", () => { it('should not call the queryFn twice when used in Suspense mode', async () => { const key = queryKey() - const queryFn = jest.fn() + const queryFn = vi.fn() queryFn.mockImplementation(() => { sleep(10) return 'data' @@ -219,7 +220,7 @@ describe("useQuery's in Suspense mode", () => { it('should call onSuccess on the first successful call', async () => { const key = queryKey() - const successFn = jest.fn() + const successFn = vi.fn() function Page() { createQuery(() => ({ @@ -254,8 +255,8 @@ describe("useQuery's in Suspense mode", () => { it('should call every onSuccess handler within a suspense boundary', async () => { const key = queryKey() - const successFn1 = jest.fn() - const successFn2 = jest.fn() + const successFn1 = vi.fn() + const successFn2 = vi.fn() function FirstComponent() { createQuery(() => ({ @@ -733,7 +734,7 @@ describe("useQuery's in Suspense mode", () => { it('should not call the queryFn when not enabled', async () => { const key = queryKey() - const queryFn = jest.fn, unknown[]>() + const queryFn = vi.fn>() queryFn.mockImplementation(async () => { await sleep(10) return '23' diff --git a/packages/solid-query/src/__tests__/useIsMutating.test.tsx b/packages/solid-query/src/__tests__/useIsMutating.test.tsx index b6d7f9dce7..db551e35b1 100644 --- a/packages/solid-query/src/__tests__/useIsMutating.test.tsx +++ b/packages/solid-query/src/__tests__/useIsMutating.test.tsx @@ -6,6 +6,7 @@ import { createEffect, createRenderEffect, createSignal, Show } from 'solid-js' import { render } from 'solid-testing-library' import * as MutationCacheModule from '../../../query-core/src/mutationCache' import { setActTimeout } from './utils' +import { vi } from 'vitest' describe('useIsMutating', () => { it('should return the number of fetching mutations', async () => { @@ -157,6 +158,33 @@ describe('useIsMutating', () => { await waitFor(() => expect(isMutatings).toEqual([0, 1, 0])) }) + it('should use provided custom queryClient', async () => { + const queryClient = createQueryClient() + function Page() { + const isMutating = useIsMutating(undefined, () => queryClient) + const { mutate } = createMutation( + () => ({ + mutationKey: ['mutation1'], + mutationFn: async () => { + await sleep(10) + return 'data' + }, + }), + () => queryClient, + ) + createEffect(() => { + mutate() + }) + return ( +
+
mutating: {isMutating}
+
+ ) + } + render(() => ) + await waitFor(() => screen.findByText('mutating: 1')) + }) + it('should not change state if unmounted', async () => { // We have to mock the MutationCache to not unsubscribe // the listener when the component is unmounted @@ -167,7 +195,7 @@ describe('useIsMutating', () => { } } - const MutationCacheSpy = jest + const MutationCacheSpy = vi .spyOn(MutationCacheModule, 'MutationCache') .mockImplementation((fn) => { return new MutationCacheMock(fn) @@ -217,36 +245,4 @@ describe('useIsMutating', () => { await sleep(20) MutationCacheSpy.mockRestore() }) - - it('should use provided custom queryClient', async () => { - const queryClient = createQueryClient() - - function Page() { - const isMutating = useIsMutating(undefined, () => queryClient) - const { mutate } = createMutation( - () => ({ - mutationKey: ['mutation1'], - mutationFn: async () => { - await sleep(10) - return 'data' - }, - }), - () => queryClient, - ) - - createEffect(() => { - mutate() - }) - - return ( -
-
mutating: {isMutating}
-
- ) - } - - render(() => ) - - await waitFor(() => screen.findByText('mutating: 1')) - }) }) diff --git a/packages/solid-query/src/__tests__/utils.tsx b/packages/solid-query/src/__tests__/utils.tsx index 8122f7ec0f..c3991c70cd 100644 --- a/packages/solid-query/src/__tests__/utils.tsx +++ b/packages/solid-query/src/__tests__/utils.tsx @@ -2,6 +2,7 @@ import type { QueryClientConfig } from '@tanstack/query-core' import { QueryClient } from '@tanstack/query-core' import type { ParentProps } from 'solid-js' import { createEffect, createSignal, onCleanup, Show } from 'solid-js' +import { vi } from 'vitest' let queryKeyCount = 0 export function queryKey(): Array { @@ -34,11 +35,11 @@ export function createQueryClient(config?: QueryClientConfig): QueryClient { } export function mockVisibilityState(value: DocumentVisibilityState) { - return jest.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) + return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value) } export function mockNavigatorOnLine(value: boolean) { - return jest.spyOn(navigator, 'onLine', 'get').mockReturnValue(value) + return vi.spyOn(navigator, 'onLine', 'get').mockReturnValue(value) } export function sleep(timeout: number): Promise { diff --git a/packages/solid-query/transform.js b/packages/solid-query/transform.js deleted file mode 100644 index d62bbfe50e..0000000000 --- a/packages/solid-query/transform.js +++ /dev/null @@ -1,9 +0,0 @@ -const babelJest = require('babel-jest') - -module.exports = babelJest.default.createTransformer({ - presets: [ - 'babel-preset-solid', - '@babel/preset-env', - '@babel/preset-typescript', - ], -}) diff --git a/packages/solid-query/vitest.config.ts b/packages/solid-query/vitest.config.ts new file mode 100644 index 0000000000..ea92ce34f8 --- /dev/null +++ b/packages/solid-query/vitest.config.ts @@ -0,0 +1,21 @@ +import { resolve } from 'path' +import solid from 'vite-plugin-solid' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'solid-query', + watch: false, + setupFiles: [], + environment: 'jsdom', + globals: true, + dir: 'src/__tests__', + coverage: { provider: 'istanbul' }, + }, + resolve: { + alias: { + '@tanstack/query-core': resolve(__dirname, '..', 'query-core', 'src'), + }, + }, + plugins: [solid()], +}) diff --git a/packages/vue-query/jest.config.ts b/packages/vue-query/jest.config.ts deleted file mode 100644 index 4b449129fd..0000000000 --- a/packages/vue-query/jest.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default { - displayName: 'vue-query', - preset: '../../jest-preset.js', -} diff --git a/packages/vue-query/package.json b/packages/vue-query/package.json index 1ac63eb45b..8096f63621 100644 --- a/packages/vue-query/package.json +++ b/packages/vue-query/package.json @@ -31,9 +31,9 @@ "test:eslint": "eslint --ext .ts ./src", "test:types": "tsc", "test:lib": "pnpm run test:2 && pnpm run test:2.7 && pnpm run test:3", - "test:2": "vue-demi-switch 2 vue2 && jest --config ./jest.config.ts", - "test:2.7": "vue-demi-switch 2.7 vue2.7 && jest --config ./jest.config.ts", - "test:3": "vue-demi-switch 3 && jest --config ./jest.config.ts", + "test:2": "vue-demi-switch 2 vue2 && vitest", + "test:2.7": "vue-demi-switch 2.7 vue2.7 && vitest", + "test:3": "vue-demi-switch 3 && vitest", "test:lib:dev": "pnpm run test:lib --watch", "build:types": "tsc --build" }, diff --git a/packages/vue-query/src/__mocks__/useBaseQuery.ts b/packages/vue-query/src/__mocks__/useBaseQuery.ts index 83d6d38820..7d6794f3fe 100644 --- a/packages/vue-query/src/__mocks__/useBaseQuery.ts +++ b/packages/vue-query/src/__mocks__/useBaseQuery.ts @@ -1,5 +1,8 @@ +import { vi } from 'vitest' + const { useBaseQuery: originImpl, unrefQueryArgs: originalParse } = - jest.requireActual('../useBaseQuery') + // @ts-expect-error - vitest uses esmodules; tsconfig is not set to use them + (await vi.importActual('../useBaseQuery')) as any -export const useBaseQuery = jest.fn(originImpl) +export const useBaseQuery = vi.fn(originImpl) export const unrefQueryArgs = originalParse diff --git a/packages/vue-query/src/__mocks__/useQueryClient.ts b/packages/vue-query/src/__mocks__/useQueryClient.ts index ae057aa119..9e966e5bd4 100644 --- a/packages/vue-query/src/__mocks__/useQueryClient.ts +++ b/packages/vue-query/src/__mocks__/useQueryClient.ts @@ -1,4 +1,5 @@ import { QueryClient } from '../queryClient' +import { vi } from 'vitest' const queryClient = new QueryClient({ defaultOptions: { @@ -6,4 +7,4 @@ const queryClient = new QueryClient({ }, }) -export const useQueryClient = jest.fn(() => queryClient) +export const useQueryClient = vi.fn(() => queryClient) diff --git a/packages/vue-query/src/__tests__/mutationCache.test.ts b/packages/vue-query/src/__tests__/mutationCache.test.ts index dc617dd863..bd57f9e26c 100644 --- a/packages/vue-query/src/__tests__/mutationCache.test.ts +++ b/packages/vue-query/src/__tests__/mutationCache.test.ts @@ -2,11 +2,12 @@ import { ref } from 'vue-demi' import { MutationCache as MutationCacheOrigin } from '@tanstack/query-core' import { MutationCache } from '../mutationCache' +import { vi } from 'vitest' describe('MutationCache', () => { beforeAll(() => { - jest.spyOn(MutationCacheOrigin.prototype, 'find') - jest.spyOn(MutationCacheOrigin.prototype, 'findAll') + vi.spyOn(MutationCacheOrigin.prototype, 'find') + vi.spyOn(MutationCacheOrigin.prototype, 'findAll') }) describe('find', () => { diff --git a/packages/vue-query/src/__tests__/queryCache.test.ts b/packages/vue-query/src/__tests__/queryCache.test.ts index de0d85690d..90a277d5b6 100644 --- a/packages/vue-query/src/__tests__/queryCache.test.ts +++ b/packages/vue-query/src/__tests__/queryCache.test.ts @@ -2,11 +2,12 @@ import { ref } from 'vue-demi' import { QueryCache as QueryCacheOrigin } from '@tanstack/query-core' import { QueryCache } from '../queryCache' +import { vi } from 'vitest' describe('QueryCache', () => { beforeAll(() => { - jest.spyOn(QueryCacheOrigin.prototype, 'find') - jest.spyOn(QueryCacheOrigin.prototype, 'findAll') + vi.spyOn(QueryCacheOrigin.prototype, 'find') + vi.spyOn(QueryCacheOrigin.prototype, 'findAll') }) describe('find', () => { diff --git a/packages/vue-query/src/__tests__/queryClient.test.ts b/packages/vue-query/src/__tests__/queryClient.test.ts index 040439dd7b..63281aa4d8 100644 --- a/packages/vue-query/src/__tests__/queryClient.test.ts +++ b/packages/vue-query/src/__tests__/queryClient.test.ts @@ -2,8 +2,9 @@ import { ref } from 'vue-demi' import { QueryClient as QueryClientOrigin } from '@tanstack/query-core' import { QueryClient } from '../queryClient' +import { vi } from 'vitest' -jest.mock('@tanstack/query-core') +vi.mock('@tanstack/query-core') const queryKeyRef = ['foo', ref('bar')] const queryKeyUnref = ['foo', 'bar'] diff --git a/packages/vue-query/src/__tests__/useInfiniteQuery.test.ts b/packages/vue-query/src/__tests__/useInfiniteQuery.test.ts index 0b3bc826a3..3cfc28e898 100644 --- a/packages/vue-query/src/__tests__/useInfiniteQuery.test.ts +++ b/packages/vue-query/src/__tests__/useInfiniteQuery.test.ts @@ -1,7 +1,8 @@ import { infiniteFetcher, flushPromises } from './test-utils' import { useInfiniteQuery } from '../useInfiniteQuery' +import { vi } from 'vitest' -jest.mock('../useQueryClient') +vi.mock('../useQueryClient') describe('useQuery', () => { test('should properly execute infinite query', async () => { diff --git a/packages/vue-query/src/__tests__/useIsFetching.test.ts b/packages/vue-query/src/__tests__/useIsFetching.test.ts index a3d67ef927..a2dd31ddba 100644 --- a/packages/vue-query/src/__tests__/useIsFetching.test.ts +++ b/packages/vue-query/src/__tests__/useIsFetching.test.ts @@ -3,8 +3,10 @@ import { onScopeDispose, reactive } from 'vue-demi' import { flushPromises, simpleFetcher } from './test-utils' import { useQuery } from '../useQuery' import { useIsFetching } from '../useIsFetching' +import { vi } from 'vitest' +import type { MockedFunction } from 'vitest' -jest.mock('../useQueryClient') +vi.mock('../useQueryClient') describe('useIsFetching', () => { test('should properly return isFetching state', async () => { @@ -25,7 +27,7 @@ describe('useIsFetching', () => { }) test('should stop listening to changes on onScopeDispose', async () => { - const onScopeDisposeMock = onScopeDispose as jest.MockedFunction< + const onScopeDisposeMock = onScopeDispose as MockedFunction< typeof onScopeDispose > onScopeDisposeMock.mockImplementation((fn) => fn()) diff --git a/packages/vue-query/src/__tests__/useIsMutating.test.ts b/packages/vue-query/src/__tests__/useIsMutating.test.ts index 4f006b7bec..92aeb685b6 100644 --- a/packages/vue-query/src/__tests__/useIsMutating.test.ts +++ b/packages/vue-query/src/__tests__/useIsMutating.test.ts @@ -3,8 +3,9 @@ import { onScopeDispose, reactive } from 'vue-demi' import { flushPromises, successMutator } from './test-utils' import { useMutation } from '../useMutation' import { useIsMutating } from '../useIsMutating' +import { vi } from 'vitest' -jest.mock('../useQueryClient') +vi.mock('../useQueryClient') describe('useIsMutating', () => { test('should properly return isMutating state', async () => { diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index 7dffaf6dcc..5b55275274 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -2,8 +2,9 @@ import { reactive, ref } from 'vue-demi' import { errorMutator, flushPromises, successMutator } from './test-utils' import { useMutation } from '../useMutation' import { useQueryClient } from '../useQueryClient' +import { vi } from 'vitest' -jest.mock('../useQueryClient') +vi.mock('../useQueryClient') describe('useMutation', () => { test('should be in idle state initially', () => { @@ -178,11 +179,11 @@ describe('useMutation', () => { describe('side effects', () => { beforeEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() }) test('should call onMutate when passed as an option', async () => { - const onMutate = jest.fn() + const onMutate = vi.fn() const mutation = useMutation({ mutationFn: (params: string) => successMutator(params), onMutate, @@ -196,7 +197,7 @@ describe('useMutation', () => { }) test('should call onError when passed as an option', async () => { - const onError = jest.fn() + const onError = vi.fn() const mutation = useMutation({ mutationFn: (params: string) => errorMutator(params), onError, @@ -210,7 +211,7 @@ describe('useMutation', () => { }) test('should call onSuccess when passed as an option', async () => { - const onSuccess = jest.fn() + const onSuccess = vi.fn() const mutation = useMutation({ mutationFn: (params: string) => successMutator(params), onSuccess, @@ -224,7 +225,7 @@ describe('useMutation', () => { }) test('should call onSettled when passed as an option', async () => { - const onSettled = jest.fn() + const onSettled = vi.fn() const mutation = useMutation({ mutationFn: (params: string) => successMutator(params), onSettled, @@ -238,7 +239,7 @@ describe('useMutation', () => { }) test('should call onError when passed as an argument of mutate function', async () => { - const onError = jest.fn() + const onError = vi.fn() const mutation = useMutation({ mutationFn: (params: string) => errorMutator(params), }) @@ -251,7 +252,7 @@ describe('useMutation', () => { }) test('should call onSuccess when passed as an argument of mutate function', async () => { - const onSuccess = jest.fn() + const onSuccess = vi.fn() const mutation = useMutation({ mutationFn: (params: string) => successMutator(params), }) @@ -264,7 +265,7 @@ describe('useMutation', () => { }) test('should call onSettled when passed as an argument of mutate function', async () => { - const onSettled = jest.fn() + const onSettled = vi.fn() const mutation = useMutation({ mutationFn: (params: string) => successMutator(params), }) @@ -277,8 +278,8 @@ describe('useMutation', () => { }) test('should fire both onSettled functions', async () => { - const onSettled = jest.fn() - const onSettledOnFunction = jest.fn() + const onSettled = vi.fn() + const onSettledOnFunction = vi.fn() const mutation = useMutation({ mutationFn: (params: string) => successMutator(params), onSettled, @@ -295,7 +296,7 @@ describe('useMutation', () => { describe('async', () => { beforeEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() }) test('should resolve properly', async () => { diff --git a/packages/vue-query/src/__tests__/useQueries.test.ts b/packages/vue-query/src/__tests__/useQueries.test.ts index e4f74c786d..106d84ac39 100644 --- a/packages/vue-query/src/__tests__/useQueries.test.ts +++ b/packages/vue-query/src/__tests__/useQueries.test.ts @@ -9,10 +9,16 @@ import { import { useQueries } from '../useQueries' import { useQueryClient } from '../useQueryClient' import { QueryClient } from '../queryClient' +import { vi } from 'vitest' +import type { MockedFunction } from 'vitest' -jest.mock('../useQueryClient') +vi.mock('../useQueryClient') describe('useQueries', () => { + beforeEach(() => { + vi.restoreAllMocks() + }) + test('should return result for each query', () => { const queries = [ { @@ -159,7 +165,7 @@ describe('useQueries', () => { }) test('should stop listening to changes on onScopeDispose', async () => { - const onScopeDisposeMock = onScopeDispose as jest.MockedFunction< + const onScopeDisposeMock = onScopeDispose as MockedFunction< typeof onScopeDispose > onScopeDisposeMock.mockImplementationOnce((fn) => fn()) diff --git a/packages/vue-query/src/__tests__/useQuery.test.ts b/packages/vue-query/src/__tests__/useQuery.test.ts index 94e7fa8f76..aea379434f 100644 --- a/packages/vue-query/src/__tests__/useQuery.test.ts +++ b/packages/vue-query/src/__tests__/useQuery.test.ts @@ -15,9 +15,11 @@ import { } from './test-utils' import { useQuery } from '../useQuery' import { useBaseQuery } from '../useBaseQuery' +import { vi } from 'vitest' +import type { Mock, MockedFunction } from 'vitest' -jest.mock('../useQueryClient') -jest.mock('../useBaseQuery') +vi.mock('../useQueryClient') +vi.mock('../useBaseQuery') describe('useQuery', () => { test('should properly execute query', () => { @@ -123,7 +125,7 @@ describe('useQuery', () => { }) test('should update query on reactive options object change', async () => { - const spy = jest.fn() + const spy = vi.fn() const onSuccess = ref(() => { // Noop }) @@ -233,7 +235,7 @@ describe('useQuery', () => { }) test('should stop listening to changes on onScopeDispose', async () => { - const onScopeDisposeMock = onScopeDispose as jest.MockedFunction< + const onScopeDisposeMock = onScopeDispose as MockedFunction< typeof onScopeDispose > onScopeDisposeMock.mockImplementationOnce((fn) => fn()) @@ -256,7 +258,7 @@ describe('useQuery', () => { describe('suspense', () => { test('should return a Promise', () => { - const getCurrentInstanceSpy = getCurrentInstance as jest.Mock + const getCurrentInstanceSpy = getCurrentInstance as Mock getCurrentInstanceSpy.mockImplementation(() => ({ suspense: {} })) const query = useQuery({ queryKey: ['suspense'], queryFn: simpleFetcher }) @@ -266,7 +268,7 @@ describe('useQuery', () => { }) test('should resolve after being enabled', () => { - const getCurrentInstanceSpy = getCurrentInstance as jest.Mock + const getCurrentInstanceSpy = getCurrentInstance as Mock getCurrentInstanceSpy.mockImplementation(() => ({ suspense: {} })) let afterTimeout = false @@ -288,10 +290,10 @@ describe('useQuery', () => { }) test('should resolve immidiately when stale without refetching', () => { - const getCurrentInstanceSpy = getCurrentInstance as jest.Mock + const getCurrentInstanceSpy = getCurrentInstance as Mock getCurrentInstanceSpy.mockImplementation(() => ({ suspense: {} })) - const fetcherSpy = jest.fn(() => simpleFetcher()) + const fetcherSpy = vi.fn(() => simpleFetcher()) // let afterTimeout = false; const query = useQuery({ diff --git a/packages/vue-query/src/__tests__/useQueryClient.test.ts b/packages/vue-query/src/__tests__/useQueryClient.test.ts index 8f9d83aa81..715875cb30 100644 --- a/packages/vue-query/src/__tests__/useQueryClient.test.ts +++ b/packages/vue-query/src/__tests__/useQueryClient.test.ts @@ -1,10 +1,16 @@ import { getCurrentInstance, inject } from 'vue-demi' import { useQueryClient } from '../useQueryClient' import { VUE_QUERY_CLIENT } from '../utils' +import { vi } from 'vitest' +import type { Mock } from 'vitest' describe('useQueryClient', () => { - const injectSpy = inject as jest.Mock - const getCurrentInstanceSpy = getCurrentInstance as jest.Mock + const injectSpy = inject as Mock + const getCurrentInstanceSpy = getCurrentInstance as Mock + + beforeEach(() => { + vi.restoreAllMocks() + }) test('should return queryClient when it is provided in the context', () => { const queryClientMock = { name: 'Mocked client' } diff --git a/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts b/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts index fe0355cec5..7ef3bed2b6 100644 --- a/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts +++ b/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts @@ -8,10 +8,12 @@ import { setupDevtools } from '../devtools/devtools' import { flushPromises } from './test-utils' import { useQuery } from '../useQuery' import { useQueries } from '../useQueries' +import { vi } from 'vitest' +import type { Mock } from 'vitest' -jest.mock('../devtools/devtools') -jest.mock('../useQueryClient') -jest.mock('../useBaseQuery') +vi.mock('../devtools/devtools') +vi.mock('../useQueryClient') +vi.mock('../useBaseQuery') interface TestApp extends App { onUnmount: Function @@ -25,10 +27,10 @@ const testIf = (condition: boolean) => (condition ? test : test.skip) function getAppMock(withUnmountHook = false): TestApp { const mock = { - provide: jest.fn(), - unmount: jest.fn(), + provide: vi.fn(), + unmount: vi.fn(), onUnmount: withUnmountHook - ? jest.fn((u: Function) => { + ? vi.fn((u: Function) => { mock._unmount = u }) : undefined, @@ -43,7 +45,7 @@ function getAppMock(withUnmountHook = false): TestApp { describe('VueQueryPlugin', () => { describe('devtools', () => { test('should NOT setup devtools', () => { - const setupDevtoolsMock = setupDevtools as jest.Mock + const setupDevtoolsMock = setupDevtools as Mock const appMock = getAppMock() VueQueryPlugin.install(appMock) @@ -53,7 +55,7 @@ describe('VueQueryPlugin', () => { testIf(isVue2)('should setup devtools', () => { const envCopy = process.env.NODE_ENV process.env.NODE_ENV = 'development' - const setupDevtoolsMock = setupDevtools as jest.Mock + const setupDevtoolsMock = setupDevtools as Mock const appMock = getAppMock() VueQueryPlugin.install(appMock) @@ -67,7 +69,7 @@ describe('VueQueryPlugin', () => { testIf(isVue3)('should setup devtools', () => { const envCopy = process.env.NODE_ENV process.env.NODE_ENV = 'development' - const setupDevtoolsMock = setupDevtools as jest.Mock + const setupDevtoolsMock = setupDevtools as Mock const appMock = getAppMock() VueQueryPlugin.install(appMock) process.env.NODE_ENV = envCopy @@ -80,8 +82,8 @@ describe('VueQueryPlugin', () => { test('should call unmount on each client when onUnmount is missing', () => { const appMock = getAppMock() const customClient = { - mount: jest.fn(), - unmount: jest.fn(), + mount: vi.fn(), + unmount: vi.fn(), } as unknown as QueryClient const originalUnmount = appMock.unmount VueQueryPlugin.install(appMock, { @@ -98,8 +100,8 @@ describe('VueQueryPlugin', () => { test('should call onUnmount if present', () => { const appMock = getAppMock(true) const customClient = { - mount: jest.fn(), - unmount: jest.fn(), + mount: vi.fn(), + unmount: vi.fn(), } as unknown as QueryClient const originalUnmount = appMock.unmount VueQueryPlugin.install(appMock, { queryClient: customClient }) @@ -160,7 +162,7 @@ describe('VueQueryPlugin', () => { describe('when called with custom client', () => { testIf(isVue2)('should provide that custom client', () => { const appMock = getAppMock() - const customClient = { mount: jest.fn() } as unknown as QueryClient + const customClient = { mount: vi.fn() } as unknown as QueryClient VueQueryPlugin.install(appMock, { queryClient: customClient }) appMock._mixin.beforeCreate?.call(appMock) @@ -173,7 +175,7 @@ describe('VueQueryPlugin', () => { testIf(isVue3)('should provide that custom client', () => { const appMock = getAppMock() - const customClient = { mount: jest.fn() } as unknown as QueryClient + const customClient = { mount: vi.fn() } as unknown as QueryClient VueQueryPlugin.install(appMock, { queryClient: customClient }) expect(customClient.mount).toHaveBeenCalled() @@ -215,7 +217,7 @@ describe('VueQueryPlugin', () => { queryClientConfig: config, }) - const client = (appMock.provide as jest.Mock).mock.calls[0][1] + const client = (appMock.provide as Mock).mock.calls[0][1] const defaultOptions = client.getDefaultOptions() expect(defaultOptions).toEqual(config.defaultOptions) @@ -227,14 +229,14 @@ describe('VueQueryPlugin', () => { test('should properly modify isRestoring flag on queryClient', async () => { const appMock = getAppMock() const customClient = { - mount: jest.fn(), + mount: vi.fn(), isRestoring: ref(false), } as unknown as QueryClient VueQueryPlugin.install(appMock, { queryClient: customClient, clientPersister: () => [ - jest.fn(), + vi.fn(), new Promise((resolve) => { resolve() }), @@ -261,7 +263,7 @@ describe('VueQueryPlugin', () => { VueQueryPlugin.install(appMock, { queryClient: customClient, clientPersister: (client) => [ - jest.fn(), + vi.fn(), new Promise((resolve) => { setTimeout(() => { client.setQueryData(['persist'], () => ({ @@ -273,7 +275,7 @@ describe('VueQueryPlugin', () => { ], }) - const fnSpy = jest.fn() + const fnSpy = vi.fn() const query = useQuery( { @@ -308,7 +310,7 @@ describe('VueQueryPlugin', () => { VueQueryPlugin.install(appMock, { queryClient: customClient, clientPersister: (client) => [ - jest.fn(), + vi.fn(), new Promise((resolve) => { setTimeout(() => { client.setQueryData(['persist'], () => ({ @@ -320,7 +322,7 @@ describe('VueQueryPlugin', () => { ], }) - const fnSpy = jest.fn() + const fnSpy = vi.fn() const queries = useQueries( { diff --git a/packages/vue-query/src/devtools/devtools.ts b/packages/vue-query/src/devtools/devtools.ts index 972af2489a..d68b8fb9e3 100644 --- a/packages/vue-query/src/devtools/devtools.ts +++ b/packages/vue-query/src/devtools/devtools.ts @@ -169,7 +169,7 @@ export function setupDevtools(app: any, queryClient: QueryClient) { ' Query Details': [ { key: 'Query key', - value: query.queryHash as string, + value: query.queryHash, }, { key: 'Query status', diff --git a/packages/vue-query/src/useBaseQuery.ts b/packages/vue-query/src/useBaseQuery.ts index ffc9304be1..988ffeefe5 100644 --- a/packages/vue-query/src/useBaseQuery.ts +++ b/packages/vue-query/src/useBaseQuery.ts @@ -68,15 +68,13 @@ export function useBaseQuery< const client = queryClient || useQueryClient() const defaultedOptions = computed(() => { - const defaulted = client.defaultQueryOptions( - cloneDeepUnref(options as any), - ) as DefaultedQueryObserverOptions< + const defaulted: DefaultedQueryObserverOptions< TQueryFnData, TError, TData, TQueryData, TQueryKey - > + > = client.defaultQueryOptions(cloneDeepUnref(options as any)) defaulted._optimisticResults = client.isRestoring.value ? 'isRestoring' diff --git a/packages/vue-query/test-setup.ts b/packages/vue-query/test-setup.ts new file mode 100644 index 0000000000..f753388612 --- /dev/null +++ b/packages/vue-query/test-setup.ts @@ -0,0 +1,12 @@ +import { vi } from 'vitest' + +vi.mock('vue-demi', async () => { + const vue = await vi.importActual('vue-demi') + return { + ...(vue as any), + inject: vi.fn(), + provide: vi.fn(), + onScopeDispose: vi.fn(), + getCurrentInstance: vi.fn(() => ({ proxy: {} })), + } +}) diff --git a/packages/vue-query/tsconfig.json b/packages/vue-query/tsconfig.json index 85281afb6c..7f90d602fb 100644 --- a/packages/vue-query/tsconfig.json +++ b/packages/vue-query/tsconfig.json @@ -7,7 +7,5 @@ "tsBuildInfoFile": "./build/.tsbuildinfo" }, "include": ["src"], - "references": [ - { "path": "../query-core" } - ] + "references": [{ "path": "../query-core" }] } diff --git a/packages/vue-query/vitest.config.ts b/packages/vue-query/vitest.config.ts new file mode 100644 index 0000000000..c324d6f13c --- /dev/null +++ b/packages/vue-query/vitest.config.ts @@ -0,0 +1,19 @@ +import { resolve } from 'path' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + name: 'vue-query', + watch: false, + environment: 'jsdom', + globals: true, + dir: 'src/__tests__', + setupFiles: ['test-setup.ts'], + coverage: { provider: 'istanbul' }, + }, + resolve: { + alias: { + '@tanstack/query-core': resolve(__dirname, '..', 'query-core', 'src'), + }, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fbebc5130b..d7a3e1057d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -70,6 +70,7 @@ importers: ts-jest: ^29.0.5 ts-node: ^10.9.1 typescript: 4.7.4 + vitest: ^0.27.1 vue: ^3.2.47 devDependencies: '@babel/core': 7.20.12 @@ -138,6 +139,7 @@ importers: ts-jest: 29.0.5_uqw7jeknjiflrclraax22flbi4 ts-node: 10.9.1_j777nnsruz44drbtesvg2fqc7y typescript: 4.7.4 + vitest: 0.27.1 vue: 3.2.47 examples/react/algolia: @@ -158,11 +160,11 @@ importers: dependencies: '@algolia/client-search': 4.11.0 '@algolia/transporter': 4.11.0 - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty algoliasearch: 4.12.2 devDependencies: - '@tanstack/eslint-plugin-query': link:../../../packages/eslint-plugin-query + '@tanstack/eslint-plugin-query': 4.26.2 '@types/react': 18.0.15 '@types/react-dom': 18.0.6 '@vitejs/plugin-react': 2.1.0_vite@3.2.2 @@ -181,8 +183,8 @@ importers: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.21.4 isomorphic-unfetch: 3.0.0 next: 12.2.2_biqbaboplfbrettd7655fr4n2y @@ -200,13 +202,13 @@ importers: react-dom: ^18.0.0 vite: ^3.0.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.21.4 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 devDependencies: - '@tanstack/eslint-plugin-query': link:../../../packages/eslint-plugin-query + '@tanstack/eslint-plugin-query': 4.26.2 '@vitejs/plugin-react': 2.1.0_vite@3.1.3 vite: 3.1.3 @@ -221,8 +223,8 @@ importers: react-dom: ^18.0.0 vite: ^3.0.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty graphql: 15.8.0 graphql-request: 3.7.0_graphql@15.8.0 react: 18.2.0 @@ -249,15 +251,15 @@ importers: typescript: 4.7.4 vite: ^3.0.0 dependencies: - '@tanstack/query-sync-storage-persister': link:../../../packages/query-sync-storage-persister - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools - '@tanstack/react-query-persist-client': link:../../../packages/react-query-persist-client + '@tanstack/query-sync-storage-persister': 4.26.1 + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty + '@tanstack/react-query-persist-client': 4.26.1_vohxj3xpfxn57cw32hqo6tozmq axios: 0.26.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 devDependencies: - '@tanstack/eslint-plugin-query': link:../../../packages/eslint-plugin-query + '@tanstack/eslint-plugin-query': 4.26.2 '@types/react': 17.0.50 '@types/react-dom': 17.0.17 '@vitejs/plugin-react': 2.1.0_vite@3.1.4 @@ -276,8 +278,8 @@ importers: react-dom: ^18.0.0 vite: ^3.0.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.26.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -296,8 +298,8 @@ importers: react-dom: ^18.2.0 react-intersection-observer: ^8.33.1 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.21.4 isomorphic-unfetch: 3.0.0 next: 12.2.2_biqbaboplfbrettd7655fr4n2y @@ -316,8 +318,8 @@ importers: react-dom: ^18.2.0 react-intersection-observer: ^8.33.1 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.21.4 isomorphic-unfetch: 3.0.0 next: 12.2.2_biqbaboplfbrettd7655fr4n2y @@ -337,8 +339,8 @@ importers: resolve-from: ^5.0.0 web-streams-polyfill: ^3.0.3 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty ky: 0.23.0 ky-universal: 0.8.2_53xdiffegfcxt6522645rot5ue next: 12.2.2_biqbaboplfbrettd7655fr4n2y @@ -362,11 +364,11 @@ importers: react-hot-toast: ^2.2.0 vite: ^3.0.0 dependencies: - '@tanstack/query-sync-storage-persister': link:../../../packages/query-sync-storage-persister + '@tanstack/query-sync-storage-persister': 4.26.1 '@tanstack/react-location': 3.7.4_biqbaboplfbrettd7655fr4n2y - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools - '@tanstack/react-query-persist-client': link:../../../packages/react-query-persist-client + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty + '@tanstack/react-query-persist-client': 4.26.1_vohxj3xpfxn57cw32hqo6tozmq ky: 0.30.0 msw: 0.39.2 react: 18.2.0 @@ -389,8 +391,8 @@ importers: react-dom: ^18.2.0 typescript: 4.7.4 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty '@types/node': 14.14.14 '@types/react': 18.0.15 axios: 0.21.4 @@ -410,8 +412,8 @@ importers: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.21.4 isomorphic-unfetch: 3.0.0 next: 12.2.2_biqbaboplfbrettd7655fr4n2y @@ -427,8 +429,8 @@ importers: react-dom: ^18.0.0 vite: ^3.0.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty react: 18.2.0 react-dom: 18.2.0_react@18.2.0 devDependencies: @@ -445,8 +447,8 @@ importers: react: ^18.2.0 react-dom: ^18.2.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.21.4 isomorphic-unfetch: 3.0.0 next: 12.2.2_biqbaboplfbrettd7655fr4n2y @@ -486,8 +488,8 @@ importers: '@react-native-community/netinfo': 6.0.2_react-native@0.64.3 '@react-navigation/native': 6.0.11_sbjh7r6wrxe2pvsvaqturwwxna '@react-navigation/stack': 6.2.2_dpltcvsy22isyfoj2zvicex7ry - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_6xi2cjj4jkvnn2q2msxp65enam + '@tanstack/react-query-devtools': 4.26.1_isshboocdnrllsddrwo5vmqvcq expo: 43.0.5_@babel+core@7.19.1 expo-constants: 12.1.3 expo-status-bar: 1.1.0 @@ -526,8 +528,8 @@ importers: sort-by: ^1.2.0 vite: ^3.0.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty localforage: 1.10.0 match-sorter: 6.3.1 react: 18.2.0 @@ -552,8 +554,8 @@ importers: vite: ^3.0.0 dependencies: '@material-ui/core': 4.12.4_biqbaboplfbrettd7655fr4n2y - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty react: 18.2.0 react-dom: 18.2.0_react@18.2.0 react-router: 5.3.3_react@18.2.0 @@ -572,8 +574,8 @@ importers: react-dom: ^18.0.0 vite: ^3.0.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.26.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -594,8 +596,8 @@ importers: vite: ^3.0.0 dependencies: '@material-ui/core': 4.12.4_biqbaboplfbrettd7655fr4n2y - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty react: 18.2.0 react-dom: 18.2.0_react@18.2.0 react-router: 5.3.3_react@18.2.0 @@ -615,8 +617,8 @@ importers: react-error-boundary: ^2.2.3 vite: ^3.0.0 dependencies: - '@tanstack/react-query': link:../../../packages/react-query - '@tanstack/react-query-devtools': link:../../../packages/react-query-devtools + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + '@tanstack/react-query-devtools': 4.26.1_brdhmlf72zuns3lsk66phyptty axios: 0.21.4 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -635,7 +637,7 @@ importers: vite: ^3.0.9 vite-plugin-solid: ^2.3.9 dependencies: - '@tanstack/solid-query': link:../../../packages/solid-query + '@tanstack/solid-query': 4.26.1_solid-js@1.6.11 graphql: 16.6.0 graphql-request: 5.0.0_graphql@16.6.0 solid-js: 1.6.11 @@ -652,7 +654,7 @@ importers: vite: ^3.0.9 vite-plugin-solid: ^2.3.9 dependencies: - '@tanstack/solid-query': link:../../../packages/solid-query + '@tanstack/solid-query': 4.26.1_solid-js@1.6.11 solid-js: 1.6.11 devDependencies: typescript: 4.7.4 @@ -667,7 +669,7 @@ importers: vite: ^3.0.9 vite-plugin-solid: ^2.3.9 dependencies: - '@tanstack/solid-query': link:../../../packages/solid-query + '@tanstack/solid-query': 4.26.1_solid-js@1.6.11 solid-js: 1.6.11 devDependencies: typescript: 4.7.4 @@ -683,10 +685,10 @@ importers: vite: ^3.0.9 vite-plugin-solid: ^2.3.9 dependencies: - '@tanstack/solid-query': link:../../../packages/solid-query + '@tanstack/solid-query': 4.26.1_solid-js@1.6.11 solid-js: 1.6.11 devDependencies: - '@tanstack/eslint-plugin-query': link:../../../packages/eslint-plugin-query + '@tanstack/eslint-plugin-query': 4.26.2 typescript: 4.7.4 vite: 3.1.3 vite-plugin-solid: 2.3.9_solid-js@1.6.11+vite@3.1.3 @@ -708,7 +710,7 @@ importers: dependencies: '@solidjs/meta': 0.28.2_solid-js@1.6.11 '@solidjs/router': 0.6.0_solid-js@1.6.11 - '@tanstack/solid-query': link:../../../packages/solid-query + '@tanstack/solid-query': 4.26.1_solid-js@1.6.11 solid-js: 1.6.11 solid-start: 0.2.21_hj77zfsbczccdokc5ewmqqrrvy undici: 5.14.0 @@ -731,7 +733,7 @@ importers: typescript: ^4.7.4 vite: ^4.0.0 dependencies: - '@tanstack/svelte-query': link:../../../packages/svelte-query + '@tanstack/svelte-query': 4.26.1_svelte@3.55.0 devDependencies: '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.7 '@sveltejs/kit': 1.0.7_svelte@3.55.0+vite@4.0.4 @@ -752,7 +754,7 @@ importers: typescript: ^4.7.4 vite: ^4.0.0 dependencies: - '@tanstack/svelte-query': link:../../../packages/svelte-query + '@tanstack/svelte-query': 4.26.1_svelte@3.55.0 devDependencies: '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.7 '@sveltejs/kit': 1.0.7_svelte@3.55.0+vite@4.0.4 @@ -773,7 +775,7 @@ importers: typescript: ^4.7.4 vite: ^4.0.0 dependencies: - '@tanstack/svelte-query': link:../../../packages/svelte-query + '@tanstack/svelte-query': 4.26.1_svelte@3.55.0 devDependencies: '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.7 '@sveltejs/kit': 1.0.7_svelte@3.55.0+vite@4.0.4 @@ -794,7 +796,7 @@ importers: typescript: ^4.7.4 vite: ^4.0.0 dependencies: - '@tanstack/svelte-query': link:../../../packages/svelte-query + '@tanstack/svelte-query': 4.26.1_svelte@3.55.0 devDependencies: '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.7 '@sveltejs/kit': 1.0.7_svelte@3.55.0+vite@4.0.4 @@ -815,7 +817,7 @@ importers: typescript: ^4.7.4 vite: ^4.0.0 dependencies: - '@tanstack/svelte-query': link:../../../packages/svelte-query + '@tanstack/svelte-query': 4.26.1_svelte@3.55.0 devDependencies: '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.7 '@sveltejs/kit': 1.0.7_svelte@3.55.0+vite@4.0.4 @@ -836,7 +838,7 @@ importers: typescript: ^4.7.4 vite: ^4.0.0 dependencies: - '@tanstack/svelte-query': link:../../../packages/svelte-query + '@tanstack/svelte-query': 4.26.1_svelte@3.55.0 devDependencies: '@sveltejs/vite-plugin-svelte': 2.0.2_svelte@3.55.0+vite@4.0.4 '@tsconfig/svelte': 3.0.0 @@ -857,7 +859,7 @@ importers: typescript: ^4.7.4 vite: ^4.0.0 dependencies: - '@tanstack/svelte-query': link:../../../packages/svelte-query + '@tanstack/svelte-query': 4.26.1_svelte@3.55.0 devDependencies: '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.7 '@sveltejs/kit': 1.0.7_svelte@3.55.0+vite@4.0.4 @@ -881,7 +883,7 @@ importers: typescript: ^4.7.4 vite: ^4.0.0 dependencies: - '@tanstack/svelte-query': link:../../../packages/svelte-query + '@tanstack/svelte-query': 4.26.1_svelte@3.55.0 devDependencies: '@sveltejs/adapter-auto': 1.0.0_@sveltejs+kit@1.0.7 '@sveltejs/kit': 1.0.7_svelte@3.55.0+vite@4.0.4 @@ -902,7 +904,7 @@ importers: vite: ^3.1.8 vue: ^3.2.41 dependencies: - '@tanstack/vue-query': link:../../../packages/vue-query + '@tanstack/vue-query': 4.26.1_vue@3.2.41 vue: 3.2.41 devDependencies: '@vitejs/plugin-vue': 3.1.2_vite@3.1.8+vue@3.2.41 @@ -917,7 +919,7 @@ importers: vite: 3.1.4 vue: 3.2.39 dependencies: - '@tanstack/vue-query': link:../../../packages/vue-query + '@tanstack/vue-query': 4.26.1_vue@3.2.39 vue: 3.2.39 devDependencies: '@vitejs/plugin-vue': 3.1.0_vite@3.1.4+vue@3.2.39 @@ -934,9 +936,9 @@ importers: vite: 3.2.2 vue: 3.2.41 dependencies: - '@tanstack/query-persist-client-core': link:../../../packages/query-persist-client-core - '@tanstack/query-sync-storage-persister': link:../../../packages/query-sync-storage-persister - '@tanstack/vue-query': link:../../../packages/vue-query + '@tanstack/query-persist-client-core': 4.26.1 + '@tanstack/query-sync-storage-persister': 4.26.1 + '@tanstack/vue-query': 4.26.1_vue@3.2.41 vue: 3.2.41 devDependencies: '@vitejs/plugin-vue': 3.2.0_vite@3.2.2+vue@3.2.41 @@ -1053,10 +1055,12 @@ importers: specifiers: '@tanstack/query-core': workspace:* solid-jest: ^0.2.0 + vite-plugin-solid: ^2.3.9 dependencies: '@tanstack/query-core': link:../query-core devDependencies: solid-jest: 0.2.0 + vite-plugin-solid: 2.5.0 packages/svelte-query: specifiers: @@ -1246,11 +1250,10 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.14 + '@jridgewell/trace-mapping': 0.3.17 /@antfu/utils/0.7.2: resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==} - dev: false /@babel/code-frame/7.10.4: resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} @@ -1272,7 +1275,6 @@ packages: /@babel/compat-data/7.19.1: resolution: {integrity: sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==} engines: {node: '>=6.9.0'} - dev: true /@babel/compat-data/7.20.14: resolution: {integrity: sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==} @@ -1299,7 +1301,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true /@babel/core/7.20.12: resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} @@ -1401,7 +1402,6 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 semver: 6.3.0 - dev: true /@babel/helper-compilation-targets/7.20.7: resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} @@ -1740,7 +1740,6 @@ packages: '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-module-transforms/7.20.11: resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} @@ -1905,7 +1904,6 @@ packages: '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color - dev: true /@babel/helpers/7.20.13: resolution: {integrity: sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==} @@ -1931,7 +1929,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.20.7 - dev: true /@babel/parser/7.20.15: resolution: {integrity: sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==} @@ -5391,7 +5388,6 @@ packages: '@babel/code-frame': 7.18.6 '@babel/parser': 7.20.15 '@babel/types': 7.20.7 - dev: true /@babel/template/7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} @@ -5442,7 +5438,6 @@ packages: '@babel/helper-string-parser': 7.19.4 '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - dev: true /@babel/types/7.20.7: resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} @@ -5544,7 +5539,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm/0.16.15: @@ -5651,7 +5645,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64/0.16.15: @@ -6058,13 +6051,11 @@ packages: /@hapi/hoek/9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - dev: false /@hapi/topo/5.1.0: resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} dependencies: '@hapi/hoek': 9.3.0 - dev: false /@humanwhocodes/config-array/0.11.6: resolution: {integrity: sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==} @@ -6805,7 +6796,6 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 - dev: true /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -7390,7 +7380,6 @@ packages: is-reference: 1.2.1 magic-string: 0.27.0 rollup: 3.15.0 - dev: true /@rollup/plugin-json/6.0.0_rollup@3.15.0: resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} @@ -7403,7 +7392,6 @@ packages: dependencies: '@rollup/pluginutils': 5.0.2_rollup@3.15.0 rollup: 3.15.0 - dev: true /@rollup/plugin-node-resolve/13.3.0_rollup@2.79.1: resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} @@ -7433,7 +7421,6 @@ packages: is-module: 1.0.0 resolve: 1.22.1 rollup: 3.15.0 - dev: true /@rollup/plugin-node-resolve/15.0.1_rollup@3.15.0: resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} @@ -7489,7 +7476,6 @@ packages: estree-walker: 1.0.1 picomatch: 2.3.1 rollup: 3.15.0 - dev: true /@rollup/pluginutils/5.0.2_rollup@3.15.0: resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} @@ -7513,15 +7499,12 @@ packages: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} dependencies: '@hapi/hoek': 9.3.0 - dev: false /@sideway/formula/3.0.0: resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} - dev: false /@sideway/pinpoint/2.0.0: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - dev: false /@sinclair/typebox/0.25.23: resolution: {integrity: sha512-VEB8ygeP42CFLWyAJhN5OklpxUliqdNEUcXb4xZ/CINqtYGTjL5ukluKdKzQ0iWdUxyQ7B0539PAUhHKrCNWSQ==} @@ -7545,7 +7528,6 @@ packages: solid-js: '>=1.4.0' dependencies: solid-js: 1.6.11 - dev: false /@solidjs/router/0.6.0_solid-js@1.6.11: resolution: {integrity: sha512-7ug2fzXXhvvDBL4CQyMvMM9o3dgBE6PoRh38T8UTmMnYz4rcCfROqSZc9yq+YEC96qWt5OvJgZ1Uj/4EAQXlfA==} @@ -7553,7 +7535,6 @@ packages: solid-js: ^1.5.3 dependencies: solid-js: 1.6.11 - dev: false /@sveltejs/adapter-auto/1.0.0_@sveltejs+kit@1.0.7: resolution: {integrity: sha512-yKyPvlLVua1bJ/42FrR3X041mFGdB4GzTZOAEoHUcNBRE5Mhx94+eqHpC3hNvAOiLEDcKfVO0ObyKSu7qldU+w==} @@ -7633,6 +7614,10 @@ packages: tslib: 2.5.0 dev: false + /@tanstack/eslint-plugin-query/4.26.2: + resolution: {integrity: sha512-ugAvl6Is+bUMLt9BlAnXK6Wi7UnGV+4RwJ2W1ToFoucPvUb2Uf+ADU38JkHaNsI/TFgE3+kePhKh0zzDBhkw0Q==} + dev: true + /@tanstack/match-sorter-utils/8.7.0: resolution: {integrity: sha512-OgfIPMHTfuw9JGcXCCoEHWFP/eSP2eyhCYwkrFnWBM3NbUPAgOlFP11DbM7cozDRVB0XbPr1tD4pLAtWKlVUVg==} engines: {node: '>=12'} @@ -7647,6 +7632,22 @@ packages: remove-accents: 0.4.2 dev: false + /@tanstack/query-core/4.26.1: + resolution: {integrity: sha512-Zrx2pVQUP4ndnsu6+K/m8zerXSVY8QM+YSbxA1/jbBY21GeCd5oKfYl92oXPK0hPEUtoNuunIdiq0ZMqLos+Zg==} + dev: false + + /@tanstack/query-persist-client-core/4.26.1: + resolution: {integrity: sha512-gKO5VQuvNlMMTNSxRtB4tm3zGSx3/U9YluFkdumsHana9YMh3ngc76gUCbQZsnf5DDCwdI673F7A7oSphp/vgA==} + dependencies: + '@tanstack/query-core': 4.26.1 + dev: false + + /@tanstack/query-sync-storage-persister/4.26.1: + resolution: {integrity: sha512-Mt7Z+PKbdEiYt6KGTciLivHvsEQf2Q/G3lpGvLzqEP0S8VULJeUB3pqt6jvZBMgj4nKWBbyH3HZDtDw7pFyg2g==} + dependencies: + '@tanstack/query-persist-client-core': 4.26.1 + dev: false + /@tanstack/react-location/3.7.4_biqbaboplfbrettd7655fr4n2y: resolution: {integrity: sha512-6rH2vNHGr0uyeUz5ZHvWMYjeYKGgIKFzvs5749QtnS9f+FU7t7fQE0hKZAzltBZk82LT7iYbcHBRyUg2lW13VA==} engines: {node: '>=12'} @@ -7660,6 +7661,132 @@ packages: react-dom: 18.2.0_react@18.2.0 dev: false + /@tanstack/react-query-devtools/4.26.1_brdhmlf72zuns3lsk66phyptty: + resolution: {integrity: sha512-ts2mA+fyFYFRi3Cee4xBk8Fx6waSFOM+yCkFqwJfGQRGjjTIMYMZPJv4wkv7vy12IVi1SYhL8au22LRKlXS1Zg==} + peerDependencies: + '@tanstack/react-query': 4.26.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/match-sorter-utils': 8.7.6 + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + superjson: 1.10.0 + use-sync-external-store: 1.2.0_react@18.2.0 + dev: false + + /@tanstack/react-query-devtools/4.26.1_isshboocdnrllsddrwo5vmqvcq: + resolution: {integrity: sha512-ts2mA+fyFYFRi3Cee4xBk8Fx6waSFOM+yCkFqwJfGQRGjjTIMYMZPJv4wkv7vy12IVi1SYhL8au22LRKlXS1Zg==} + peerDependencies: + '@tanstack/react-query': 4.26.1 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@tanstack/match-sorter-utils': 8.7.6 + '@tanstack/react-query': 4.26.1_6xi2cjj4jkvnn2q2msxp65enam + react: 17.0.1 + react-dom: 17.0.1_react@17.0.1 + superjson: 1.10.0 + use-sync-external-store: 1.2.0_react@17.0.1 + dev: false + + /@tanstack/react-query-persist-client/4.26.1_vohxj3xpfxn57cw32hqo6tozmq: + resolution: {integrity: sha512-efS2hPz8z+ySCTIy1DJ4uuT7LSi8F0E4bMXwP/aj2dDuMRFn6AV3z7LItInpp0Em3JKhi90GP2vxDyvQTOhO2A==} + peerDependencies: + '@tanstack/react-query': 4.26.1 + dependencies: + '@tanstack/query-persist-client-core': 4.26.1 + '@tanstack/react-query': 4.26.1_biqbaboplfbrettd7655fr4n2y + dev: false + + /@tanstack/react-query/4.26.1_6xi2cjj4jkvnn2q2msxp65enam: + resolution: {integrity: sha512-i3dnz4TOARGIXrXQ5P7S25Zfi4noii/bxhcwPurh2nrf5EUCcAt/95TB2HSmMweUBx206yIMWUMEQ7ptd6zwDg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.26.1 + react: 17.0.1 + react-dom: 17.0.1_react@17.0.1 + react-native: 0.64.3_react@17.0.1 + use-sync-external-store: 1.2.0_react@17.0.1 + dev: false + + /@tanstack/react-query/4.26.1_biqbaboplfbrettd7655fr4n2y: + resolution: {integrity: sha512-i3dnz4TOARGIXrXQ5P7S25Zfi4noii/bxhcwPurh2nrf5EUCcAt/95TB2HSmMweUBx206yIMWUMEQ7ptd6zwDg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@tanstack/query-core': 4.26.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + use-sync-external-store: 1.2.0_react@18.2.0 + dev: false + + /@tanstack/solid-query/4.26.1_solid-js@1.6.11: + resolution: {integrity: sha512-MU313rBrU8iJfBx0/fUXzzZiyQeRYJy1TNI2YKYzVUAU9bfioMcvAXMgB8R9h4SCOz9tN4xCC7JGnuB8k39KaA==} + peerDependencies: + solid-js: ^1.5.7 + dependencies: + '@tanstack/query-core': 4.26.1 + solid-js: 1.6.11 + dev: false + + /@tanstack/svelte-query/4.26.1_svelte@3.55.0: + resolution: {integrity: sha512-5w51/QUw8lZZ99wtCk+6gze3fBws6JTSrMAxb3bM0o6fdDCUuTXl4LTv41ZCPuhbTnzzlUNKzGPcJDiQ1fSxRQ==} + peerDependencies: + svelte: ^3.54.0 + dependencies: + '@tanstack/query-core': 4.26.1 + svelte: 3.55.0 + dev: false + + /@tanstack/vue-query/4.26.1_vue@3.2.39: + resolution: {integrity: sha512-o42vdAkcD/1DWhf9j+AC0J8N9BCJSGBJeZpkOjx4aOzUdeeWKwoPfENGYID1wmQ4AVDOr9INNku9mHPRI0e4IQ==} + peerDependencies: + '@vue/composition-api': ^1.1.2 + vue: ^2.5.0 || ^3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + '@tanstack/match-sorter-utils': 8.7.6 + '@tanstack/query-core': 4.26.1 + '@vue/devtools-api': 6.5.0 + vue: 3.2.39 + vue-demi: 0.13.11_vue@3.2.39 + dev: false + + /@tanstack/vue-query/4.26.1_vue@3.2.41: + resolution: {integrity: sha512-o42vdAkcD/1DWhf9j+AC0J8N9BCJSGBJeZpkOjx4aOzUdeeWKwoPfENGYID1wmQ4AVDOr9INNku9mHPRI0e4IQ==} + peerDependencies: + '@vue/composition-api': ^1.1.2 + vue: ^2.5.0 || ^3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + '@tanstack/match-sorter-utils': 8.7.6 + '@tanstack/query-core': 4.26.1 + '@vue/devtools-api': 6.5.0 + vue: 3.2.41 + vue-demi: 0.13.11_vue@3.2.41 + dev: false + /@testing-library/dom/7.31.2: resolution: {integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==} engines: {node: '>=10'} @@ -7827,7 +7954,6 @@ packages: /@types/estree/0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - dev: true /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} @@ -7978,7 +8104,6 @@ packages: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: '@types/node': 18.13.0 - dev: true /@types/resolve/1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -8565,7 +8690,6 @@ packages: '@vue/shared': 3.2.39 estree-walker: 2.0.2 source-map: 0.6.1 - dev: false /@vue/compiler-core/3.2.41: resolution: {integrity: sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==} @@ -8574,7 +8698,6 @@ packages: '@vue/shared': 3.2.41 estree-walker: 2.0.2 source-map: 0.6.1 - dev: false /@vue/compiler-core/3.2.47: resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} @@ -8583,28 +8706,24 @@ packages: '@vue/shared': 3.2.47 estree-walker: 2.0.2 source-map: 0.6.1 - dev: true /@vue/compiler-dom/3.2.39: resolution: {integrity: sha512-HMFI25Be1C8vLEEv1hgEO1dWwG9QQ8LTTPmCkblVJY/O3OvWx6r1+zsox5mKPMGvqYEZa6l8j+xgOfUspgo7hw==} dependencies: '@vue/compiler-core': 3.2.39 '@vue/shared': 3.2.39 - dev: false /@vue/compiler-dom/3.2.41: resolution: {integrity: sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==} dependencies: '@vue/compiler-core': 3.2.41 '@vue/shared': 3.2.41 - dev: false /@vue/compiler-dom/3.2.47: resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} dependencies: '@vue/compiler-core': 3.2.47 '@vue/shared': 3.2.47 - dev: true /@vue/compiler-sfc/2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} @@ -8627,7 +8746,6 @@ packages: magic-string: 0.25.9 postcss: 8.4.21 source-map: 0.6.1 - dev: false /@vue/compiler-sfc/3.2.41: resolution: {integrity: sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==} @@ -8642,7 +8760,6 @@ packages: magic-string: 0.25.9 postcss: 8.4.21 source-map: 0.6.1 - dev: false /@vue/compiler-sfc/3.2.47: resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} @@ -8657,28 +8774,24 @@ packages: magic-string: 0.25.9 postcss: 8.4.21 source-map: 0.6.1 - dev: true /@vue/compiler-ssr/3.2.39: resolution: {integrity: sha512-EoGCJ6lincKOZGW+0Ky4WOKsSmqL7hp1ZYgen8M7u/mlvvEQUaO9tKKOy7K43M9U2aA3tPv0TuYYQFrEbK2eFQ==} dependencies: '@vue/compiler-dom': 3.2.39 '@vue/shared': 3.2.39 - dev: false /@vue/compiler-ssr/3.2.41: resolution: {integrity: sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==} dependencies: '@vue/compiler-dom': 3.2.41 '@vue/shared': 3.2.41 - dev: false /@vue/compiler-ssr/3.2.47: resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} dependencies: '@vue/compiler-dom': 3.2.47 '@vue/shared': 3.2.47 - dev: true /@vue/composition-api/1.7.1_vue@3.2.47: resolution: {integrity: sha512-xDWoEtxGXhH9Ku3ROYX/rzhcpt4v31hpPU5zF3UeVC/qxA3dChmqU8zvTUYoKh3j7rzpNsoFOwqsWG7XPMlaFA==} @@ -8686,7 +8799,6 @@ packages: vue: '>= 2.5 < 2.7' dependencies: vue: 3.2.47 - dev: true /@vue/devtools-api/6.5.0: resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} @@ -8700,7 +8812,6 @@ packages: '@vue/shared': 3.2.39 estree-walker: 2.0.2 magic-string: 0.25.9 - dev: false /@vue/reactivity-transform/3.2.41: resolution: {integrity: sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==} @@ -8710,7 +8821,6 @@ packages: '@vue/shared': 3.2.41 estree-walker: 2.0.2 magic-string: 0.25.9 - dev: false /@vue/reactivity-transform/3.2.47: resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} @@ -8720,46 +8830,39 @@ packages: '@vue/shared': 3.2.47 estree-walker: 2.0.2 magic-string: 0.25.9 - dev: true /@vue/reactivity/3.2.39: resolution: {integrity: sha512-vlaYX2a3qMhIZfrw3Mtfd+BuU+TZmvDrPMa+6lpfzS9k/LnGxkSuf0fhkP0rMGfiOHPtyKoU9OJJJFGm92beVQ==} dependencies: '@vue/shared': 3.2.39 - dev: false /@vue/reactivity/3.2.41: resolution: {integrity: sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==} dependencies: '@vue/shared': 3.2.41 - dev: false /@vue/reactivity/3.2.47: resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} dependencies: '@vue/shared': 3.2.47 - dev: true /@vue/runtime-core/3.2.39: resolution: {integrity: sha512-xKH5XP57JW5JW+8ZG1khBbuLakINTgPuINKL01hStWLTTGFOrM49UfCFXBcFvWmSbci3gmJyLl2EAzCaZWsx8g==} dependencies: '@vue/reactivity': 3.2.39 '@vue/shared': 3.2.39 - dev: false /@vue/runtime-core/3.2.41: resolution: {integrity: sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==} dependencies: '@vue/reactivity': 3.2.41 '@vue/shared': 3.2.41 - dev: false /@vue/runtime-core/3.2.47: resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} dependencies: '@vue/reactivity': 3.2.47 '@vue/shared': 3.2.47 - dev: true /@vue/runtime-dom/3.2.39: resolution: {integrity: sha512-4G9AEJP+sLhsqf5wXcyKVWQKUhI+iWfy0hWQgea+CpaTD7BR0KdQzvoQdZhwCY6B3oleSyNLkLAQwm0ya/wNoA==} @@ -8767,7 +8870,6 @@ packages: '@vue/runtime-core': 3.2.39 '@vue/shared': 3.2.39 csstype: 2.6.20 - dev: false /@vue/runtime-dom/3.2.41: resolution: {integrity: sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==} @@ -8775,7 +8877,6 @@ packages: '@vue/runtime-core': 3.2.41 '@vue/shared': 3.2.41 csstype: 2.6.20 - dev: false /@vue/runtime-dom/3.2.47: resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} @@ -8783,7 +8884,6 @@ packages: '@vue/runtime-core': 3.2.47 '@vue/shared': 3.2.47 csstype: 2.6.20 - dev: true /@vue/server-renderer/3.2.39_vue@3.2.39: resolution: {integrity: sha512-1yn9u2YBQWIgytFMjz4f/t0j43awKytTGVptfd3FtBk76t1pd8mxbek0G/DrnjJhd2V7mSTb5qgnxMYt8Z5iSQ==} @@ -8793,7 +8893,6 @@ packages: '@vue/compiler-ssr': 3.2.39 '@vue/shared': 3.2.39 vue: 3.2.39 - dev: false /@vue/server-renderer/3.2.41_vue@3.2.41: resolution: {integrity: sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==} @@ -8803,7 +8902,6 @@ packages: '@vue/compiler-ssr': 3.2.41 '@vue/shared': 3.2.41 vue: 3.2.41 - dev: false /@vue/server-renderer/3.2.47_vue@3.2.47: resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} @@ -8813,19 +8911,15 @@ packages: '@vue/compiler-ssr': 3.2.47 '@vue/shared': 3.2.47 vue: 3.2.47 - dev: true /@vue/shared/3.2.39: resolution: {integrity: sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw==} - dev: false /@vue/shared/3.2.41: resolution: {integrity: sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==} - dev: false /@vue/shared/3.2.47: resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} - dev: true /@xmldom/xmldom/0.7.5: resolution: {integrity: sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==} @@ -9273,7 +9367,7 @@ packages: /axios/0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 transitivePeerDependencies: - debug dev: false @@ -9281,7 +9375,7 @@ packages: /axios/0.24.0: resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 transitivePeerDependencies: - debug dev: true @@ -9289,15 +9383,14 @@ packages: /axios/0.25.0_debug@4.3.4: resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 transitivePeerDependencies: - debug - dev: false /axios/0.26.1: resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 transitivePeerDependencies: - debug dev: false @@ -9305,7 +9398,7 @@ packages: /axios/1.3.3: resolution: {integrity: sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -9794,7 +9887,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true /braces/2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} @@ -9847,7 +9939,6 @@ packages: electron-to-chromium: 1.4.258 node-releases: 2.0.6 update-browserslist-db: 1.0.9_browserslist@4.21.4 - dev: true /browserslist/4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} @@ -9907,7 +9998,6 @@ packages: /builtin-modules/3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - dev: true /bundle-require/3.1.0_esbuild@0.15.9: resolution: {integrity: sha512-IIXtAO7fKcwPHNPt9kY/WNVJqy7NDy6YqJvv6ENH0TOZoJ+yjpEsn1w40WKZbR2ibfu5g1rfgJTvmFHpm5aOMA==} @@ -10357,7 +10447,6 @@ packages: utils-merge: 1.0.1 transitivePeerDependencies: - supports-color - dev: false /conventional-changelog-angular/5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} @@ -10692,7 +10781,6 @@ packages: /deepmerge/4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} - dev: true /defaults/1.0.3: resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} @@ -10750,7 +10838,6 @@ packages: /dequal/2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: false /destroy/1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} @@ -10856,7 +10943,6 @@ packages: /dotenv/16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dev: false /duplexer/0.1.1: resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} @@ -10874,11 +10960,9 @@ packages: /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: false /electron-to-chromium/1.4.258: resolution: {integrity: sha512-vutF4q0dTUXoAFI7Vbtdwen/BJVwPgj8GRg/SElOodfH7VTX+svUe62A5BG41QRQGk5HsZPB0M++KH1lAlOt0A==} - dev: true /electron-to-chromium/1.4.300: resolution: {integrity: sha512-tHLIBkKaxvG6NnDWuLgeYrz+LTwAnApHm2R3KBNcRrFn0qLmTrqQeB4X4atfN6YJbkOOOSdRBeQ89OfFUelnEQ==} @@ -10898,7 +10982,6 @@ packages: /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - dev: false /encoding/0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} @@ -11039,7 +11122,6 @@ packages: /es-module-lexer/1.1.1: resolution: {integrity: sha512-n3ruqU8Te7I5prBd6d0darM8ajFuVNhLWvgo04hN7goWSaSrxe7ENOZitac7akN0A2o+8fMomBDsNPvW/eE3CQ==} - dev: false /es-set-tostringtag/2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} @@ -11083,7 +11165,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /esbuild-android-arm64/0.14.54: @@ -11100,7 +11181,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /esbuild-darwin-64/0.14.54: @@ -11117,7 +11197,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /esbuild-darwin-arm64/0.14.54: @@ -11134,7 +11213,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /esbuild-freebsd-64/0.14.54: @@ -11151,7 +11229,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /esbuild-freebsd-arm64/0.14.54: @@ -11168,7 +11245,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /esbuild-linux-32/0.14.54: @@ -11185,7 +11261,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-64/0.14.54: @@ -11202,7 +11277,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-arm/0.14.54: @@ -11219,7 +11293,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-arm64/0.14.54: @@ -11236,7 +11309,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-mips64le/0.14.54: @@ -11253,7 +11325,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-ppc64le/0.14.54: @@ -11270,7 +11341,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-riscv64/0.14.54: @@ -11287,7 +11357,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-linux-s390x/0.14.54: @@ -11304,7 +11373,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /esbuild-netbsd-64/0.14.54: @@ -11321,7 +11389,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /esbuild-openbsd-64/0.14.54: @@ -11338,7 +11405,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /esbuild-plugin-solid/0.4.2_bve56rijdtklnf27lceyb3zzei: @@ -11354,7 +11420,6 @@ packages: solid-js: 1.6.11 transitivePeerDependencies: - supports-color - dev: false /esbuild-sunos-64/0.14.54: resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} @@ -11370,7 +11435,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /esbuild-windows-32/0.14.54: @@ -11387,7 +11451,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /esbuild-windows-64/0.14.54: @@ -11404,7 +11467,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /esbuild-windows-arm64/0.14.54: @@ -11421,7 +11483,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /esbuild/0.14.54: @@ -11480,7 +11541,6 @@ packages: esbuild-windows-32: 0.15.9 esbuild-windows-64: 0.15.9 esbuild-windows-arm64: 0.15.9 - dev: true /esbuild/0.16.15: resolution: {integrity: sha512-v+3ozjy9wyj8cOElzx3//Lsb4TCxPfZxRmdsfm0YaEkvZu7y6rKH7Zi1UpDx4JI7dSQui+U1Qxhfij9KBbHfrA==} @@ -11518,7 +11578,6 @@ packages: /escape-html/1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -12389,7 +12448,6 @@ packages: /estree-walker/1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - dev: true /estree-walker/2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -12798,7 +12856,6 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: false /find-babel-config/1.2.0: resolution: {integrity: sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==} @@ -12851,7 +12908,7 @@ packages: resolution: {integrity: sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg==} engines: {node: '>=0.4.0'} - /follow-redirects/1.15.1: + /follow-redirects/1.15.1_debug@4.3.4: resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} engines: {node: '>=4.0'} peerDependencies: @@ -12859,6 +12916,8 @@ packages: peerDependenciesMeta: debug: optional: true + dependencies: + debug: 4.3.4 /follow-redirects/1.5.10: resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==} @@ -12931,7 +12990,6 @@ packages: graceful-fs: 4.2.10 jsonfile: 6.1.0 universalify: 2.0.0 - dev: false /fs-extra/8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} @@ -13017,7 +13075,6 @@ packages: /get-port/6.1.2: resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false /get-stdin/6.0.0: resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} @@ -13114,7 +13171,6 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true /global/4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} @@ -13630,7 +13686,6 @@ packages: engines: {node: '>=6'} dependencies: builtin-modules: 3.3.0 - dev: true /is-callable/1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -13760,7 +13815,6 @@ packages: /is-module/1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - dev: true /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} @@ -13817,7 +13871,6 @@ packages: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: '@types/estree': 1.0.0 - dev: true /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -14602,7 +14655,6 @@ packages: '@sideway/address': 4.1.4 '@sideway/formula': 3.0.0 '@sideway/pinpoint': 2.0.0 - dev: false /joycon/3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -14785,7 +14837,6 @@ packages: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true - dev: true /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -14946,7 +14997,6 @@ packages: /kolorist/1.7.0: resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==} - dev: false /ky-universal/0.8.2_53xdiffegfcxt6522645rot5ue: resolution: {integrity: sha512-xe0JaOH9QeYxdyGLnzUOVGK4Z6FGvDVzcXFTdrYA1f33MZdEa45sUDaMBy98xQMcsd2XIBrTXRrRYnegcSdgVQ==} @@ -15218,7 +15268,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 - dev: true /make-dir/2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -15810,7 +15859,6 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: true /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} @@ -16057,7 +16105,6 @@ packages: /node-releases/2.0.6: resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} - dev: true /node-stream-zip/1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} @@ -16258,7 +16305,6 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 - dev: false /on-finished/2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -16472,7 +16518,6 @@ packages: /parse-multipart-data/1.5.0: resolution: {integrity: sha512-ck5zaMF0ydjGfejNMnlo5YU2oJ+pT+80Jb1y4ybanT27j+zbVP/jkYmCrUGsEln0Ox/hZmuvgy8Ra7AxbXP2Mw==} - dev: false /parse-png/2.1.0: resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} @@ -16490,7 +16535,6 @@ packages: /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - dev: false /pascal-case/3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} @@ -16643,7 +16687,6 @@ packages: dependencies: '@polka/url': 1.0.0-next.21 trouter: 3.2.0 - dev: true /popper.js/1.16.1-lts: resolution: {integrity: sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==} @@ -17391,7 +17434,6 @@ packages: /regexparam/1.3.0: resolution: {integrity: sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==} engines: {node: '>=6'} - dev: true /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} @@ -17630,7 +17672,6 @@ packages: dependencies: rollup: 3.15.0 route-sort: 1.0.0 - dev: false /rollup/2.78.1: resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} @@ -17646,7 +17687,6 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true /rollup/3.15.0: resolution: {integrity: sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==} @@ -17671,7 +17711,6 @@ packages: /route-sort/1.0.0: resolution: {integrity: sha512-SFgmvjoIhp5S4iBEDW3XnbT+7PRuZ55oRuNjY+CDB1SGZkyCG9bqQ3/dhaZTctTBYMAvDxd2Uy9dStuaUfgJqQ==} engines: {node: '>= 6'} - dev: false /rsvp/4.8.5: resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} @@ -18067,7 +18106,16 @@ packages: resolution: {integrity: sha512-JquQQHPArGq+i2PLURxJ99Pcz2/1docpbycSio/cKSA0SeI3z5zRjy0TNcH4NRYvbOLrcini+iovXwnexKabyw==} dependencies: csstype: 3.1.0 - dev: false + + /solid-refresh/0.4.1: + resolution: {integrity: sha512-v3tD/OXQcUyXLrWjPW1dXZyeWwP7/+GQNs8YTL09GBq+5FguA6IejJWUvJDrLIA4M0ho9/5zK2e9n+uy+4488g==} + peerDependencies: + solid-js: ^1.3 + dependencies: + '@babel/generator': 7.20.14 + '@babel/helper-module-imports': 7.18.6 + '@babel/types': 7.20.7 + dev: true /solid-refresh/0.4.1_solid-js@1.6.11: resolution: {integrity: sha512-v3tD/OXQcUyXLrWjPW1dXZyeWwP7/+GQNs8YTL09GBq+5FguA6IejJWUvJDrLIA4M0ho9/5zK2e9n+uy+4488g==} @@ -18099,7 +18147,6 @@ packages: vite: 3.2.2 transitivePeerDependencies: - supports-color - dev: true /solid-start/0.2.21_hj77zfsbczccdokc5ewmqqrrvy: resolution: {integrity: sha512-igh1vI6d8sBm9BeGGcJOE7ewEOSlhzmL3f4iVX0bg5oz+9xtqAf1EA0MvNkTLTvq5YKsVKYy80oJmm/xg0F8jw==} @@ -18173,7 +18220,6 @@ packages: wait-on: 6.0.1_debug@4.3.4 transitivePeerDependencies: - supports-color - dev: false /solid-testing-library/0.3.0_solid-js@1.5.7: resolution: {integrity: sha512-6NWVbySNVzyReBm2N6p3eF8bzxRZXHZTAmPix4vFWYol16QWVjNQsEUxvr+ZOutb0yuMZmNuGx3b6WIJYmjwMQ==} @@ -18343,7 +18389,6 @@ packages: /statuses/1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - dev: false /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} @@ -18747,7 +18792,6 @@ packages: /svelte/3.55.0: resolution: {integrity: sha512-uGu2FVMlOuey4JoKHKrpZFkoYyj0VLjJdz47zX5+gVK5odxHM40RVhar9/iK2YFRVxvfg9FkhfVlR0sjeIrOiA==} engines: {node: '>= 8'} - dev: true /svelte2tsx/0.6.0_glsdxddlaertg66rhhvanbinpy: resolution: {integrity: sha512-TrxfQkO7CKi8Pu2eC/FyteDCdk3OOeQV5u6z7OjYAsOhsd0ClzAKqxJdvp6xxNQLrbFzf/XvCi9Fy8MQ1MleFA==} @@ -19056,7 +19100,6 @@ packages: engines: {node: '>=6'} dependencies: regexparam: 1.3.0 - dev: true /ts-interface-checker/0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -19350,7 +19393,6 @@ packages: engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 - dev: false /unfetch/4.1.0: resolution: {integrity: sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg==} @@ -19418,7 +19460,6 @@ packages: /unpipe/1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - dev: false /unset-value/1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} @@ -19446,7 +19487,6 @@ packages: browserslist: 4.21.4 escalade: 3.1.1 picocolors: 1.0.0 - dev: true /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -19480,6 +19520,22 @@ packages: react: 18.2.0 dev: false + /use-sync-external-store/1.2.0_react@17.0.1: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 17.0.1 + dev: false + + /use-sync-external-store/1.2.0_react@18.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -19506,7 +19562,6 @@ packages: /utils-merge/1.0.1: resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} engines: {node: '>= 0.4.0'} - dev: false /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} @@ -19593,7 +19648,6 @@ packages: transitivePeerDependencies: - rollup - supports-color - dev: false /vite-plugin-solid/2.3.9_solid-js@1.6.11+vite@3.1.3: resolution: {integrity: sha512-+lprsYgt9DVNp0kbDj2d2HWAPI13L8ff5xslk9SjiPBcsY/YUZ/1Wj0J/Oj5aiVAhwfPm8IcM3bzyHJUPlmc8w==} @@ -19612,6 +19666,22 @@ packages: - supports-color dev: true + /vite-plugin-solid/2.5.0: + resolution: {integrity: sha512-VneGd3RyFJvwaiffsqgymeMaofn0IzQLPwDzafTV2f1agoWeeJlk5VrI5WqT9BTtLe69vNNbCJWqLhHr9fOdDw==} + peerDependencies: + solid-js: ^1.3.17 || ^1.4.0 || ^1.5.0 || ^1.6.0 + vite: ^3.0.0 || ^4.0.0 + dependencies: + '@babel/core': 7.20.12 + '@babel/preset-typescript': 7.18.6_@babel+core@7.20.12 + babel-preset-solid: 1.6.10_@babel+core@7.20.12 + merge-anything: 5.1.4 + solid-refresh: 0.4.1 + vitefu: 0.2.4 + transitivePeerDependencies: + - supports-color + dev: true + /vite-plugin-solid/2.5.0_solid-js@1.6.11+vite@3.2.2: resolution: {integrity: sha512-VneGd3RyFJvwaiffsqgymeMaofn0IzQLPwDzafTV2f1agoWeeJlk5VrI5WqT9BTtLe69vNNbCJWqLhHr9fOdDw==} peerDependencies: @@ -19628,7 +19698,6 @@ packages: vitefu: 0.2.4_vite@3.2.2 transitivePeerDependencies: - supports-color - dev: false /vite/3.1.3: resolution: {integrity: sha512-/3XWiktaopByM5bd8dqvHxRt5EEgRikevnnrpND0gRfNkrMrPaGGexhtLCzv15RcCMtV2CLw+BPas8YFeSG0KA==} @@ -19739,7 +19808,6 @@ packages: rollup: 2.79.1 optionalDependencies: fsevents: 2.3.2 - dev: true /vite/4.0.4: resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} @@ -19808,6 +19876,15 @@ packages: fsevents: 2.3.2 dev: true + /vitefu/0.2.4: + resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vite: + optional: true + dev: true + /vitefu/0.2.4_vite@3.2.2: resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: @@ -19817,7 +19894,6 @@ packages: optional: true dependencies: vite: 3.2.2 - dev: false /vitefu/0.2.4_vite@4.0.4: resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} @@ -19830,6 +19906,55 @@ packages: vite: 4.0.4 dev: true + /vitest/0.27.1: + resolution: {integrity: sha512-1sIpQ1DVFTEn7c1ici1XHcVfdU4nKiBmPtPAtGKJJJLuJjojTv/OHGgcf69P57alM4ty8V4NMv+7Yoi5Cxqx9g==} + engines: {node: '>=v14.16.0'} + hasBin: true + 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 + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.13.0 + 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: 4.0.4_@types+node@18.13.0 + vite-node: 0.27.1_@types+node@18.13.0 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vitest/0.27.1_jsdom@20.0.3: resolution: {integrity: sha512-1sIpQ1DVFTEn7c1ici1XHcVfdU4nKiBmPtPAtGKJJJLuJjojTv/OHGgcf69P57alM4ty8V4NMv+7Yoi5Cxqx9g==} engines: {node: '>=v14.16.0'} @@ -19900,6 +20025,36 @@ packages: vue: 3.2.47 dev: false + /vue-demi/0.13.11_vue@3.2.39: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.39 + dev: false + + /vue-demi/0.13.11_vue@3.2.41: + resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.2.41 + dev: false + /vue/2.6.14: resolution: {integrity: sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==} dev: true @@ -19919,7 +20074,6 @@ packages: '@vue/runtime-dom': 3.2.39 '@vue/server-renderer': 3.2.39_vue@3.2.39 '@vue/shared': 3.2.39 - dev: false /vue/3.2.41: resolution: {integrity: sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==} @@ -19929,7 +20083,6 @@ packages: '@vue/runtime-dom': 3.2.41 '@vue/server-renderer': 3.2.41_vue@3.2.41 '@vue/shared': 3.2.41 - dev: false /vue/3.2.47: resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} @@ -19939,7 +20092,6 @@ packages: '@vue/runtime-dom': 3.2.47 '@vue/server-renderer': 3.2.47_vue@3.2.47 '@vue/shared': 3.2.47 - dev: true /w3c-xmlserializer/4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} @@ -19960,7 +20112,6 @@ packages: rxjs: 7.5.5 transitivePeerDependencies: - debug - dev: false /walker/1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}