diff --git a/eslint.config.js b/eslint.config.js index d8a54583771..f156cd2e9c2 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -45,10 +45,7 @@ export default [ { files: ['**/*.spec.ts*', '**/*.test.ts*', '**/*.test-d.ts*'], plugins: { vitest }, - rules: { - ...vitest.configs.recommended.rules, - 'vitest/expect-expect': 'warn', - }, + rules: vitest.configs.recommended.rules, settings: { vitest: { typecheck: true } }, }, ] diff --git a/packages/angular-query-experimental/eslint.config.js b/packages/angular-query-experimental/eslint.config.js index 84b0029c8e7..a86775ff270 100644 --- a/packages/angular-query-experimental/eslint.config.js +++ b/packages/angular-query-experimental/eslint.config.js @@ -1,6 +1,7 @@ // @ts-check import pluginJsdoc from 'eslint-plugin-jsdoc' +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' export default [ @@ -28,4 +29,13 @@ export default [ ], }, }, + { + plugins: { vitest }, + rules: { + 'vitest/expect-expect': [ + 'error', + { assertFunctionNames: ['expect', 'expectSignals'] }, + ], + }, + }, ] diff --git a/packages/angular-query-experimental/src/__tests__/inject-query.test-d.ts b/packages/angular-query-experimental/src/__tests__/inject-query.test-d.ts index a49ca421cf2..406789dc424 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-query.test-d.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-query.test-d.ts @@ -108,11 +108,14 @@ describe('initialData', () => { }) describe('structuralSharing', () => { - it('should restrict to same types', () => { + it('should be able to use structuralSharing with unknown types', () => { + // https://github.com/TanStack/query/issues/6525#issuecomment-1938411343 injectQuery(() => ({ queryKey: ['key'], queryFn: () => 5, - structuralSharing: (_oldData, newData) => { + structuralSharing: (oldData, newData) => { + expectTypeOf(oldData).toBeUnknown() + expectTypeOf(newData).toBeUnknown() return newData }, })) diff --git a/packages/angular-query-experimental/src/__tests__/mutation-options.test-d.ts b/packages/angular-query-experimental/src/__tests__/mutation-options.test-d.ts index 0aea5556a87..97f4b0d946f 100644 --- a/packages/angular-query-experimental/src/__tests__/mutation-options.test-d.ts +++ b/packages/angular-query-experimental/src/__tests__/mutation-options.test-d.ts @@ -2,12 +2,7 @@ import { mutationOptions } from '../mutation-options' describe('mutationOptions', () => { test('should not allow excess properties', () => { - return mutationOptions({ - mutationFn: () => Promise.resolve(5), - mutationKey: ['key'], - // @ts-expect-error this is a good error, because onMutates does not exist! - onMutates: 1000, - }) + expectTypeOf(mutationOptions).parameter(0).not.toHaveProperty('onMutates') }) test('should infer types for callbacks', () => { diff --git a/packages/angular-query-experimental/src/__tests__/query-options.test-d.ts b/packages/angular-query-experimental/src/__tests__/query-options.test-d.ts index 0d49180b4a1..18cd986adff 100644 --- a/packages/angular-query-experimental/src/__tests__/query-options.test-d.ts +++ b/packages/angular-query-experimental/src/__tests__/query-options.test-d.ts @@ -4,16 +4,11 @@ import type { Signal } from '@angular/core' describe('queryOptions', () => { test('should not allow excess properties', () => { - return queryOptions({ - queryKey: ['key'], - queryFn: () => Promise.resolve(5), - // @ts-expect-error this is a good error, because stallTime does not exist! - stallTime: 1000, - }) + expectTypeOf(queryOptions).parameter(0).not.toHaveProperty('stallTime') }) test('should infer types for callbacks', () => { - return queryOptions({ + queryOptions({ queryKey: ['key'], queryFn: () => Promise.resolve(5), staleTime: 1000, @@ -24,7 +19,7 @@ describe('queryOptions', () => { }) test('should allow undefined response in initialData', () => { - return (id: string | null) => + const options = (id: string | null) => queryOptions({ queryKey: ['todo', id], queryFn: () => @@ -40,6 +35,10 @@ describe('queryOptions', () => { title: 'Initial Data', }, }) + + expectTypeOf(options(null).initialData).returns.toEqualTypeOf< + { id: string; title: string } | undefined + >() }) }) diff --git a/packages/eslint-plugin-query/eslint.config.js b/packages/eslint-plugin-query/eslint.config.js index cb04452c999..b6464bd8c98 100644 --- a/packages/eslint-plugin-query/eslint.config.js +++ b/packages/eslint-plugin-query/eslint.config.js @@ -8,6 +8,7 @@ export default [ { plugins: { vitest }, rules: { + ...vitest.configs.recommended.rules, 'vitest/expect-expect': [ 'warn', { diff --git a/packages/query-async-storage-persister/eslint.config.js b/packages/query-async-storage-persister/eslint.config.js index df75435c7e1..7ccaf501775 100644 --- a/packages/query-async-storage-persister/eslint.config.js +++ b/packages/query-async-storage-persister/eslint.config.js @@ -1,5 +1,15 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +export default [ + ...rootConfig, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/query-broadcast-client-experimental/eslint.config.js b/packages/query-broadcast-client-experimental/eslint.config.js index df75435c7e1..7ccaf501775 100644 --- a/packages/query-broadcast-client-experimental/eslint.config.js +++ b/packages/query-broadcast-client-experimental/eslint.config.js @@ -1,5 +1,15 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +export default [ + ...rootConfig, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/query-codemods/eslint.config.js b/packages/query-codemods/eslint.config.js index c3c009f41e8..c48269cff12 100644 --- a/packages/query-codemods/eslint.config.js +++ b/packages/query-codemods/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' export default [ @@ -15,4 +16,11 @@ export default [ 'sort-imports': 'off', }, }, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, ] diff --git a/packages/query-core/eslint.config.js b/packages/query-core/eslint.config.js index df75435c7e1..7ccaf501775 100644 --- a/packages/query-core/eslint.config.js +++ b/packages/query-core/eslint.config.js @@ -1,5 +1,15 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +export default [ + ...rootConfig, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index 03a0222b7fe..6d7485a6d7f 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -1003,7 +1003,7 @@ describe('query', () => { const key = queryKey() const queryFn = vi - .fn() + .fn<() => Promise>() .mockImplementation(() => sleep(10).then(() => 'data')) queryClient.prefetchQuery({ diff --git a/packages/query-persist-client-core/eslint.config.js b/packages/query-persist-client-core/eslint.config.js index df75435c7e1..7ccaf501775 100644 --- a/packages/query-persist-client-core/eslint.config.js +++ b/packages/query-persist-client-core/eslint.config.js @@ -1,5 +1,15 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +export default [ + ...rootConfig, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/query-sync-storage-persister/eslint.config.js b/packages/query-sync-storage-persister/eslint.config.js index df75435c7e1..7ccaf501775 100644 --- a/packages/query-sync-storage-persister/eslint.config.js +++ b/packages/query-sync-storage-persister/eslint.config.js @@ -1,5 +1,15 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +export default [ + ...rootConfig, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/react-query-devtools/eslint.config.js b/packages/react-query-devtools/eslint.config.js index ec7943f0190..9133d598946 100644 --- a/packages/react-query-devtools/eslint.config.js +++ b/packages/react-query-devtools/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import pluginReact from '@eslint-react/eslint-plugin' import pluginReactHooks from 'eslint-plugin-react-hooks' import rootConfig from './root.eslint.config.js' @@ -19,4 +20,11 @@ export default [ 'react-hooks/rules-of-hooks': 'error', }, }, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, ] diff --git a/packages/react-query-next-experimental/eslint.config.js b/packages/react-query-next-experimental/eslint.config.js index 3554c211ee3..45811bb8a14 100644 --- a/packages/react-query-next-experimental/eslint.config.js +++ b/packages/react-query-next-experimental/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import pluginReact from '@eslint-react/eslint-plugin' import pluginReactHooks from 'eslint-plugin-react-hooks' import rootConfig from './root.eslint.config.js' @@ -20,4 +21,11 @@ export default [ 'react-hooks/rules-of-hooks': 'error', }, }, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, ] diff --git a/packages/react-query-persist-client/eslint.config.js b/packages/react-query-persist-client/eslint.config.js index ec7943f0190..9133d598946 100644 --- a/packages/react-query-persist-client/eslint.config.js +++ b/packages/react-query-persist-client/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import pluginReact from '@eslint-react/eslint-plugin' import pluginReactHooks from 'eslint-plugin-react-hooks' import rootConfig from './root.eslint.config.js' @@ -19,4 +20,11 @@ export default [ 'react-hooks/rules-of-hooks': 'error', }, }, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, ] diff --git a/packages/react-query/eslint.config.js b/packages/react-query/eslint.config.js index aadb420b907..60faf155e0e 100644 --- a/packages/react-query/eslint.config.js +++ b/packages/react-query/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import pluginReact from '@eslint-react/eslint-plugin' // @ts-expect-error import pluginReactCompiler from 'eslint-plugin-react-compiler' @@ -31,4 +32,11 @@ export default [ 'react-compiler/react-compiler': 'off', }, }, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, ] diff --git a/packages/react-query/src/__tests__/useQuery.test-d.tsx b/packages/react-query/src/__tests__/useQuery.test-d.tsx index c7feaf3c86a..5aa37fc3766 100644 --- a/packages/react-query/src/__tests__/useQuery.test-d.tsx +++ b/packages/react-query/src/__tests__/useQuery.test-d.tsx @@ -308,11 +308,14 @@ describe('useQuery', () => { }) describe('structuralSharing', () => { - it('should restrict to same types', () => { + it('should be able to use structuralSharing with unknown types', () => { + // https://github.com/TanStack/query/issues/6525#issuecomment-1938411343 useQuery({ queryKey: ['key'], queryFn: () => 5, - structuralSharing: (_oldData, newData) => { + structuralSharing: (oldData, newData) => { + expectTypeOf(oldData).toBeUnknown() + expectTypeOf(newData).toBeUnknown() return newData }, }) diff --git a/packages/solid-query-devtools/eslint.config.js b/packages/solid-query-devtools/eslint.config.js index df75435c7e1..7ccaf501775 100644 --- a/packages/solid-query-devtools/eslint.config.js +++ b/packages/solid-query-devtools/eslint.config.js @@ -1,5 +1,15 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +export default [ + ...rootConfig, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/solid-query-persist-client/eslint.config.js b/packages/solid-query-persist-client/eslint.config.js index df75435c7e1..7ccaf501775 100644 --- a/packages/solid-query-persist-client/eslint.config.js +++ b/packages/solid-query-persist-client/eslint.config.js @@ -1,5 +1,15 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +export default [ + ...rootConfig, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/solid-query/eslint.config.js b/packages/solid-query/eslint.config.js index df75435c7e1..7ccaf501775 100644 --- a/packages/solid-query/eslint.config.js +++ b/packages/solid-query/eslint.config.js @@ -1,5 +1,15 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +export default [ + ...rootConfig, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/svelte-query-devtools/eslint.config.js b/packages/svelte-query-devtools/eslint.config.js index f31c5e878b4..b40d00982ab 100644 --- a/packages/svelte-query-devtools/eslint.config.js +++ b/packages/svelte-query-devtools/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import pluginSvelte from 'eslint-plugin-svelte' import rootConfig from './root.eslint.config.js' @@ -13,4 +14,11 @@ export default [ 'svelte/valid-compile': 'off', }, }, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, ] diff --git a/packages/svelte-query-persist-client/eslint.config.js b/packages/svelte-query-persist-client/eslint.config.js index f31c5e878b4..b40d00982ab 100644 --- a/packages/svelte-query-persist-client/eslint.config.js +++ b/packages/svelte-query-persist-client/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import pluginSvelte from 'eslint-plugin-svelte' import rootConfig from './root.eslint.config.js' @@ -13,4 +14,11 @@ export default [ 'svelte/valid-compile': 'off', }, }, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, ] diff --git a/packages/svelte-query/eslint.config.js b/packages/svelte-query/eslint.config.js index f31c5e878b4..b40d00982ab 100644 --- a/packages/svelte-query/eslint.config.js +++ b/packages/svelte-query/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' import pluginSvelte from 'eslint-plugin-svelte' import rootConfig from './root.eslint.config.js' @@ -13,4 +14,11 @@ export default [ 'svelte/valid-compile': 'off', }, }, + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, ] diff --git a/packages/vue-query-devtools/eslint.config.js b/packages/vue-query-devtools/eslint.config.js index 6cd1d47ba72..0810a2d674c 100644 --- a/packages/vue-query-devtools/eslint.config.js +++ b/packages/vue-query-devtools/eslint.config.js @@ -1,7 +1,18 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' // @ts-expect-error import pluginVue from 'eslint-plugin-vue' import rootConfig from './root.eslint.config.js' -export default [...rootConfig, ...pluginVue.configs['flat/base']] +export default [ + ...rootConfig, + ...pluginVue.configs['flat/base'], + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/vue-query/eslint.config.js b/packages/vue-query/eslint.config.js index 6cd1d47ba72..0810a2d674c 100644 --- a/packages/vue-query/eslint.config.js +++ b/packages/vue-query/eslint.config.js @@ -1,7 +1,18 @@ // @ts-check +import vitest from '@vitest/eslint-plugin' // @ts-expect-error import pluginVue from 'eslint-plugin-vue' import rootConfig from './root.eslint.config.js' -export default [...rootConfig, ...pluginVue.configs['flat/base']] +export default [ + ...rootConfig, + ...pluginVue.configs['flat/base'], + { + plugins: { vitest }, + rules: { + ...vitest.configs.recommended.rules, + 'vitest/expect-expect': 'warn', + }, + }, +] diff --git a/packages/vue-query/src/__tests__/useQuery.test-d.ts b/packages/vue-query/src/__tests__/useQuery.test-d.ts index 3185a88957b..84437f8fc19 100644 --- a/packages/vue-query/src/__tests__/useQuery.test-d.ts +++ b/packages/vue-query/src/__tests__/useQuery.test-d.ts @@ -161,11 +161,14 @@ describe('useQuery', () => { }) describe('structuralSharing', () => { - it('should restrict to same types', () => { + it('should be able to use structuralSharing with unknown types', () => { + // https://github.com/TanStack/query/issues/6525#issuecomment-1938411343 useQuery({ queryKey: ['key'], queryFn: () => 5, - structuralSharing: (_oldData, newData) => { + structuralSharing: (oldData, newData) => { + expectTypeOf(oldData).toBeUnknown() + expectTypeOf(newData).toBeUnknown() return newData }, })