From f35335ce4545d73785da126fb955252908bda65d Mon Sep 17 00:00:00 2001 From: Will Drach Date: Thu, 9 Oct 2025 19:25:11 -0600 Subject: [PATCH 1/7] fix isFetchedAfterMount --- .../query-core/src/__tests__/query.test.tsx | 43 +++++++++++++++++++ packages/query-core/src/query.ts | 4 +- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index f11bf173d3..a33bf75cfc 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -1304,4 +1304,47 @@ describe('query', () => { data: 'data1', }) }) + + test('should not increment dataUpdateCount when setting initialData on prefetched query', async () => { + const key = queryKey() + const queryFn = vi.fn().mockImplementation(() => 'fetched-data') + + // First prefetch the query (creates query without data) + queryClient.prefetchQuery({ + queryKey: key, + queryFn, + }) + + const query = queryCache.find({ queryKey: key })! + expect(query.state.data).toBeUndefined() + expect(query.state.dataUpdateCount).toBe(0) + + // Now create an observer with initialData + const observer = new QueryObserver(queryClient, { + queryKey: key, + queryFn, + initialData: 'initial-data', + }) + + // The query should now have the initial data but dataUpdateCount should still be 0 + // since this was not fetched data but initial data + expect(query.state.data).toBe('initial-data') + expect(query.state.dataUpdateCount).toBe(0) + + // Get the initial state as captured by the observer + const result = observer.getCurrentResult() + expect(result.data).toBe('initial-data') + expect(result.isFetchedAfterMount).toBe(false) // This should be false since no actual fetch occurred + + // Now trigger a refetch through the observer to simulate real-world usage + await observer.refetch() + + // After actual fetch, dataUpdateCount should increment + expect(query.state.dataUpdateCount).toBe(1) + expect(query.state.data).toBe('fetched-data') + + // And isFetchedAfterMount should now be true + const updatedResult = observer.getCurrentResult() + expect(updatedResult.isFetchedAfterMount).toBe(true) + }) }) diff --git a/packages/query-core/src/query.ts b/packages/query-core/src/query.ts index a34c8630dc..8e85a75d38 100644 --- a/packages/query-core/src/query.ts +++ b/packages/query-core/src/query.ts @@ -636,7 +636,9 @@ export class Query< const newState = { ...state, data: action.data, - dataUpdateCount: state.dataUpdateCount + 1, + dataUpdateCount: action.manual && state.data === undefined + ? state.dataUpdateCount // Don't increment for initial data + : state.dataUpdateCount + 1, dataUpdatedAt: action.dataUpdatedAt ?? Date.now(), error: null, isInvalidated: false, From ad5d0ba5b6172ab78ebdebedfe8bfeeedd8fa9ab Mon Sep 17 00:00:00 2001 From: Will Drach Date: Thu, 9 Oct 2025 19:28:54 -0600 Subject: [PATCH 2/7] changeset --- .changeset/yummy-rooms-read.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/yummy-rooms-read.md diff --git a/.changeset/yummy-rooms-read.md b/.changeset/yummy-rooms-read.md new file mode 100644 index 0000000000..2c2648ebbe --- /dev/null +++ b/.changeset/yummy-rooms-read.md @@ -0,0 +1,5 @@ +--- +'@tanstack/react-query': patch +--- + +Fixed isFetchedAfterMount in cases where initialData is applied From 478f5d08e31ee1419a51205e3e767b5e4f102b0e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 15:48:57 +0000 Subject: [PATCH 3/7] ci: apply automated fixes --- packages/query-core/src/query.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/query-core/src/query.ts b/packages/query-core/src/query.ts index 8e85a75d38..bd188219d9 100644 --- a/packages/query-core/src/query.ts +++ b/packages/query-core/src/query.ts @@ -636,9 +636,10 @@ export class Query< const newState = { ...state, data: action.data, - dataUpdateCount: action.manual && state.data === undefined - ? state.dataUpdateCount // Don't increment for initial data - : state.dataUpdateCount + 1, + dataUpdateCount: + action.manual && state.data === undefined + ? state.dataUpdateCount // Don't increment for initial data + : state.dataUpdateCount + 1, dataUpdatedAt: action.dataUpdatedAt ?? Date.now(), error: null, isInvalidated: false, From 8c9b321b585b4242834ecc84b9e99240515b6bf8 Mon Sep 17 00:00:00 2001 From: Will Drach Date: Tue, 14 Oct 2025 23:25:52 -0600 Subject: [PATCH 4/7] call setState directly --- packages/query-core/src/query.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/query-core/src/query.ts b/packages/query-core/src/query.ts index bd188219d9..e033846601 100644 --- a/packages/query-core/src/query.ts +++ b/packages/query-core/src/query.ts @@ -210,9 +210,11 @@ export class Query< if (this.state && this.state.data === undefined) { const defaultState = getDefaultState(this.options) if (defaultState.data !== undefined) { - this.setData(defaultState.data, { - updatedAt: defaultState.dataUpdatedAt, - manual: true, + this.setState({ + data: defaultState.data, + dataUpdatedAt: defaultState.dataUpdatedAt, + status: 'success', + error: null, }) this.#initialState = defaultState } @@ -636,10 +638,7 @@ export class Query< const newState = { ...state, data: action.data, - dataUpdateCount: - action.manual && state.data === undefined - ? state.dataUpdateCount // Don't increment for initial data - : state.dataUpdateCount + 1, + dataUpdateCount: state.dataUpdateCount + 1, dataUpdatedAt: action.dataUpdatedAt ?? Date.now(), error: null, isInvalidated: false, From 5589dd3972e560f9f916cd58812baf95bfe0e09d Mon Sep 17 00:00:00 2001 From: Will Drach Date: Tue, 14 Oct 2025 23:28:46 -0600 Subject: [PATCH 5/7] changeset update --- .changeset/eight-webs-buy.md | 18 ++++++++++++++++++ .changeset/yummy-rooms-read.md | 5 ----- 2 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 .changeset/eight-webs-buy.md delete mode 100644 .changeset/yummy-rooms-read.md diff --git a/.changeset/eight-webs-buy.md b/.changeset/eight-webs-buy.md new file mode 100644 index 0000000000..a49c41b912 --- /dev/null +++ b/.changeset/eight-webs-buy.md @@ -0,0 +1,18 @@ +--- +'@tanstack/query-broadcast-client-experimental': patch +'@tanstack/query-async-storage-persister': patch +'@tanstack/angular-query-persist-client': patch +'@tanstack/query-sync-storage-persister': patch +'@tanstack/svelte-query-persist-client': patch +'@tanstack/angular-query-experimental': patch +'@tanstack/react-query-persist-client': patch +'@tanstack/solid-query-persist-client': patch +'@tanstack/query-persist-client-core': patch +'@tanstack/svelte-query': patch +'@tanstack/react-query': patch +'@tanstack/solid-query': patch +'@tanstack/query-core': patch +'@tanstack/vue-query': patch +--- + +Fixed isFetchedAfterMount in cases where initialData is applied diff --git a/.changeset/yummy-rooms-read.md b/.changeset/yummy-rooms-read.md deleted file mode 100644 index 2c2648ebbe..0000000000 --- a/.changeset/yummy-rooms-read.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@tanstack/react-query': patch ---- - -Fixed isFetchedAfterMount in cases where initialData is applied From 2d55801a8692a9d93b3d54cb20c52f9a7ca4b56f Mon Sep 17 00:00:00 2001 From: Will Drach Date: Thu, 16 Oct 2025 23:42:12 -0600 Subject: [PATCH 6/7] successState --- .changeset/eight-webs-buy.md | 13 ------------- packages/query-core/src/query.ts | 28 +++++++++++++++++++--------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/.changeset/eight-webs-buy.md b/.changeset/eight-webs-buy.md index a49c41b912..d5c3d84ea8 100644 --- a/.changeset/eight-webs-buy.md +++ b/.changeset/eight-webs-buy.md @@ -1,18 +1,5 @@ --- -'@tanstack/query-broadcast-client-experimental': patch -'@tanstack/query-async-storage-persister': patch -'@tanstack/angular-query-persist-client': patch -'@tanstack/query-sync-storage-persister': patch -'@tanstack/svelte-query-persist-client': patch -'@tanstack/angular-query-experimental': patch -'@tanstack/react-query-persist-client': patch -'@tanstack/solid-query-persist-client': patch -'@tanstack/query-persist-client-core': patch -'@tanstack/svelte-query': patch -'@tanstack/react-query': patch -'@tanstack/solid-query': patch '@tanstack/query-core': patch -'@tanstack/vue-query': patch --- Fixed isFetchedAfterMount in cases where initialData is applied diff --git a/packages/query-core/src/query.ts b/packages/query-core/src/query.ts index e033846601..4966e6e6df 100644 --- a/packages/query-core/src/query.ts +++ b/packages/query-core/src/query.ts @@ -211,10 +211,10 @@ export class Query< const defaultState = getDefaultState(this.options) if (defaultState.data !== undefined) { this.setState({ - data: defaultState.data, - dataUpdatedAt: defaultState.dataUpdatedAt, - status: 'success', - error: null, + ...successState(defaultState.data, defaultState.dataUpdatedAt), + fetchMeta: null, + fetchFailureReason: null, + fetchFailureCount: 0, }) this.#initialState = defaultState } @@ -637,16 +637,13 @@ export class Query< case 'success': const newState = { ...state, - data: action.data, + ...successState(action.data, action.dataUpdatedAt), dataUpdateCount: state.dataUpdateCount + 1, - dataUpdatedAt: action.dataUpdatedAt ?? Date.now(), - error: null, - isInvalidated: false, - status: 'success' as const, ...(!action.manual && { fetchStatus: 'idle' as const, fetchFailureCount: 0, fetchFailureReason: null, + fetchMeta: null, }), } // If fetching ends successfully, we don't need revertState as a fallback anymore. @@ -712,6 +709,19 @@ export function fetchState< } as const } +function successState( + data: TData | undefined, + dataUpdatedAt?: number, +) { + return { + data, + dataUpdatedAt: dataUpdatedAt ?? Date.now(), + error: null, + isInvalidated: false, + status: 'success' as const, + } +} + function getDefaultState< TQueryFnData, TError, From 426c02c912e4eb3fdf1c82279115b94f612d8da5 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 17 Oct 2025 07:36:02 +0000 Subject: [PATCH 7/7] ci: apply automated fixes --- packages/query-core/src/query.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/query-core/src/query.ts b/packages/query-core/src/query.ts index 4966e6e6df..ad99d78d2d 100644 --- a/packages/query-core/src/query.ts +++ b/packages/query-core/src/query.ts @@ -709,10 +709,7 @@ export function fetchState< } as const } -function successState( - data: TData | undefined, - dataUpdatedAt?: number, -) { +function successState(data: TData | undefined, dataUpdatedAt?: number) { return { data, dataUpdatedAt: dataUpdatedAt ?? Date.now(),