diff --git a/eslint.config.js b/eslint.config.js index d8a5458377..f156cd2e9c 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 84b0029c8e..a86775ff27 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 a49ca421cf..406789dc42 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 0aea5556a8..97f4b0d946 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 0d49180b4a..18cd986adf 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 cb04452c99..b6464bd8c9 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 df75435c7e..7ccaf50177 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 df75435c7e..7ccaf50177 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 c3c009f41e..c48269cff1 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 df75435c7e..7ccaf50177 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 03a0222b7f..6d7485a6d7 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 df75435c7e..7ccaf50177 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 df75435c7e..7ccaf50177 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 ec7943f019..9133d59894 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 3554c211ee..45811bb8a1 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 ec7943f019..9133d59894 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 aadb420b90..60faf155e0 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 c7feaf3c86..5aa37fc376 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 df75435c7e..7ccaf50177 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 df75435c7e..7ccaf50177 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 df75435c7e..7ccaf50177 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 f31c5e878b..b40d00982a 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 f31c5e878b..b40d00982a 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 f31c5e878b..b40d00982a 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 6cd1d47ba7..0810a2d674 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 6cd1d47ba7..0810a2d674 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 3185a88957..84437f8fc1 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 }, })