From c73ce647a8b274a4897e3e628f6d3270d4232f21 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 25 Oct 2025 02:00:25 +0000 Subject: [PATCH 1/3] Initial plan From efe26bbf7fd82e0f8545df7cca2f516862cca9ca Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 25 Oct 2025 02:14:12 +0000 Subject: [PATCH 2/3] Add queryHash to QueryFunctionContext implementation and update tests Co-authored-by: ElliotChong-MS <77078627+ElliotChong-MS@users.noreply.github.com> --- .../src/__tests__/infiniteQueryBehavior.test.tsx | 10 ++++++++++ .../query-core/src/__tests__/queryClient.test-d.tsx | 1 + packages/query-core/src/infiniteQueryBehavior.ts | 2 ++ packages/query-core/src/query.ts | 1 + 4 files changed, 14 insertions(+) diff --git a/packages/query-core/src/__tests__/infiniteQueryBehavior.test.tsx b/packages/query-core/src/__tests__/infiniteQueryBehavior.test.tsx index db96ea17da6..f606fb48b38 100644 --- a/packages/query-core/src/__tests__/infiniteQueryBehavior.test.tsx +++ b/packages/query-core/src/__tests__/infiniteQueryBehavior.test.tsx @@ -1,6 +1,7 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import { queryKey, sleep } from '@tanstack/query-test-utils' import { CancelledError, InfiniteQueryObserver, QueryClient } from '..' +import { hashQueryKeyByOptions } from '../utils' import type { InfiniteData, InfiniteQueryObserverResult, QueryCache } from '..' describe('InfiniteQueryBehavior', () => { @@ -82,6 +83,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(1, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: 1, meta: undefined, @@ -96,6 +98,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(1, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: 2, direction: 'forward', @@ -115,6 +118,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(1, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: 0, direction: 'backward', @@ -135,6 +139,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(1, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: -1, meta: undefined, @@ -154,6 +159,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(1, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: 1, meta: undefined, @@ -176,6 +182,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(1, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: 0, meta: undefined, @@ -185,6 +192,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(2, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: 1, meta: undefined, @@ -237,6 +245,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(1, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: 1, meta: undefined, @@ -293,6 +302,7 @@ describe('InfiniteQueryBehavior', () => { expect(queryFnSpy).toHaveBeenNthCalledWith(1, { queryKey: key, + queryHash: hashQueryKeyByOptions(key), client: queryClient, pageParam: 2, meta: undefined, diff --git a/packages/query-core/src/__tests__/queryClient.test-d.tsx b/packages/query-core/src/__tests__/queryClient.test-d.tsx index 8a3be1a9e23..57ffd7304d1 100644 --- a/packages/query-core/src/__tests__/queryClient.test-d.tsx +++ b/packages/query-core/src/__tests__/queryClient.test-d.tsx @@ -203,6 +203,7 @@ describe('defaultOptions', () => { expectTypeOf(context).toEqualTypeOf<{ client: QueryClient queryKey: QueryKey + queryHash: string meta: Record | undefined signal: AbortSignal pageParam?: unknown diff --git a/packages/query-core/src/infiniteQueryBehavior.ts b/packages/query-core/src/infiniteQueryBehavior.ts index 476d90ce155..49daf0d8d90 100644 --- a/packages/query-core/src/infiniteQueryBehavior.ts +++ b/packages/query-core/src/infiniteQueryBehavior.ts @@ -61,6 +61,7 @@ export function infiniteQueryBehavior( > = { client: context.client, queryKey: context.queryKey, + queryHash: query.queryHash, pageParam: param, direction: previous ? 'backward' : 'forward', meta: context.options.meta, @@ -119,6 +120,7 @@ export function infiniteQueryBehavior( { client: context.client, queryKey: context.queryKey, + queryHash: query.queryHash, meta: context.options.meta, signal: context.signal, }, diff --git a/packages/query-core/src/query.ts b/packages/query-core/src/query.ts index a34c8630dc8..f4208f4f5b6 100644 --- a/packages/query-core/src/query.ts +++ b/packages/query-core/src/query.ts @@ -455,6 +455,7 @@ export class Query< > = { client: this.#client, queryKey: this.queryKey, + queryHash: this.queryHash, meta: this.meta, } addSignalProperty(queryFnContext) From e45e9943b56e83d55322b6c18f5c1173d734394c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 25 Oct 2025 02:17:36 +0000 Subject: [PATCH 3/3] Add queryHash to QueryFunctionContext documentation and test Co-authored-by: ElliotChong-MS <77078627+ElliotChong-MS@users.noreply.github.com> --- docs/framework/react/guides/query-functions.md | 1 + packages/query-core/src/__tests__/query.test.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/framework/react/guides/query-functions.md b/docs/framework/react/guides/query-functions.md index 7cd0aa72096..fb14aef3125 100644 --- a/docs/framework/react/guides/query-functions.md +++ b/docs/framework/react/guides/query-functions.md @@ -100,6 +100,7 @@ function fetchTodoList({ queryKey }) { The `QueryFunctionContext` is the object passed to each query function. It consists of: - `queryKey: QueryKey`: [Query Keys](../query-keys.md) +- `queryHash: string`: The hash of the query key, used as a unique identifier for the query - `client: QueryClient`: [QueryClient](../../../../reference/QueryClient.md) - `signal?: AbortSignal` - [AbortSignal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) instance provided by TanStack Query diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index f11bf173d37..524af851e4c 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -254,6 +254,7 @@ describe('query', () => { expect(args).toBeDefined() expect(args.pageParam).toBeUndefined() expect(args.queryKey).toEqual(key) + expect(args.queryHash).toBe(hashQueryKeyByOptions(key)) expect(args.signal).toBeInstanceOf(AbortSignal) expect(args.client).toEqual(queryClient) })