From 11751a0618bfee7a0bd80427ea13a567c5bc9128 Mon Sep 17 00:00:00 2001 From: devchangjun Date: Mon, 13 Jul 2026 00:50:56 +0900 Subject: [PATCH] Protect restored custom-hash queries in devtools Exercise the full dehydrate, hydrate, and query-row rendering path for a per-query custom queryKeyHashFn. This locks the queryHash lookup behavior introduced by #10750 and covers the persistence failure reported in #6958. Constraint: The runtime lookup fix already shipped in #10750 Rejected: Reapply queryCache.get changes | current main already contains the implementation Confidence: high Scope-risk: narrow Tested: query-devtools 246 tests; ESLint; TypeScript current; Prettier Related: TanStack/query#6958 --- .../src/__tests__/Devtools.test.tsx | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/query-devtools/src/__tests__/Devtools.test.tsx b/packages/query-devtools/src/__tests__/Devtools.test.tsx index 5ed22c7181..5189ff9e9d 100644 --- a/packages/query-devtools/src/__tests__/Devtools.test.tsx +++ b/packages/query-devtools/src/__tests__/Devtools.test.tsx @@ -1,5 +1,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { QueryClient, QueryObserver, onlineManager } from '@tanstack/query-core' +import { + QueryClient, + QueryObserver, + dehydrate, + hydrate, + onlineManager, +} from '@tanstack/query-core' import { fireEvent, render } from '@solidjs/testing-library' import { createLocalStorage } from '@solid-primitives/storage' import { Devtools } from '../Devtools' @@ -235,6 +241,25 @@ describe('Devtools', () => { }) describe('query list', () => { + it('should render a hydrated query with a custom hash function', async () => { + await queryClient.fetchQuery({ + queryKey: ['posts'], + queryFn: () => [{ id: 1 }], + queryKeyHashFn: () => 'custom-posts-hash', + }) + const dehydratedState = dehydrate(queryClient) + + queryClient.clear() + queryClient = new QueryClient() + hydrate(queryClient, dehydratedState) + + const rendered = renderDevtools({ initialIsOpen: true }) + + expect( + rendered.getByLabelText(/Query key custom-posts-hash/), + ).toBeInTheDocument() + }) + it('should render a row for each query in the cache', () => { queryClient.setQueryData(['posts'], [{ id: 1 }]) queryClient.setQueryData(['users', 'me'], { id: 'u1' })