From f35335ce4545d73785da126fb955252908bda65d Mon Sep 17 00:00:00 2001 From: Will Drach Date: Thu, 9 Oct 2025 19:25:11 -0600 Subject: [PATCH 1/3] 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/3] 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/3] 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,