diff --git a/docs/framework/react/plugins/persistQueryClient.md b/docs/framework/react/plugins/persistQueryClient.md index 027f685a4b3..3b6881fe06d 100644 --- a/docs/framework/react/plugins/persistQueryClient.md +++ b/docs/framework/react/plugins/persistQueryClient.md @@ -219,6 +219,10 @@ ReactDOM.createRoot(rootElement).render( - will be called when the initial restore is finished - can be used to [resumePausedMutations](../../../reference/QueryClient.md#queryclientresumepausedmutations) - if a Promise is returned, it will be awaited; restoring is seen as ongoing until then +- `onError?: () => Promise | unknown` + - optional + - will be called when an error is thrown during restoration + - if a Promise is returned, it will be awaited ### useIsRestoring diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index bab41f2cbc4..19b8db59cc4 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -9,10 +9,10 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/query-sync-storage-persister": "^5.72.2", + "@tanstack/query-sync-storage-persister": "^5.73.1", "@tanstack/react-query": "^5.72.2", "@tanstack/react-query-devtools": "^5.72.2", - "@tanstack/react-query-persist-client": "^5.72.2", + "@tanstack/react-query-persist-client": "^5.73.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/eslint-legacy/package.json b/examples/react/eslint-legacy/package.json index 9ce1011eafa..dad319948c1 100644 --- a/examples/react/eslint-legacy/package.json +++ b/examples/react/eslint-legacy/package.json @@ -9,10 +9,10 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/query-sync-storage-persister": "^5.72.2", + "@tanstack/query-sync-storage-persister": "^5.73.1", "@tanstack/react-query": "^5.72.2", "@tanstack/react-query-devtools": "^5.72.2", - "@tanstack/react-query-persist-client": "^5.72.2", + "@tanstack/react-query-persist-client": "^5.73.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/offline/package.json b/examples/react/offline/package.json index f9376a2e1ce..bc20d001520 100644 --- a/examples/react/offline/package.json +++ b/examples/react/offline/package.json @@ -8,11 +8,11 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-sync-storage-persister": "^5.72.2", + "@tanstack/query-sync-storage-persister": "^5.73.1", "@tanstack/react-location": "^3.7.4", "@tanstack/react-query": "^5.72.2", "@tanstack/react-query-devtools": "^5.72.2", - "@tanstack/react-query-persist-client": "^5.72.2", + "@tanstack/react-query-persist-client": "^5.73.1", "msw": "^2.6.6", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/svelte/basic/package.json b/examples/svelte/basic/package.json index f012cad2aea..0a444f7121d 100644 --- a/examples/svelte/basic/package.json +++ b/examples/svelte/basic/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-sync-storage-persister": "^5.72.2", + "@tanstack/query-sync-storage-persister": "^5.73.1", "@tanstack/svelte-query": "^5.72.2", "@tanstack/svelte-query-devtools": "^5.72.2", - "@tanstack/svelte-query-persist-client": "^5.72.2" + "@tanstack/svelte-query-persist-client": "^5.73.1" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.3.1", diff --git a/examples/vue/2.6-basic/package.json b/examples/vue/2.6-basic/package.json index a8d77e5fe69..9c0d594ea21 100644 --- a/examples/vue/2.6-basic/package.json +++ b/examples/vue/2.6-basic/package.json @@ -8,7 +8,7 @@ "_preview": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.72.2", + "@tanstack/vue-query": "^5.73.0", "@vue/composition-api": "1.7.2", "vue": "2.6.14", "vue-template-compiler": "2.6.14" diff --git a/examples/vue/2.7-basic/package.json b/examples/vue/2.7-basic/package.json index f0f3483c395..a70aba0e519 100644 --- a/examples/vue/2.7-basic/package.json +++ b/examples/vue/2.7-basic/package.json @@ -8,7 +8,7 @@ "_serve": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.72.2", + "@tanstack/vue-query": "^5.73.0", "vue": "2.7.16", "vue-template-compiler": "2.7.16" }, diff --git a/examples/vue/basic/package.json b/examples/vue/basic/package.json index 001119111ab..8c6bbd5e04d 100644 --- a/examples/vue/basic/package.json +++ b/examples/vue/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.72.2", - "@tanstack/vue-query-devtools": "^5.72.2", + "@tanstack/vue-query": "^5.73.0", + "@tanstack/vue-query-devtools": "^5.73.0", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/dependent-queries/package.json b/examples/vue/dependent-queries/package.json index f8cdeffc49e..83b4b78a825 100644 --- a/examples/vue/dependent-queries/package.json +++ b/examples/vue/dependent-queries/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.72.2", + "@tanstack/vue-query": "^5.73.0", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/nuxt3/package.json b/examples/vue/nuxt3/package.json index 74433627066..d501840cd38 100644 --- a/examples/vue/nuxt3/package.json +++ b/examples/vue/nuxt3/package.json @@ -7,7 +7,7 @@ "_start": "node .output/server/index.mjs" }, "dependencies": { - "@tanstack/vue-query": "^5.72.2" + "@tanstack/vue-query": "^5.73.0" }, "devDependencies": { "nuxt": "^3.12.4" diff --git a/examples/vue/persister/package.json b/examples/vue/persister/package.json index 1099072548f..658f0ba3966 100644 --- a/examples/vue/persister/package.json +++ b/examples/vue/persister/package.json @@ -9,9 +9,9 @@ }, "dependencies": { "@tanstack/query-core": "^5.72.2", - "@tanstack/query-persist-client-core": "^5.72.2", - "@tanstack/query-sync-storage-persister": "^5.72.2", - "@tanstack/vue-query": "^5.72.2", + "@tanstack/query-persist-client-core": "^5.73.1", + "@tanstack/query-sync-storage-persister": "^5.73.1", + "@tanstack/vue-query": "^5.73.0", "idb-keyval": "^6.2.1", "vue": "^3.4.27" }, diff --git a/examples/vue/simple/package.json b/examples/vue/simple/package.json index c3a011e5965..435aebda81b 100644 --- a/examples/vue/simple/package.json +++ b/examples/vue/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-query": "^5.72.2", - "@tanstack/vue-query-devtools": "^5.72.2", + "@tanstack/vue-query": "^5.73.0", + "@tanstack/vue-query-devtools": "^5.73.0", "vue": "^3.4.27" }, "devDependencies": { diff --git a/packages/query-async-storage-persister/package.json b/packages/query-async-storage-persister/package.json index f0fa304f4c9..7bcf46675d3 100644 --- a/packages/query-async-storage-persister/package.json +++ b/packages/query-async-storage-persister/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-async-storage-persister", - "version": "5.72.2", + "version": "5.73.1", "description": "A persister for asynchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-persist-client-core/package.json b/packages/query-persist-client-core/package.json index 9ae567c0509..ffa55d7452a 100644 --- a/packages/query-persist-client-core/package.json +++ b/packages/query-persist-client-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-persist-client-core", - "version": "5.72.2", + "version": "5.73.1", "description": "Set of utilities for interacting with persisters, which can save your queryClient for later use", "author": "tannerlinsley", "license": "MIT", 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 8d260f6ab15..07cce75f091 100644 --- a/packages/query-persist-client-core/src/__tests__/persist.test.ts +++ b/packages/query-persist-client-core/src/__tests__/persist.test.ts @@ -1,6 +1,9 @@ import { describe, expect, test, vi } from 'vitest' import { QueriesObserver } from '@tanstack/query-core' -import { persistQueryClientSubscribe } from '../persist' +import { + persistQueryClientRestore, + persistQueryClientSubscribe, +} from '../persist' import { createMockPersister, createQueryClient, @@ -63,3 +66,97 @@ describe('persistQueryClientSave', () => { unsubscribe() }) }) + +describe('persistQueryClientRestore', () => { + test('should rethrow exceptions in `restoreClient`', async () => { + const consoleMock = vi + .spyOn(console, 'error') + .mockImplementation(() => undefined) + + const consoleWarn = vi + .spyOn(console, 'warn') + .mockImplementation(() => undefined) + + const queryClient = createQueryClient() + + const restoreError = new Error('Error restoring client') + + const persister = createSpyPersister() + + persister.restoreClient = () => Promise.reject(restoreError) + + await expect( + persistQueryClientRestore({ + queryClient, + persister, + }), + ).rejects.toBe(restoreError) + + expect(consoleMock).toHaveBeenCalledTimes(1) + expect(consoleWarn).toHaveBeenCalledTimes(1) + expect(consoleMock).toHaveBeenNthCalledWith(1, restoreError) + + consoleMock.mockRestore() + consoleWarn.mockRestore() + }) + + test('should rethrow exceptions in `removeClient` before `restoreClient`', async () => { + const consoleMock = vi + .spyOn(console, 'error') + .mockImplementation(() => undefined) + + const consoleWarn = vi + .spyOn(console, 'warn') + .mockImplementation(() => undefined) + + const queryClient = createQueryClient() + + const restoreError = new Error('Error restoring client') + const removeError = new Error('Error removing client') + + const persister = createSpyPersister() + + persister.restoreClient = () => Promise.reject(restoreError) + persister.removeClient = () => Promise.reject(removeError) + + await expect( + persistQueryClientRestore({ + queryClient, + persister, + }), + ).rejects.toBe(removeError) + + expect(consoleMock).toHaveBeenCalledTimes(1) + expect(consoleWarn).toHaveBeenCalledTimes(1) + expect(consoleMock).toHaveBeenNthCalledWith(1, restoreError) + + consoleMock.mockRestore() + consoleWarn.mockRestore() + }) + + test('should rethrow error in `removeClient`', async () => { + const queryClient = createQueryClient() + + const persister = createSpyPersister() + const removeError = new Error('Error removing client') + + persister.removeClient = () => Promise.reject(removeError) + persister.restoreClient = () => { + return Promise.resolve({ + buster: 'random-buster', + clientState: { + mutations: [], + queries: [], + }, + timestamp: new Date().getTime(), + }) + } + + await expect( + persistQueryClientRestore({ + queryClient, + persister, + }), + ).rejects.toBe(removeError) + }) +}) diff --git a/packages/query-persist-client-core/src/persist.ts b/packages/query-persist-client-core/src/persist.ts index 5582c1fa018..e138e1d57fb 100644 --- a/packages/query-persist-client-core/src/persist.ts +++ b/packages/query-persist-client-core/src/persist.ts @@ -84,12 +84,12 @@ export async function persistQueryClientRestore({ const expired = Date.now() - persistedClient.timestamp > maxAge const busted = persistedClient.buster !== buster if (expired || busted) { - persister.removeClient() + return persister.removeClient() } else { hydrate(queryClient, persistedClient.clientState, hydrateOptions) } } else { - persister.removeClient() + return persister.removeClient() } } } catch (err) { @@ -99,7 +99,10 @@ export async function persistQueryClientRestore({ 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.', ) } - persister.removeClient() + + await persister.removeClient() + + throw err } } diff --git a/packages/query-sync-storage-persister/package.json b/packages/query-sync-storage-persister/package.json index 07b99858efc..8951a66e0b7 100644 --- a/packages/query-sync-storage-persister/package.json +++ b/packages/query-sync-storage-persister/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-sync-storage-persister", - "version": "5.72.2", + "version": "5.73.1", "description": "A persister for synchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-persist-client/package.json b/packages/react-query-persist-client/package.json index caa528fbc28..244ba226db4 100644 --- a/packages/react-query-persist-client/package.json +++ b/packages/react-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-persist-client", - "version": "5.72.2", + "version": "5.73.1", "description": "React bindings to work with persisters in TanStack/react-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-persist-client/src/PersistQueryClientProvider.tsx b/packages/react-query-persist-client/src/PersistQueryClientProvider.tsx index d8b86b80dfa..b12dba8810a 100644 --- a/packages/react-query-persist-client/src/PersistQueryClientProvider.tsx +++ b/packages/react-query-persist-client/src/PersistQueryClientProvider.tsx @@ -12,20 +12,22 @@ import type { OmitKeyof, QueryClientProviderProps } from '@tanstack/react-query' export type PersistQueryClientProviderProps = QueryClientProviderProps & { persistOptions: OmitKeyof onSuccess?: () => Promise | unknown + onError?: () => Promise | unknown } export const PersistQueryClientProvider = ({ children, persistOptions, onSuccess, + onError, ...props }: PersistQueryClientProviderProps): React.JSX.Element => { const [isRestoring, setIsRestoring] = React.useState(true) - const refs = React.useRef({ persistOptions, onSuccess }) + const refs = React.useRef({ persistOptions, onSuccess, onError }) const didRestore = React.useRef(false) React.useEffect(() => { - refs.current = { persistOptions, onSuccess } + refs.current = { persistOptions, onSuccess, onError } }) React.useEffect(() => { @@ -35,13 +37,12 @@ export const PersistQueryClientProvider = ({ } if (!didRestore.current) { didRestore.current = true - persistQueryClientRestore(options).then(async () => { - try { - await refs.current.onSuccess?.() - } finally { + persistQueryClientRestore(options) + .then(() => refs.current.onSuccess?.()) + .catch(() => refs.current.onError?.()) + .finally(() => { setIsRestoring(false) - } - }) + }) } return isRestoring ? undefined : persistQueryClientSubscribe(options) }, [props.client, isRestoring]) 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 6192ce43304..ece78d4b23e 100644 --- a/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx +++ b/packages/react-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -539,6 +539,8 @@ describe('PersistQueryClientProvider', () => { const queryClient = createQueryClient() const removeClient = vi.fn() + const onSuccess = vi.fn() + const onError = vi.fn() const [error, persister] = createMockErrorPersister(removeClient) @@ -563,6 +565,8 @@ describe('PersistQueryClientProvider', () => { , @@ -570,6 +574,9 @@ describe('PersistQueryClientProvider', () => { await waitFor(() => rendered.getByText('fetched')) expect(removeClient).toHaveBeenCalledTimes(1) + expect(onSuccess).toHaveBeenCalledTimes(0) + expect(onError).toHaveBeenCalledTimes(1) + expect(consoleMock).toHaveBeenCalledTimes(1) expect(consoleMock).toHaveBeenNthCalledWith(1, error) consoleMock.mockRestore() diff --git a/packages/solid-query-persist-client/package.json b/packages/solid-query-persist-client/package.json index b5f2b48b6d8..62e1adf3609 100644 --- a/packages/solid-query-persist-client/package.json +++ b/packages/solid-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query-persist-client", - "version": "5.72.2", + "version": "5.73.1", "description": "Solid.js bindings to work with persisters in TanStack/solid-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-persist-client/src/PersistQueryClientProvider.tsx b/packages/solid-query-persist-client/src/PersistQueryClientProvider.tsx index e6092a582c6..8d7f023caea 100644 --- a/packages/solid-query-persist-client/src/PersistQueryClientProvider.tsx +++ b/packages/solid-query-persist-client/src/PersistQueryClientProvider.tsx @@ -11,6 +11,7 @@ import type { JSX } from 'solid-js' export type PersistQueryClientProviderProps = QueryClientProviderProps & { persistOptions: OmitKeyof onSuccess?: () => void + onError?: () => void } export const PersistQueryClientProvider = ( @@ -25,13 +26,12 @@ export const PersistQueryClientProvider = ( createEffect(() => { setIsRestoring(true) - persistQueryClientRestore(options()).then(async () => { - try { - await props.onSuccess?.() - } finally { + persistQueryClientRestore(options()) + .then(() => props.onSuccess?.()) + .catch(() => props.onError?.()) + .finally(() => { setIsRestoring(false) - } - }) + }) }) createEffect(() => { diff --git a/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx b/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx index de0970819a6..0274e4db3c6 100644 --- a/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx +++ b/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -428,6 +428,8 @@ describe('PersistQueryClientProvider', () => { .mockImplementation(() => undefined) const queryClient = createQueryClient() const removeClient = vi.fn() + const onSuccess = vi.fn() + const onError = vi.fn() const [error, persister] = createMockErrorPersister(removeClient) @@ -452,6 +454,8 @@ describe('PersistQueryClientProvider', () => { @@ -459,6 +463,9 @@ describe('PersistQueryClientProvider', () => { await waitFor(() => screen.getByText('fetched')) expect(removeClient).toHaveBeenCalledTimes(1) + expect(onSuccess).toHaveBeenCalledTimes(0) + expect(onError).toHaveBeenCalledTimes(1) + expect(onErrorMock).toHaveBeenCalledTimes(1) expect(onErrorMock).toHaveBeenNthCalledWith(1, error) onErrorMock.mockRestore() diff --git a/packages/svelte-query-persist-client/package.json b/packages/svelte-query-persist-client/package.json index d168130bd50..e127b6abb34 100644 --- a/packages/svelte-query-persist-client/package.json +++ b/packages/svelte-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query-persist-client", - "version": "5.72.2", + "version": "5.73.1", "description": "Svelte bindings to work with persisters in TanStack/svelte-query", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query-persist-client/src/PersistQueryClientProvider.svelte b/packages/svelte-query-persist-client/src/PersistQueryClientProvider.svelte index 5f5e04ada71..b0ba375b045 100644 --- a/packages/svelte-query-persist-client/src/PersistQueryClientProvider.svelte +++ b/packages/svelte-query-persist-client/src/PersistQueryClientProvider.svelte @@ -11,6 +11,7 @@ export let client: QueryClient export let onSuccess: () => Promise | unknown = () => undefined + export let onError: () => Promise | unknown = () => undefined export let persistOptions: OmitKeyof const isRestoring = writable(true) @@ -22,15 +23,22 @@ ...persistOptions, queryClient: client, }) - promise.then(async () => { - if (!isStale) { - try { + promise + .then(async () => { + if (!isStale) { await onSuccess() - } finally { + } + }) + .catch(async () => { + if (!isStale) { + await onError() + } + }) + .finally(() => { + if (!isStale) { isRestoring.set(false) } - } - }) + }) onDestroy(() => { isStale = true unsubscribe() diff --git a/packages/svelte-query-persist-client/tests/PersistQueryClientProvider.test.ts b/packages/svelte-query-persist-client/tests/PersistQueryClientProvider.test.ts index f9d6e7a66b3..98f449d93e9 100644 --- a/packages/svelte-query-persist-client/tests/PersistQueryClientProvider.test.ts +++ b/packages/svelte-query-persist-client/tests/PersistQueryClientProvider.test.ts @@ -366,15 +366,19 @@ describe('PersistQueryClientProvider', () => { const queryClient = createQueryClient() const removeClient = vi.fn() + const onSuccess = vi.fn() + const onError = vi.fn() const [error, persister] = createMockErrorPersister(removeClient) const rendered = render(RemoveCache, { - props: { queryClient, persistOptions: { persister } }, + props: { queryClient, persistOptions: { persister }, onError, onSuccess }, }) await waitFor(() => rendered.getByText('fetched')) expect(removeClient).toHaveBeenCalledTimes(1) + expect(onSuccess).toHaveBeenCalledTimes(0) + expect(onError).toHaveBeenCalledTimes(1) expect(consoleMock).toHaveBeenCalledTimes(1) expect(consoleMock).toHaveBeenNthCalledWith(1, error) consoleMock.mockRestore() diff --git a/packages/svelte-query-persist-client/tests/RemoveCache/Provider.svelte b/packages/svelte-query-persist-client/tests/RemoveCache/Provider.svelte index 8738e99bd55..7edd6cc903d 100644 --- a/packages/svelte-query-persist-client/tests/RemoveCache/Provider.svelte +++ b/packages/svelte-query-persist-client/tests/RemoveCache/Provider.svelte @@ -6,8 +6,15 @@ export let queryClient: QueryClient export let persistOptions: OmitKeyof + export let onSuccess: () => void + export let onError: () => void - + diff --git a/packages/vue-query-devtools/package.json b/packages/vue-query-devtools/package.json index 00d0a3e2a9a..df9886ef2f3 100644 --- a/packages/vue-query-devtools/package.json +++ b/packages/vue-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-query-devtools", - "version": "5.72.2", + "version": "5.73.0", "description": "Developer tools to interact with and visualize the TanStack/vue-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/vue-query/package.json b/packages/vue-query/package.json index 6ae50f4bf05..0cbee5bc745 100644 --- a/packages/vue-query/package.json +++ b/packages/vue-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-query", - "version": "5.72.2", + "version": "5.73.0", "description": "Hooks for managing, caching and syncing asynchronous and remote data in Vue", "author": "Damian Osipiuk", "license": "MIT", diff --git a/packages/vue-query/src/__tests__/useInfiniteQuery.test-d.tsx b/packages/vue-query/src/__tests__/useInfiniteQuery.test-d.tsx index a7871c1ea59..3ca41df8acb 100644 --- a/packages/vue-query/src/__tests__/useInfiniteQuery.test-d.tsx +++ b/packages/vue-query/src/__tests__/useInfiniteQuery.test-d.tsx @@ -1,5 +1,5 @@ import { describe, expectTypeOf, it } from 'vitest' -import { reactive } from 'vue-demi' +import { computed, reactive } from 'vue-demi' import { useInfiniteQuery } from '../useInfiniteQuery' import { simpleFetcher } from './test-utils' import type { InfiniteData } from '@tanstack/query-core' @@ -81,4 +81,18 @@ describe('Discriminated union return type', () => { expectTypeOf(query.error).toEqualTypeOf() } }) + + it('should accept computed options', () => { + const options = computed(() => ({ + queryKey: ['infiniteQuery'], + queryFn: simpleFetcher, + getNextPageParam: () => undefined, + initialPageParam: 0, + })) + const query = reactive(useInfiniteQuery(options)) + + if (query.isSuccess) { + expectTypeOf(query.data).toEqualTypeOf>() + } + }) }) diff --git a/packages/vue-query/src/useInfiniteQuery.ts b/packages/vue-query/src/useInfiniteQuery.ts index c4a9bcb6818..2ec30b25c8c 100644 --- a/packages/vue-query/src/useInfiniteQuery.ts +++ b/packages/vue-query/src/useInfiniteQuery.ts @@ -1,5 +1,9 @@ import { InfiniteQueryObserver } from '@tanstack/query-core' import { useBaseQuery } from './useBaseQuery' +import type { + DefinedInitialDataInfiniteOptions, + UndefinedInitialDataInfiniteOptions, +} from './infiniteQueryOptions' import type { DefaultError, InfiniteData, @@ -11,7 +15,12 @@ import type { import type { UseBaseQueryReturnType } from './useBaseQuery' -import type { DeepUnwrapRef, MaybeRefDeep, MaybeRefOrGetter } from './types' +import type { + DeepUnwrapRef, + MaybeRef, + MaybeRefDeep, + MaybeRefOrGetter, +} from './types' import type { QueryClient } from './queryClient' export type UseInfiniteQueryOptions< @@ -21,37 +30,39 @@ export type UseInfiniteQueryOptions< TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown, -> = { - [Property in keyof InfiniteQueryObserverOptions< - TQueryFnData, - TError, - TData, - TQueryData, - TQueryKey, - TPageParam - >]: Property extends 'enabled' - ? MaybeRefOrGetter< - InfiniteQueryObserverOptions< - TQueryFnData, - TError, - TData, - TQueryData, - DeepUnwrapRef - >[Property] - > - : MaybeRefDeep< - InfiniteQueryObserverOptions< - TQueryFnData, - TError, - TData, - TQueryData, - DeepUnwrapRef, - TPageParam - >[Property] - > -} & { - shallow?: boolean -} +> = MaybeRef< + { + [Property in keyof InfiniteQueryObserverOptions< + TQueryFnData, + TError, + TData, + TQueryData, + TQueryKey, + TPageParam + >]: Property extends 'enabled' + ? MaybeRefOrGetter< + InfiniteQueryObserverOptions< + TQueryFnData, + TError, + TData, + TQueryData, + DeepUnwrapRef + >[Property] + > + : MaybeRefDeep< + InfiniteQueryObserverOptions< + TQueryFnData, + TError, + TData, + TQueryData, + DeepUnwrapRef, + TPageParam + >[Property] + > + } & { + shallow?: boolean + } +> export type UseInfiniteQueryReturnType = UseBaseQueryReturnType< TData, @@ -59,6 +70,40 @@ export type UseInfiniteQueryReturnType = UseBaseQueryReturnType< InfiniteQueryObserverResult > +export function useInfiniteQuery< + TQueryFnData, + TError = DefaultError, + TData = InfiniteData, + TQueryKey extends QueryKey = QueryKey, + TPageParam = unknown, +>( + options: DefinedInitialDataInfiniteOptions< + TQueryFnData, + TError, + TData, + TQueryKey, + TPageParam + >, + queryClient?: QueryClient, +): UseInfiniteQueryReturnType + +export function useInfiniteQuery< + TQueryFnData, + TError = DefaultError, + TData = InfiniteData, + TQueryKey extends QueryKey = QueryKey, + TPageParam = unknown, +>( + options: UndefinedInitialDataInfiniteOptions< + TQueryFnData, + TError, + TData, + TQueryKey, + TPageParam + >, + queryClient?: QueryClient, +): UseInfiniteQueryReturnType + export function useInfiniteQuery< TQueryFnData, TError = DefaultError, @@ -75,10 +120,16 @@ export function useInfiniteQuery< TPageParam >, queryClient?: QueryClient, -): UseInfiniteQueryReturnType { +): UseInfiniteQueryReturnType + +export function useInfiniteQuery( + options: UseInfiniteQueryOptions, + queryClient?: QueryClient, +) { return useBaseQuery( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion InfiniteQueryObserver as typeof QueryObserver, options, queryClient, - ) as UseInfiniteQueryReturnType + ) }