From ccc843ea44220ba4fb931fd3a0fe06f9e0f9ec74 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 16 Jun 2026 14:01:52 +0900 Subject: [PATCH 01/97] test({react,preact}-query/useQueries): move type-only tests to 'useQueries.test-d.tsx' (#10958) --- .../src/__tests__/useQueries.test-d.tsx | 956 +++++++++++++++--- .../src/__tests__/useQueries.test.tsx | 696 +------------ .../src/__tests__/useQueries.test-d.tsx | 956 +++++++++++++++--- .../src/__tests__/useQueries.test.tsx | 694 +------------ 4 files changed, 1663 insertions(+), 1639 deletions(-) diff --git a/packages/preact-query/src/__tests__/useQueries.test-d.tsx b/packages/preact-query/src/__tests__/useQueries.test-d.tsx index 85816953ae6..b52b08b05bd 100644 --- a/packages/preact-query/src/__tests__/useQueries.test-d.tsx +++ b/packages/preact-query/src/__tests__/useQueries.test-d.tsx @@ -2,171 +2,871 @@ import { queryKey } from '@tanstack/query-test-utils' import { describe, expectTypeOf, it } from 'vitest' import { skipToken } from '..' -import type { OmitKeyof } from '..' +import type { OmitKeyof, QueryFunction, QueryKey } from '..' import { queryOptions } from '../queryOptions' import type { UseQueryOptions, UseQueryResult } from '../types' import { useQueries } from '../useQueries' +import type { QueryFunctionContext } from '@tanstack/query-core' -describe('UseQueries config object overload', () => { - it('TData should always be defined when initialData is provided as an object', () => { - const query1 = { - queryKey: queryKey(), - queryFn: () => { - return { - wow: true, - } - }, - initialData: { - wow: false, - }, - } - - const query2 = { - queryKey: queryKey(), - queryFn: () => 'Query Data', - initialData: 'initial data', - } - - const query3 = { - queryKey: queryKey(), - queryFn: () => 'Query Data', - } - - const queryResults = useQueries({ queries: [query1, query2, query3] }) - - const query1Data = queryResults[0].data - const query2Data = queryResults[1].data - const query3Data = queryResults[2].data - - expectTypeOf(query1Data).toEqualTypeOf<{ wow: boolean }>() - expectTypeOf(query2Data).toEqualTypeOf() - expectTypeOf(query3Data).toEqualTypeOf() - }) +describe('useQueries', () => { + describe('config object overload', () => { + it('TData should always be defined when initialData is provided as an object', () => { + const query1 = { + queryKey: queryKey(), + queryFn: () => { + return { + wow: true, + } + }, + initialData: { + wow: false, + }, + } + + const query2 = { + queryKey: queryKey(), + queryFn: () => 'Query Data', + initialData: 'initial data', + } - it('TData should be defined when passed through queryOptions', () => { - const options = queryOptions({ - queryKey: queryKey(), - queryFn: () => { - return { + const query3 = { + queryKey: queryKey(), + queryFn: () => 'Query Data', + } + + const queryResults = useQueries({ queries: [query1, query2, query3] }) + + const query1Data = queryResults[0].data + const query2Data = queryResults[1].data + const query3Data = queryResults[2].data + + expectTypeOf(query1Data).toEqualTypeOf<{ wow: boolean }>() + expectTypeOf(query2Data).toEqualTypeOf() + expectTypeOf(query3Data).toEqualTypeOf() + }) + + it('TData should be defined when passed through queryOptions', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => { + return { + wow: true, + } + }, + initialData: { wow: true, - } - }, - initialData: { - wow: true, - }, + }, + }) + const queryResults = useQueries({ queries: [options] }) + + const data = queryResults[0].data + + expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>() }) - const queryResults = useQueries({ queries: [options] }) - const data = queryResults[0].data + it('should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQueries', () => { + const query1 = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => data > 1, + }) - expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>() - }) + const query2 = { + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data: number) => data > 1, + } - it('should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQueries', () => { - const query1 = queryOptions({ - queryKey: queryKey(), - queryFn: () => Promise.resolve(1), - select: (data) => data > 1, + const queryResults = useQueries({ queries: [query1, query2] }) + const query1Data = queryResults[0].data + const query2Data = queryResults[1].data + + expectTypeOf(query1Data).toEqualTypeOf() + expectTypeOf(query2Data).toEqualTypeOf() }) - const query2 = { - queryKey: queryKey(), - queryFn: () => Promise.resolve(1), - select: (data: number) => data > 1, - } + it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => { + const queryResults = useQueries({ + queries: [ + { + queryKey: queryKey(), + queryFn: () => { + return { + wow: true, + } + }, + initialData: () => undefined as { wow: boolean } | undefined, + }, + ], + }) - const queryResults = useQueries({ queries: [query1, query2] }) - const query1Data = queryResults[0].data - const query2Data = queryResults[1].data + const data = queryResults[0].data - expectTypeOf(query1Data).toEqualTypeOf() - expectTypeOf(query2Data).toEqualTypeOf() - }) + expectTypeOf(data).toEqualTypeOf<{ wow: boolean } | undefined>() + }) + + describe('custom hook', () => { + it('should allow custom hooks using UseQueryOptions', () => { + type Data = string + + const useCustomQueries = ( + options?: OmitKeyof, 'queryKey' | 'queryFn'>, + ) => { + return useQueries({ + queries: [ + { + ...options, + queryKey: queryKey(), + queryFn: () => Promise.resolve('data'), + }, + ], + }) + } - it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => { - const queryResults = useQueries({ - queries: [ - { - queryKey: queryKey(), - queryFn: () => { - return { - wow: true, - } + const queryResults = useCustomQueries() + const data = queryResults[0].data + + expectTypeOf(data).toEqualTypeOf() + }) + }) + + it('TData should have correct type when conditional skipToken is passed', () => { + const queryResults = useQueries({ + queries: [ + { + queryKey: queryKey(), + queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5), }, - initialData: () => undefined as { wow: boolean } | undefined, - }, - ], + ], + }) + + const firstResult = queryResults[0] + + expectTypeOf(firstResult).toEqualTypeOf>() + expectTypeOf(firstResult.data).toEqualTypeOf() }) - const data = queryResults[0].data + it('should return correct data for dynamic queries with mixed result types', () => { + const Queries1 = { + get: () => + queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }), + } + const Queries2 = { + get: () => + queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(true), + }), + } - expectTypeOf(data).toEqualTypeOf<{ wow: boolean } | undefined>() + const queries1List = [1, 2, 3].map(() => ({ ...Queries1.get() })) + const result = useQueries({ + queries: [...queries1List, { ...Queries2.get() }], + }) + + expectTypeOf(result).toEqualTypeOf< + [ + ...Array>, + UseQueryResult, + ] + >() + }) }) - describe('custom hook', () => { - it('should allow custom hooks using UseQueryOptions', () => { - type Data = string + describe('type parameters', () => { + it('should handle type parameter - tuple of tuples', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() - const useCustomQueries = ( - options?: OmitKeyof, 'queryKey' | 'queryFn'>, - ) => { - return useQueries({ + // @ts-expect-error (Page component is not rendered) + function Page() { + const result1 = useQueries< + [[number], [string], [Array, boolean]] + >({ queries: [ { - ...options, - queryKey: queryKey(), - queryFn: () => Promise.resolve('data'), + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + }, + ], + }) + expectTypeOf(result1[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[2]).toEqualTypeOf< + UseQueryResult, boolean> + >() + expectTypeOf(result1[0].data).toEqualTypeOf() + expectTypeOf(result1[1].data).toEqualTypeOf() + expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() + expectTypeOf(result1[2].error).toEqualTypeOf() + + // TData (3rd element) takes precedence over TQueryFnData (1st element) + const result2 = useQueries< + [[string, unknown, string], [string, unknown, number]] + >({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a, 10) + }, + }, + ], + }) + expectTypeOf(result2[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[0].data).toEqualTypeOf() + expectTypeOf(result2[1].data).toEqualTypeOf() + + // types should be enforced + useQueries<[[string, unknown, string], [string, boolean, number]]>({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a, 10) + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + ], + }) + + // field names should be enforced + useQueries<[[string]]>({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + // @ts-expect-error (invalidField) + someInvalidField: [], }, ], }) } + }) - const queryResults = useCustomQueries() - const data = queryResults[0].data + it('should handle type parameter - tuple of objects', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() - expectTypeOf(data).toEqualTypeOf() + // @ts-expect-error (Page component is not rendered) + function Page() { + const result1 = useQueries< + [ + { queryFnData: number }, + { queryFnData: string }, + { queryFnData: Array; error: boolean }, + ] + >({ + queries: [ + { + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + }, + ], + }) + expectTypeOf(result1[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[2]).toEqualTypeOf< + UseQueryResult, boolean> + >() + expectTypeOf(result1[0].data).toEqualTypeOf() + expectTypeOf(result1[1].data).toEqualTypeOf() + expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() + expectTypeOf(result1[2].error).toEqualTypeOf() + + // TData (data prop) takes precedence over TQueryFnData (queryFnData prop) + const result2 = useQueries< + [ + { queryFnData: string; data: string }, + { queryFnData: string; data: number }, + ] + >({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a, 10) + }, + }, + ], + }) + expectTypeOf(result2[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[0].data).toEqualTypeOf() + expectTypeOf(result2[1].data).toEqualTypeOf() + + // can pass only TData (data prop) although TQueryFnData will be left unknown + const result3 = useQueries<[{ data: string }, { data: number }]>({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a as string + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a as number + }, + }, + ], + }) + expectTypeOf(result3[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result3[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result3[0].data).toEqualTypeOf() + expectTypeOf(result3[1].data).toEqualTypeOf() + + // types should be enforced + useQueries< + [ + { queryFnData: string; data: string }, + { queryFnData: string; data: number; error: boolean }, + ] + >({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a, 10) + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + ], + }) + + // field names should be enforced + useQueries<[{ queryFnData: string }]>({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + // @ts-expect-error (invalidField) + someInvalidField: [], + }, + ], + }) + } }) - }) - it('TData should have correct type when conditional skipToken is passed', () => { - const queryResults = useQueries({ - queries: [ - { - queryKey: queryKey(), - queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5), - }, - ], + it('should return correct types when passing through queryOptions', () => { + // @ts-expect-error (Page component is not rendered) + function Page() { + // data and results types are correct when using queryOptions + const result4 = useQueries({ + queries: [ + queryOptions({ + queryKey: queryKey(), + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + }), + queryOptions({ + queryKey: queryKey(), + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a, 10) + }, + }), + ], + }) + expectTypeOf(result4[0]).toEqualTypeOf>() + expectTypeOf(result4[1]).toEqualTypeOf>() + expectTypeOf(result4[0].data).toEqualTypeOf() + expectTypeOf(result4[1].data).toEqualTypeOf() + } }) - const firstResult = queryResults[0] + it('should handle array literal without type parameter to infer result type', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() + const key4 = queryKey() + const key5 = queryKey() - expectTypeOf(firstResult).toEqualTypeOf>() - expectTypeOf(firstResult.data).toEqualTypeOf() - }) + type BizError = { code: number } + const throwOnError = (_error: BizError) => true + + // @ts-expect-error (Page component is not rendered) + function Page() { + // Array.map preserves TQueryFnData + const result1 = useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + })), + }) + expectTypeOf(result1).toEqualTypeOf< + Array> + >() + if (result1[0]) { + expectTypeOf(result1[0].data).toEqualTypeOf() + } + + // Array.map preserves TError + const result1_err = useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + throwOnError, + })), + }) + expectTypeOf(result1_err).toEqualTypeOf< + Array> + >() + if (result1_err[0]) { + expectTypeOf(result1_err[0].data).toEqualTypeOf() + expectTypeOf(result1_err[0].error).toEqualTypeOf() + } + + // Array.map preserves TData + const result2 = useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + }) + expectTypeOf(result2).toEqualTypeOf< + Array> + >() + + const result2_err = useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + throwOnError, + })), + }) + expectTypeOf(result2_err).toEqualTypeOf< + Array> + >() + + const result3 = useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + select: () => 123, + }, + { + queryKey: key5, + queryFn: () => 'string', + throwOnError, + }, + ], + }) + expectTypeOf(result3[0]).toEqualTypeOf>() + expectTypeOf(result3[1]).toEqualTypeOf>() + expectTypeOf(result3[2]).toEqualTypeOf>() + expectTypeOf(result3[0].data).toEqualTypeOf() + expectTypeOf(result3[1].data).toEqualTypeOf() + expectTypeOf(result3[3].data).toEqualTypeOf() + // select takes precedence over queryFn + expectTypeOf(result3[2].data).toEqualTypeOf() + // infer TError from throwOnError + expectTypeOf(result3[3].error).toEqualTypeOf() + + // initialData/placeholderData are enforced + useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 123, + // @ts-expect-error (placeholderData: number) + placeholderData: 'string', + initialData: 123, + }, + ], + }) + + // select and throwOnError params are "indirectly" enforced + useQueries({ + queries: [ + // unfortunately TS will not suggest the type for you + { + queryKey: key1, + queryFn: () => 'string', + }, + // however you can add a type to the callback + { + queryKey: key2, + queryFn: () => 'string', + }, + // the type you do pass is enforced + { + queryKey: key3, + queryFn: () => 'string', + }, + { + queryKey: key4, + queryFn: () => 'string', + select: (a: string) => parseInt(a, 10), + }, + { + queryKey: key5, + queryFn: () => 'string', + throwOnError, + }, + ], + }) + + // callbacks are also indirectly enforced with Array.map + useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + }) + useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + }) + + // results inference works when all the handlers are defined + const result4 = useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key4, + queryFn: () => 'string', + select: (a: string) => parseInt(a, 10), + }, + { + queryKey: key5, + queryFn: () => 'string', + select: (a: string) => parseInt(a, 10), + throwOnError, + }, + ], + }) + expectTypeOf(result4[0]).toEqualTypeOf>() + expectTypeOf(result4[1]).toEqualTypeOf>() + expectTypeOf(result4[2]).toEqualTypeOf>() + expectTypeOf(result4[3]).toEqualTypeOf< + UseQueryResult + >() + + // handles when queryFn returns a Promise + const result5 = useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => Promise.resolve('string'), + }, + ], + }) + expectTypeOf(result5[0]).toEqualTypeOf>() + + // Array as const does not throw error + const result6 = useQueries({ + queries: [ + { + queryKey: ['key1'], + queryFn: () => 'string', + }, + { + queryKey: ['key1'], + queryFn: () => 123, + }, + { + queryKey: key5, + queryFn: () => 'string', + throwOnError, + }, + ], + } as const) + expectTypeOf(result6[0]).toEqualTypeOf>() + expectTypeOf(result6[1]).toEqualTypeOf>() + expectTypeOf(result6[2]).toEqualTypeOf< + UseQueryResult + >() - it('should return correct data for dynamic queries with mixed result types', () => { - const Queries1 = { - get: () => - queryOptions({ - queryKey: queryKey(), - queryFn: () => Promise.resolve(1), - }), - } - const Queries2 = { - get: () => - queryOptions({ - queryKey: queryKey(), - queryFn: () => Promise.resolve(true), - }), - } - - const queries1List = [1, 2, 3].map(() => ({ ...Queries1.get() })) - const result = useQueries({ - queries: [...queries1List, { ...Queries2.get() }], + // field names should be enforced - array literal + useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + // @ts-expect-error (invalidField) + someInvalidField: [], + }, + ], + }) + + // field names should be enforced - Array.map() result + useQueries({ + // @ts-expect-error (invalidField) + queries: Array(10).map(() => ({ + someInvalidField: '', + })), + }) + + // field names should be enforced - array literal + useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + // @ts-expect-error (invalidField) + someInvalidField: [], + }, + ], + }) + + // supports queryFn using fetch() to return Promise - Array.map() result + useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => + fetch('return Promise').then((resp) => resp.json()), + })), + }) + + // supports queryFn using fetch() to return Promise - array literal + useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => + fetch('return Promise').then((resp) => resp.json()), + }, + ], + }) + } }) - expectTypeOf(result).toEqualTypeOf< - [...Array>, UseQueryResult] - >() + it('should handle strongly typed queryFn factories and useQueries wrappers', () => { + // QueryKey + queryFn factory + type QueryKeyA = ['queryA'] + const getQueryKeyA = (): QueryKeyA => ['queryA'] + type GetQueryFunctionA = () => QueryFunction + const getQueryFunctionA: GetQueryFunctionA = () => () => { + return Promise.resolve(1) + } + type SelectorA = (data: number) => [number, string] + const getSelectorA = (): SelectorA => (data) => [data, data.toString()] + + type QueryKeyB = ['queryB', string] + const getQueryKeyB = (id: string): QueryKeyB => ['queryB', id] + type GetQueryFunctionB = () => QueryFunction + const getQueryFunctionB: GetQueryFunctionB = () => () => { + return Promise.resolve('1') + } + type SelectorB = (data: string) => [string, number] + const getSelectorB = (): SelectorB => (data) => [data, +data] + + // Wrapper with strongly typed array-parameter + function useWrappedQueries< + TQueryFnData, + TError, + TData, + TQueryKey extends QueryKey, + >( + queries: Array>, + ) { + return useQueries({ + queries: queries.map( + // no need to type the mapped query + (query) => { + const { queryFn: fn, queryKey: key } = query + expectTypeOf(fn).toEqualTypeOf< + | typeof skipToken + | QueryFunction + | undefined + >() + return { + queryKey: key, + queryFn: + fn && fn !== skipToken + ? (ctx: QueryFunctionContext) => { + // eslint-disable-next-line vitest/valid-expect + expectTypeOf(ctx.queryKey) + return fn.call({}, ctx) + } + : undefined, + } + }, + ), + }) + } + + // @ts-expect-error (Page component is not rendered) + function Page() { + const result = useQueries({ + queries: [ + { + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + }, + { + queryKey: getQueryKeyB('id'), + queryFn: getQueryFunctionB(), + }, + ], + }) + expectTypeOf(result[0]).toEqualTypeOf>() + expectTypeOf(result[1]).toEqualTypeOf>() + + const withSelector = useQueries({ + queries: [ + { + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + select: getSelectorA(), + }, + { + queryKey: getQueryKeyB('id'), + queryFn: getQueryFunctionB(), + select: getSelectorB(), + }, + ], + }) + expectTypeOf(withSelector[0]).toEqualTypeOf< + UseQueryResult<[number, string], Error> + >() + expectTypeOf(withSelector[1]).toEqualTypeOf< + UseQueryResult<[string, number], Error> + >() + + const withWrappedQueries = useWrappedQueries( + Array(10).map(() => ({ + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + select: getSelectorA(), + })), + ) + + expectTypeOf(withWrappedQueries).toEqualTypeOf< + Array> + >() + } + }) }) }) diff --git a/packages/preact-query/src/__tests__/useQueries.test.tsx b/packages/preact-query/src/__tests__/useQueries.test.tsx index 9eaab9fa811..5badd078844 100644 --- a/packages/preact-query/src/__tests__/useQueries.test.tsx +++ b/packages/preact-query/src/__tests__/useQueries.test.tsx @@ -1,32 +1,10 @@ -import type { QueryFunctionContext } from '@tanstack/query-core' import { queryKey, sleep } from '@tanstack/query-test-utils' import { fireEvent, render } from '@testing-library/preact' import { useCallback, useEffect, useState } from 'preact/hooks' -import { - afterEach, - beforeEach, - describe, - expect, - expectTypeOf, - it, - vi, -} from 'vitest' - -import { - IsRestoringProvider, - QueryCache, - QueryClient, - queryOptions, - skipToken, - useQueries, -} from '..' -import type { - QueryFunction, - QueryKey, - QueryObserverResult, - UseQueryOptions, - UseQueryResult, -} from '..' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +import { IsRestoringProvider, QueryCache, QueryClient, useQueries } from '..' +import type { QueryObserverResult, UseQueryResult } from '..' import { ErrorBoundary } from './ErrorBoundary' import { renderWithClient } from './utils' @@ -134,672 +112,6 @@ describe('useQueries', () => { expect(results[2]).toMatchObject([{ data: 2 }]) }) - it('handles type parameter - tuple of tuples', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result1 = useQueries< - [[number], [string], [Array, boolean]] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - }, - ], - }) - expectTypeOf(result1[0]).toEqualTypeOf>() - expectTypeOf(result1[1]).toEqualTypeOf>() - expectTypeOf(result1[2]).toEqualTypeOf< - UseQueryResult, boolean> - >() - expectTypeOf(result1[0].data).toEqualTypeOf() - expectTypeOf(result1[1].data).toEqualTypeOf() - expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() - expectTypeOf(result1[2].error).toEqualTypeOf() - - // TData (3rd element) takes precedence over TQueryFnData (1st element) - const result2 = useQueries< - [[string, unknown, string], [string, unknown, number]] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a, 10) - }, - }, - ], - }) - expectTypeOf(result2[0]).toEqualTypeOf>() - expectTypeOf(result2[1]).toEqualTypeOf>() - expectTypeOf(result2[0].data).toEqualTypeOf() - expectTypeOf(result2[1].data).toEqualTypeOf() - - // types should be enforced - useQueries<[[string, unknown, string], [string, boolean, number]]>({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a, 10) - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - ], - }) - - // field names should be enforced - useQueries<[[string]]>({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - // @ts-expect-error (invalidField) - someInvalidField: [], - }, - ], - }) - } - }) - - it('handles type parameter - tuple of objects', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result1 = useQueries< - [ - { queryFnData: number }, - { queryFnData: string }, - { queryFnData: Array; error: boolean }, - ] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - }, - ], - }) - expectTypeOf(result1[0]).toEqualTypeOf>() - expectTypeOf(result1[1]).toEqualTypeOf>() - expectTypeOf(result1[2]).toEqualTypeOf< - UseQueryResult, boolean> - >() - expectTypeOf(result1[0].data).toEqualTypeOf() - expectTypeOf(result1[1].data).toEqualTypeOf() - expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() - expectTypeOf(result1[2].error).toEqualTypeOf() - - // TData (data prop) takes precedence over TQueryFnData (queryFnData prop) - const result2 = useQueries< - [ - { queryFnData: string; data: string }, - { queryFnData: string; data: number }, - ] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a, 10) - }, - }, - ], - }) - expectTypeOf(result2[0]).toEqualTypeOf>() - expectTypeOf(result2[1]).toEqualTypeOf>() - expectTypeOf(result2[0].data).toEqualTypeOf() - expectTypeOf(result2[1].data).toEqualTypeOf() - - // can pass only TData (data prop) although TQueryFnData will be left unknown - const result3 = useQueries<[{ data: string }, { data: number }]>({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a as string - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a as number - }, - }, - ], - }) - expectTypeOf(result3[0]).toEqualTypeOf>() - expectTypeOf(result3[1]).toEqualTypeOf>() - expectTypeOf(result3[0].data).toEqualTypeOf() - expectTypeOf(result3[1].data).toEqualTypeOf() - - // types should be enforced - useQueries< - [ - { queryFnData: string; data: string }, - { queryFnData: string; data: number; error: boolean }, - ] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a, 10) - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - ], - }) - - // field names should be enforced - useQueries<[{ queryFnData: string }]>({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - // @ts-expect-error (invalidField) - someInvalidField: [], - }, - ], - }) - } - }) - - it('correctly returns types when passing through queryOptions', () => { - // @ts-expect-error (Page component is not rendered) - function Page() { - // data and results types are correct when using queryOptions - const result4 = useQueries({ - queries: [ - queryOptions({ - queryKey: queryKey(), - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - }), - queryOptions({ - queryKey: queryKey(), - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a, 10) - }, - }), - ], - }) - expectTypeOf(result4[0]).toEqualTypeOf>() - expectTypeOf(result4[1]).toEqualTypeOf>() - expectTypeOf(result4[0].data).toEqualTypeOf() - expectTypeOf(result4[1].data).toEqualTypeOf() - } - }) - - it('handles array literal without type parameter to infer result type', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - const key4 = queryKey() - const key5 = queryKey() - - type BizError = { code: number } - const throwOnError = (_error: BizError) => true - - // @ts-expect-error (Page component is not rendered) - function Page() { - // Array.map preserves TQueryFnData - const result1 = useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - })), - }) - expectTypeOf(result1).toEqualTypeOf< - Array> - >() - if (result1[0]) { - expectTypeOf(result1[0].data).toEqualTypeOf() - } - - // Array.map preserves TError - const result1_err = useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - throwOnError, - })), - }) - expectTypeOf(result1_err).toEqualTypeOf< - Array> - >() - if (result1_err[0]) { - expectTypeOf(result1_err[0].data).toEqualTypeOf() - expectTypeOf(result1_err[0].error).toEqualTypeOf() - } - - // Array.map preserves TData - const result2 = useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - }) - expectTypeOf(result2).toEqualTypeOf< - Array> - >() - - const result2_err = useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - throwOnError, - })), - }) - expectTypeOf(result2_err).toEqualTypeOf< - Array> - >() - - const result3 = useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - select: () => 123, - }, - { - queryKey: key5, - queryFn: () => 'string', - throwOnError, - }, - ], - }) - expectTypeOf(result3[0]).toEqualTypeOf>() - expectTypeOf(result3[1]).toEqualTypeOf>() - expectTypeOf(result3[2]).toEqualTypeOf>() - expectTypeOf(result3[0].data).toEqualTypeOf() - expectTypeOf(result3[1].data).toEqualTypeOf() - expectTypeOf(result3[3].data).toEqualTypeOf() - // select takes precedence over queryFn - expectTypeOf(result3[2].data).toEqualTypeOf() - // infer TError from throwOnError - expectTypeOf(result3[3].error).toEqualTypeOf() - - // initialData/placeholderData are enforced - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 123, - // @ts-expect-error (placeholderData: number) - placeholderData: 'string', - initialData: 123, - }, - ], - }) - - // select and throwOnError params are "indirectly" enforced - useQueries({ - queries: [ - // unfortunately TS will not suggest the type for you - { - queryKey: key1, - queryFn: () => 'string', - }, - // however you can add a type to the callback - { - queryKey: key2, - queryFn: () => 'string', - }, - // the type you do pass is enforced - { - queryKey: key3, - queryFn: () => 'string', - }, - { - queryKey: key4, - queryFn: () => 'string', - select: (a: string) => parseInt(a, 10), - }, - { - queryKey: key5, - queryFn: () => 'string', - throwOnError, - }, - ], - }) - - // callbacks are also indirectly enforced with Array.map - useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - }) - useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - }) - - // results inference works when all the handlers are defined - const result4 = useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key4, - queryFn: () => 'string', - select: (a: string) => parseInt(a, 10), - }, - { - queryKey: key5, - queryFn: () => 'string', - select: (a: string) => parseInt(a, 10), - throwOnError, - }, - ], - }) - expectTypeOf(result4[0]).toEqualTypeOf>() - expectTypeOf(result4[1]).toEqualTypeOf>() - expectTypeOf(result4[2]).toEqualTypeOf>() - expectTypeOf(result4[3]).toEqualTypeOf>() - - // handles when queryFn returns a Promise - const result5 = useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => Promise.resolve('string'), - }, - ], - }) - expectTypeOf(result5[0]).toEqualTypeOf>() - - // Array as const does not throw error - const result6 = useQueries({ - queries: [ - { - queryKey: ['key1'], - queryFn: () => 'string', - }, - { - queryKey: ['key1'], - queryFn: () => 123, - }, - { - queryKey: key5, - queryFn: () => 'string', - throwOnError, - }, - ], - } as const) - expectTypeOf(result6[0]).toEqualTypeOf>() - expectTypeOf(result6[1]).toEqualTypeOf>() - expectTypeOf(result6[2]).toEqualTypeOf>() - - // field names should be enforced - array literal - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - // @ts-expect-error (invalidField) - someInvalidField: [], - }, - ], - }) - - // field names should be enforced - Array.map() result - useQueries({ - // @ts-expect-error (invalidField) - queries: Array(10).map(() => ({ - someInvalidField: '', - })), - }) - - // field names should be enforced - array literal - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - // @ts-expect-error (invalidField) - someInvalidField: [], - }, - ], - }) - - // supports queryFn using fetch() to return Promise - Array.map() result - useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => - fetch('return Promise').then((resp) => resp.json()), - })), - }) - - // supports queryFn using fetch() to return Promise - array literal - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => - fetch('return Promise').then((resp) => resp.json()), - }, - ], - }) - } - }) - - it('handles strongly typed queryFn factories and useQueries wrappers', () => { - // QueryKey + queryFn factory - type QueryKeyA = ['queryA'] - const getQueryKeyA = (): QueryKeyA => ['queryA'] - type GetQueryFunctionA = () => QueryFunction - const getQueryFunctionA: GetQueryFunctionA = () => () => { - return Promise.resolve(1) - } - type SelectorA = (data: number) => [number, string] - const getSelectorA = (): SelectorA => (data) => [data, data.toString()] - - type QueryKeyB = ['queryB', string] - const getQueryKeyB = (id: string): QueryKeyB => ['queryB', id] - type GetQueryFunctionB = () => QueryFunction - const getQueryFunctionB: GetQueryFunctionB = () => () => { - return Promise.resolve('1') - } - type SelectorB = (data: string) => [string, number] - const getSelectorB = (): SelectorB => (data) => [data, +data] - - // Wrapper with strongly typed array-parameter - function useWrappedQueries< - TQueryFnData, - TError, - TData, - TQueryKey extends QueryKey, - >(queries: Array>) { - return useQueries({ - queries: queries.map( - // no need to type the mapped query - (query) => { - const { queryFn: fn, queryKey: key } = query - expectTypeOf(fn).toEqualTypeOf< - | typeof skipToken - | QueryFunction - | undefined - >() - return { - queryKey: key, - queryFn: - fn && fn !== skipToken - ? (ctx: QueryFunctionContext) => { - // eslint-disable-next-line vitest/valid-expect - expectTypeOf(ctx.queryKey) - return fn.call({}, ctx) - } - : undefined, - } - }, - ), - }) - } - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result = useQueries({ - queries: [ - { - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - }, - { - queryKey: getQueryKeyB('id'), - queryFn: getQueryFunctionB(), - }, - ], - }) - expectTypeOf(result[0]).toEqualTypeOf>() - expectTypeOf(result[1]).toEqualTypeOf>() - - const withSelector = useQueries({ - queries: [ - { - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - select: getSelectorA(), - }, - { - queryKey: getQueryKeyB('id'), - queryFn: getQueryFunctionB(), - select: getSelectorB(), - }, - ], - }) - expectTypeOf(withSelector[0]).toEqualTypeOf< - UseQueryResult<[number, string], Error> - >() - expectTypeOf(withSelector[1]).toEqualTypeOf< - UseQueryResult<[string, number], Error> - >() - - const withWrappedQueries = useWrappedQueries( - Array(10).map(() => ({ - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - select: getSelectorA(), - })), - ) - - expectTypeOf(withWrappedQueries).toEqualTypeOf< - Array> - >() - } - }) - it("should throw error if in one of queries' queryFn throws and throwOnError is in use", async () => { const consoleMock = vi .spyOn(console, 'error') diff --git a/packages/react-query/src/__tests__/useQueries.test-d.tsx b/packages/react-query/src/__tests__/useQueries.test-d.tsx index 4346bb76a18..32f1d566269 100644 --- a/packages/react-query/src/__tests__/useQueries.test-d.tsx +++ b/packages/react-query/src/__tests__/useQueries.test-d.tsx @@ -3,169 +3,869 @@ import { queryKey } from '@tanstack/query-test-utils' import { skipToken } from '..' import { useQueries } from '../useQueries' import { queryOptions } from '../queryOptions' -import type { OmitKeyof } from '..' +import type { OmitKeyof, QueryFunction, QueryKey } from '..' import type { UseQueryOptions, UseQueryResult } from '../types' +import type { QueryFunctionContext } from '@tanstack/query-core' -describe('UseQueries config object overload', () => { - it('TData should always be defined when initialData is provided as an object', () => { - const query1 = { - queryKey: queryKey(), - queryFn: () => { - return { - wow: true, - } - }, - initialData: { - wow: false, - }, - } - - const query2 = { - queryKey: queryKey(), - queryFn: () => 'Query Data', - initialData: 'initial data', - } - - const query3 = { - queryKey: queryKey(), - queryFn: () => 'Query Data', - } - - const queryResults = useQueries({ queries: [query1, query2, query3] }) - - const query1Data = queryResults[0].data - const query2Data = queryResults[1].data - const query3Data = queryResults[2].data - - expectTypeOf(query1Data).toEqualTypeOf<{ wow: boolean }>() - expectTypeOf(query2Data).toEqualTypeOf() - expectTypeOf(query3Data).toEqualTypeOf() - }) +describe('useQueries', () => { + describe('config object overload', () => { + it('TData should always be defined when initialData is provided as an object', () => { + const query1 = { + queryKey: queryKey(), + queryFn: () => { + return { + wow: true, + } + }, + initialData: { + wow: false, + }, + } + + const query2 = { + queryKey: queryKey(), + queryFn: () => 'Query Data', + initialData: 'initial data', + } - it('TData should be defined when passed through queryOptions', () => { - const options = queryOptions({ - queryKey: queryKey(), - queryFn: () => { - return { + const query3 = { + queryKey: queryKey(), + queryFn: () => 'Query Data', + } + + const queryResults = useQueries({ queries: [query1, query2, query3] }) + + const query1Data = queryResults[0].data + const query2Data = queryResults[1].data + const query3Data = queryResults[2].data + + expectTypeOf(query1Data).toEqualTypeOf<{ wow: boolean }>() + expectTypeOf(query2Data).toEqualTypeOf() + expectTypeOf(query3Data).toEqualTypeOf() + }) + + it('TData should be defined when passed through queryOptions', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => { + return { + wow: true, + } + }, + initialData: { wow: true, - } - }, - initialData: { - wow: true, - }, + }, + }) + const queryResults = useQueries({ queries: [options] }) + + const data = queryResults[0].data + + expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>() }) - const queryResults = useQueries({ queries: [options] }) - const data = queryResults[0].data + it('should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQueries', () => { + const query1 = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => data > 1, + }) - expectTypeOf(data).toEqualTypeOf<{ wow: boolean }>() - }) + const query2 = { + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data: number) => data > 1, + } - it('should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQueries', () => { - const query1 = queryOptions({ - queryKey: queryKey(), - queryFn: () => Promise.resolve(1), - select: (data) => data > 1, + const queryResults = useQueries({ queries: [query1, query2] }) + const query1Data = queryResults[0].data + const query2Data = queryResults[1].data + + expectTypeOf(query1Data).toEqualTypeOf() + expectTypeOf(query2Data).toEqualTypeOf() }) - const query2 = { - queryKey: queryKey(), - queryFn: () => Promise.resolve(1), - select: (data: number) => data > 1, - } + it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => { + const queryResults = useQueries({ + queries: [ + { + queryKey: queryKey(), + queryFn: () => { + return { + wow: true, + } + }, + initialData: () => undefined as { wow: boolean } | undefined, + }, + ], + }) - const queryResults = useQueries({ queries: [query1, query2] }) - const query1Data = queryResults[0].data - const query2Data = queryResults[1].data + const data = queryResults[0].data - expectTypeOf(query1Data).toEqualTypeOf() - expectTypeOf(query2Data).toEqualTypeOf() - }) + expectTypeOf(data).toEqualTypeOf<{ wow: boolean } | undefined>() + }) + + describe('custom hook', () => { + it('should allow custom hooks using UseQueryOptions', () => { + type Data = string + + const useCustomQueries = ( + options?: OmitKeyof, 'queryKey' | 'queryFn'>, + ) => { + return useQueries({ + queries: [ + { + ...options, + queryKey: queryKey(), + queryFn: () => Promise.resolve('data'), + }, + ], + }) + } - it('TData should have undefined in the union when initialData is provided as a function which can return undefined', () => { - const queryResults = useQueries({ - queries: [ - { - queryKey: queryKey(), - queryFn: () => { - return { - wow: true, - } + const queryResults = useCustomQueries() + const data = queryResults[0].data + + expectTypeOf(data).toEqualTypeOf() + }) + }) + + it('TData should have correct type when conditional skipToken is passed', () => { + const queryResults = useQueries({ + queries: [ + { + queryKey: queryKey(), + queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5), }, - initialData: () => undefined as { wow: boolean } | undefined, - }, - ], + ], + }) + + const firstResult = queryResults[0] + + expectTypeOf(firstResult).toEqualTypeOf>() + expectTypeOf(firstResult.data).toEqualTypeOf() }) - const data = queryResults[0].data + it('should return correct data for dynamic queries with mixed result types', () => { + const Queries1 = { + get: () => + queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }), + } + const Queries2 = { + get: () => + queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(true), + }), + } - expectTypeOf(data).toEqualTypeOf<{ wow: boolean } | undefined>() + const queries1List = [1, 2, 3].map(() => ({ ...Queries1.get() })) + const result = useQueries({ + queries: [...queries1List, { ...Queries2.get() }], + }) + + expectTypeOf(result).toEqualTypeOf< + [ + ...Array>, + UseQueryResult, + ] + >() + }) }) - describe('custom hook', () => { - it('should allow custom hooks using UseQueryOptions', () => { - type Data = string + describe('type parameters', () => { + it('should handle type parameter - tuple of tuples', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() - const useCustomQueries = ( - options?: OmitKeyof, 'queryKey' | 'queryFn'>, - ) => { - return useQueries({ + // @ts-expect-error (Page component is not rendered) + function Page() { + const result1 = useQueries< + [[number], [string], [Array, boolean]] + >({ queries: [ { - ...options, - queryKey: queryKey(), - queryFn: () => Promise.resolve('data'), + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + }, + ], + }) + expectTypeOf(result1[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[2]).toEqualTypeOf< + UseQueryResult, boolean> + >() + expectTypeOf(result1[0].data).toEqualTypeOf() + expectTypeOf(result1[1].data).toEqualTypeOf() + expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() + expectTypeOf(result1[2].error).toEqualTypeOf() + + // TData (3rd element) takes precedence over TQueryFnData (1st element) + const result2 = useQueries< + [[string, unknown, string], [string, unknown, number]] + >({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + }, + ], + }) + expectTypeOf(result2[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[0].data).toEqualTypeOf() + expectTypeOf(result2[1].data).toEqualTypeOf() + + // types should be enforced + useQueries<[[string, unknown, string], [string, boolean, number]]>({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + ], + }) + + // field names should be enforced + useQueries<[[string]]>({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + // @ts-expect-error (invalidField) + someInvalidField: [], }, ], }) } + }) - const queryResults = useCustomQueries() - const data = queryResults[0].data + it('should handle type parameter - tuple of objects', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() - expectTypeOf(data).toEqualTypeOf() + // @ts-expect-error (Page component is not rendered) + function Page() { + const result1 = useQueries< + [ + { queryFnData: number }, + { queryFnData: string }, + { queryFnData: Array; error: boolean }, + ] + >({ + queries: [ + { + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + }, + ], + }) + expectTypeOf(result1[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[2]).toEqualTypeOf< + UseQueryResult, boolean> + >() + expectTypeOf(result1[0].data).toEqualTypeOf() + expectTypeOf(result1[1].data).toEqualTypeOf() + expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() + expectTypeOf(result1[2].error).toEqualTypeOf() + + // TData (data prop) takes precedence over TQueryFnData (queryFnData prop) + const result2 = useQueries< + [ + { queryFnData: string; data: string }, + { queryFnData: string; data: number }, + ] + >({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + }, + ], + }) + expectTypeOf(result2[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[0].data).toEqualTypeOf() + expectTypeOf(result2[1].data).toEqualTypeOf() + + // can pass only TData (data prop) although TQueryFnData will be left unknown + const result3 = useQueries<[{ data: string }, { data: number }]>({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a as string + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a as number + }, + }, + ], + }) + expectTypeOf(result3[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result3[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result3[0].data).toEqualTypeOf() + expectTypeOf(result3[1].data).toEqualTypeOf() + + // types should be enforced + useQueries< + [ + { queryFnData: string; data: string }, + { queryFnData: string; data: number; error: boolean }, + ] + >({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + ], + }) + + // field names should be enforced + useQueries<[{ queryFnData: string }]>({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + // @ts-expect-error (invalidField) + someInvalidField: [], + }, + ], + }) + } }) - }) - it('TData should have correct type when conditional skipToken is passed', () => { - const queryResults = useQueries({ - queries: [ - { - queryKey: queryKey(), - queryFn: Math.random() > 0.5 ? skipToken : () => Promise.resolve(5), - }, - ], + it('should return correct types when passing through queryOptions', () => { + // @ts-expect-error (Page component is not rendered) + function Page() { + // data and results types are correct when using queryOptions + const result4 = useQueries({ + queries: [ + queryOptions({ + queryKey: queryKey(), + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + }), + queryOptions({ + queryKey: queryKey(), + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + }), + ], + }) + expectTypeOf(result4[0]).toEqualTypeOf>() + expectTypeOf(result4[1]).toEqualTypeOf>() + expectTypeOf(result4[0].data).toEqualTypeOf() + expectTypeOf(result4[1].data).toEqualTypeOf() + } }) - const firstResult = queryResults[0] + it('should handle array literal without type parameter to infer result type', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() + const key4 = queryKey() + const key5 = queryKey() - expectTypeOf(firstResult).toEqualTypeOf>() - expectTypeOf(firstResult.data).toEqualTypeOf() - }) + type BizError = { code: number } + const throwOnError = (_error: BizError) => true + + // @ts-expect-error (Page component is not rendered) + function Page() { + // Array.map preserves TQueryFnData + const result1 = useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + })), + }) + expectTypeOf(result1).toEqualTypeOf< + Array> + >() + if (result1[0]) { + expectTypeOf(result1[0].data).toEqualTypeOf() + } + + // Array.map preserves TError + const result1_err = useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + throwOnError, + })), + }) + expectTypeOf(result1_err).toEqualTypeOf< + Array> + >() + if (result1_err[0]) { + expectTypeOf(result1_err[0].data).toEqualTypeOf() + expectTypeOf(result1_err[0].error).toEqualTypeOf() + } + + // Array.map preserves TData + const result2 = useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + }) + expectTypeOf(result2).toEqualTypeOf< + Array> + >() + + const result2_err = useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + throwOnError, + })), + }) + expectTypeOf(result2_err).toEqualTypeOf< + Array> + >() + + const result3 = useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + select: () => 123, + }, + { + queryKey: key5, + queryFn: () => 'string', + throwOnError, + }, + ], + }) + expectTypeOf(result3[0]).toEqualTypeOf>() + expectTypeOf(result3[1]).toEqualTypeOf>() + expectTypeOf(result3[2]).toEqualTypeOf>() + expectTypeOf(result3[0].data).toEqualTypeOf() + expectTypeOf(result3[1].data).toEqualTypeOf() + expectTypeOf(result3[3].data).toEqualTypeOf() + // select takes precedence over queryFn + expectTypeOf(result3[2].data).toEqualTypeOf() + // infer TError from throwOnError + expectTypeOf(result3[3].error).toEqualTypeOf() + + // initialData/placeholderData are enforced + useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 123, + // @ts-expect-error (placeholderData: number) + placeholderData: 'string', + initialData: 123, + }, + ], + }) + + // select and throwOnError params are "indirectly" enforced + useQueries({ + queries: [ + // unfortunately TS will not suggest the type for you + { + queryKey: key1, + queryFn: () => 'string', + }, + // however you can add a type to the callback + { + queryKey: key2, + queryFn: () => 'string', + }, + // the type you do pass is enforced + { + queryKey: key3, + queryFn: () => 'string', + }, + { + queryKey: key4, + queryFn: () => 'string', + select: (a: string) => parseInt(a), + }, + { + queryKey: key5, + queryFn: () => 'string', + throwOnError, + }, + ], + }) + + // callbacks are also indirectly enforced with Array.map + useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + }) + useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + }) + + // results inference works when all the handlers are defined + const result4 = useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key4, + queryFn: () => 'string', + select: (a: string) => parseInt(a), + }, + { + queryKey: key5, + queryFn: () => 'string', + select: (a: string) => parseInt(a), + throwOnError, + }, + ], + }) + expectTypeOf(result4[0]).toEqualTypeOf>() + expectTypeOf(result4[1]).toEqualTypeOf>() + expectTypeOf(result4[2]).toEqualTypeOf>() + expectTypeOf(result4[3]).toEqualTypeOf< + UseQueryResult + >() + + // handles when queryFn returns a Promise + const result5 = useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => Promise.resolve('string'), + }, + ], + }) + expectTypeOf(result5[0]).toEqualTypeOf>() + + // Array as const does not throw error + const result6 = useQueries({ + queries: [ + { + queryKey: ['key1'], + queryFn: () => 'string', + }, + { + queryKey: ['key1'], + queryFn: () => 123, + }, + { + queryKey: key5, + queryFn: () => 'string', + throwOnError, + }, + ], + } as const) + expectTypeOf(result6[0]).toEqualTypeOf>() + expectTypeOf(result6[1]).toEqualTypeOf>() + expectTypeOf(result6[2]).toEqualTypeOf< + UseQueryResult + >() - it('should return correct data for dynamic queries with mixed result types', () => { - const Queries1 = { - get: () => - queryOptions({ - queryKey: queryKey(), - queryFn: () => Promise.resolve(1), - }), - } - const Queries2 = { - get: () => - queryOptions({ - queryKey: queryKey(), - queryFn: () => Promise.resolve(true), - }), - } - - const queries1List = [1, 2, 3].map(() => ({ ...Queries1.get() })) - const result = useQueries({ - queries: [...queries1List, { ...Queries2.get() }], + // field names should be enforced - array literal + useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + // @ts-expect-error (invalidField) + someInvalidField: [], + }, + ], + }) + + // field names should be enforced - Array.map() result + useQueries({ + // @ts-expect-error (invalidField) + queries: Array(10).map(() => ({ + someInvalidField: '', + })), + }) + + // field names should be enforced - array literal + useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + // @ts-expect-error (invalidField) + someInvalidField: [], + }, + ], + }) + + // supports queryFn using fetch() to return Promise - Array.map() result + useQueries({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => + fetch('return Promise').then((resp) => resp.json()), + })), + }) + + // supports queryFn using fetch() to return Promise - array literal + useQueries({ + queries: [ + { + queryKey: key1, + queryFn: () => + fetch('return Promise').then((resp) => resp.json()), + }, + ], + }) + } }) - expectTypeOf(result).toEqualTypeOf< - [...Array>, UseQueryResult] - >() + it('should handle strongly typed queryFn factories and useQueries wrappers', () => { + // QueryKey + queryFn factory + type QueryKeyA = ['queryA'] + const getQueryKeyA = (): QueryKeyA => ['queryA'] + type GetQueryFunctionA = () => QueryFunction + const getQueryFunctionA: GetQueryFunctionA = () => () => { + return Promise.resolve(1) + } + type SelectorA = (data: number) => [number, string] + const getSelectorA = (): SelectorA => (data) => [data, data.toString()] + + type QueryKeyB = ['queryB', string] + const getQueryKeyB = (id: string): QueryKeyB => ['queryB', id] + type GetQueryFunctionB = () => QueryFunction + const getQueryFunctionB: GetQueryFunctionB = () => () => { + return Promise.resolve('1') + } + type SelectorB = (data: string) => [string, number] + const getSelectorB = (): SelectorB => (data) => [data, +data] + + // Wrapper with strongly typed array-parameter + function useWrappedQueries< + TQueryFnData, + TError, + TData, + TQueryKey extends QueryKey, + >( + queries: Array>, + ) { + return useQueries({ + queries: queries.map( + // no need to type the mapped query + (query) => { + const { queryFn: fn, queryKey: key } = query + expectTypeOf(fn).toEqualTypeOf< + | typeof skipToken + | QueryFunction + | undefined + >() + return { + queryKey: key, + queryFn: + fn && fn !== skipToken + ? (ctx: QueryFunctionContext) => { + // eslint-disable-next-line vitest/valid-expect + expectTypeOf(ctx.queryKey) + return fn.call({}, ctx) + } + : undefined, + } + }, + ), + }) + } + + // @ts-expect-error (Page component is not rendered) + function Page() { + const result = useQueries({ + queries: [ + { + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + }, + { + queryKey: getQueryKeyB('id'), + queryFn: getQueryFunctionB(), + }, + ], + }) + expectTypeOf(result[0]).toEqualTypeOf>() + expectTypeOf(result[1]).toEqualTypeOf>() + + const withSelector = useQueries({ + queries: [ + { + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + select: getSelectorA(), + }, + { + queryKey: getQueryKeyB('id'), + queryFn: getQueryFunctionB(), + select: getSelectorB(), + }, + ], + }) + expectTypeOf(withSelector[0]).toEqualTypeOf< + UseQueryResult<[number, string], Error> + >() + expectTypeOf(withSelector[1]).toEqualTypeOf< + UseQueryResult<[string, number], Error> + >() + + const withWrappedQueries = useWrappedQueries( + Array(10).map(() => ({ + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + select: getSelectorA(), + })), + ) + + expectTypeOf(withWrappedQueries).toEqualTypeOf< + Array> + >() + } + }) }) }) diff --git a/packages/react-query/src/__tests__/useQueries.test.tsx b/packages/react-query/src/__tests__/useQueries.test.tsx index 29529920f75..bee70698fc7 100644 --- a/packages/react-query/src/__tests__/useQueries.test.tsx +++ b/packages/react-query/src/__tests__/useQueries.test.tsx @@ -1,33 +1,11 @@ -import { - afterEach, - beforeEach, - describe, - expect, - expectTypeOf, - it, - vi, -} from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { fireEvent, render } from '@testing-library/react' import * as React from 'react' import { ErrorBoundary } from 'react-error-boundary' import { queryKey, sleep } from '@tanstack/query-test-utils' -import { - IsRestoringProvider, - QueryCache, - QueryClient, - queryOptions, - skipToken, - useQueries, -} from '..' +import { IsRestoringProvider, QueryCache, QueryClient, useQueries } from '..' import { renderWithClient } from './utils' -import type { - QueryFunction, - QueryKey, - QueryObserverResult, - UseQueryOptions, - UseQueryResult, -} from '..' -import type { QueryFunctionContext } from '@tanstack/query-core' +import type { QueryObserverResult, UseQueryResult } from '..' describe('useQueries', () => { let queryCache: QueryCache @@ -133,672 +111,6 @@ describe('useQueries', () => { expect(results[2]).toMatchObject([{ data: 2 }]) }) - it('handles type parameter - tuple of tuples', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result1 = useQueries< - [[number], [string], [Array, boolean]] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - }, - ], - }) - expectTypeOf(result1[0]).toEqualTypeOf>() - expectTypeOf(result1[1]).toEqualTypeOf>() - expectTypeOf(result1[2]).toEqualTypeOf< - UseQueryResult, boolean> - >() - expectTypeOf(result1[0].data).toEqualTypeOf() - expectTypeOf(result1[1].data).toEqualTypeOf() - expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() - expectTypeOf(result1[2].error).toEqualTypeOf() - - // TData (3rd element) takes precedence over TQueryFnData (1st element) - const result2 = useQueries< - [[string, unknown, string], [string, unknown, number]] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - }, - ], - }) - expectTypeOf(result2[0]).toEqualTypeOf>() - expectTypeOf(result2[1]).toEqualTypeOf>() - expectTypeOf(result2[0].data).toEqualTypeOf() - expectTypeOf(result2[1].data).toEqualTypeOf() - - // types should be enforced - useQueries<[[string, unknown, string], [string, boolean, number]]>({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - ], - }) - - // field names should be enforced - useQueries<[[string]]>({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - // @ts-expect-error (invalidField) - someInvalidField: [], - }, - ], - }) - } - }) - - it('handles type parameter - tuple of objects', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result1 = useQueries< - [ - { queryFnData: number }, - { queryFnData: string }, - { queryFnData: Array; error: boolean }, - ] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - }, - ], - }) - expectTypeOf(result1[0]).toEqualTypeOf>() - expectTypeOf(result1[1]).toEqualTypeOf>() - expectTypeOf(result1[2]).toEqualTypeOf< - UseQueryResult, boolean> - >() - expectTypeOf(result1[0].data).toEqualTypeOf() - expectTypeOf(result1[1].data).toEqualTypeOf() - expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() - expectTypeOf(result1[2].error).toEqualTypeOf() - - // TData (data prop) takes precedence over TQueryFnData (queryFnData prop) - const result2 = useQueries< - [ - { queryFnData: string; data: string }, - { queryFnData: string; data: number }, - ] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - }, - ], - }) - expectTypeOf(result2[0]).toEqualTypeOf>() - expectTypeOf(result2[1]).toEqualTypeOf>() - expectTypeOf(result2[0].data).toEqualTypeOf() - expectTypeOf(result2[1].data).toEqualTypeOf() - - // can pass only TData (data prop) although TQueryFnData will be left unknown - const result3 = useQueries<[{ data: string }, { data: number }]>({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a as string - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a as number - }, - }, - ], - }) - expectTypeOf(result3[0]).toEqualTypeOf>() - expectTypeOf(result3[1]).toEqualTypeOf>() - expectTypeOf(result3[0].data).toEqualTypeOf() - expectTypeOf(result3[1].data).toEqualTypeOf() - - // types should be enforced - useQueries< - [ - { queryFnData: string; data: string }, - { queryFnData: string; data: number; error: boolean }, - ] - >({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - ], - }) - - // field names should be enforced - useQueries<[{ queryFnData: string }]>({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - // @ts-expect-error (invalidField) - someInvalidField: [], - }, - ], - }) - } - }) - - it('correctly returns types when passing through queryOptions', () => { - // @ts-expect-error (Page component is not rendered) - function Page() { - // data and results types are correct when using queryOptions - const result4 = useQueries({ - queries: [ - queryOptions({ - queryKey: queryKey(), - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - }), - queryOptions({ - queryKey: queryKey(), - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - }), - ], - }) - expectTypeOf(result4[0]).toEqualTypeOf>() - expectTypeOf(result4[1]).toEqualTypeOf>() - expectTypeOf(result4[0].data).toEqualTypeOf() - expectTypeOf(result4[1].data).toEqualTypeOf() - } - }) - - it('handles array literal without type parameter to infer result type', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - const key4 = queryKey() - const key5 = queryKey() - - type BizError = { code: number } - const throwOnError = (_error: BizError) => true - - // @ts-expect-error (Page component is not rendered) - function Page() { - // Array.map preserves TQueryFnData - const result1 = useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - })), - }) - expectTypeOf(result1).toEqualTypeOf< - Array> - >() - if (result1[0]) { - expectTypeOf(result1[0].data).toEqualTypeOf() - } - - // Array.map preserves TError - const result1_err = useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - throwOnError, - })), - }) - expectTypeOf(result1_err).toEqualTypeOf< - Array> - >() - if (result1_err[0]) { - expectTypeOf(result1_err[0].data).toEqualTypeOf() - expectTypeOf(result1_err[0].error).toEqualTypeOf() - } - - // Array.map preserves TData - const result2 = useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - }) - expectTypeOf(result2).toEqualTypeOf< - Array> - >() - - const result2_err = useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - throwOnError, - })), - }) - expectTypeOf(result2_err).toEqualTypeOf< - Array> - >() - - const result3 = useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - select: () => 123, - }, - { - queryKey: key5, - queryFn: () => 'string', - throwOnError, - }, - ], - }) - expectTypeOf(result3[0]).toEqualTypeOf>() - expectTypeOf(result3[1]).toEqualTypeOf>() - expectTypeOf(result3[2]).toEqualTypeOf>() - expectTypeOf(result3[0].data).toEqualTypeOf() - expectTypeOf(result3[1].data).toEqualTypeOf() - expectTypeOf(result3[3].data).toEqualTypeOf() - // select takes precedence over queryFn - expectTypeOf(result3[2].data).toEqualTypeOf() - // infer TError from throwOnError - expectTypeOf(result3[3].error).toEqualTypeOf() - - // initialData/placeholderData are enforced - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 123, - // @ts-expect-error (placeholderData: number) - placeholderData: 'string', - initialData: 123, - }, - ], - }) - - // select and throwOnError params are "indirectly" enforced - useQueries({ - queries: [ - // unfortunately TS will not suggest the type for you - { - queryKey: key1, - queryFn: () => 'string', - }, - // however you can add a type to the callback - { - queryKey: key2, - queryFn: () => 'string', - }, - // the type you do pass is enforced - { - queryKey: key3, - queryFn: () => 'string', - }, - { - queryKey: key4, - queryFn: () => 'string', - select: (a: string) => parseInt(a), - }, - { - queryKey: key5, - queryFn: () => 'string', - throwOnError, - }, - ], - }) - - // callbacks are also indirectly enforced with Array.map - useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - }) - useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - }) - - // results inference works when all the handlers are defined - const result4 = useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key4, - queryFn: () => 'string', - select: (a: string) => parseInt(a), - }, - { - queryKey: key5, - queryFn: () => 'string', - select: (a: string) => parseInt(a), - throwOnError, - }, - ], - }) - expectTypeOf(result4[0]).toEqualTypeOf>() - expectTypeOf(result4[1]).toEqualTypeOf>() - expectTypeOf(result4[2]).toEqualTypeOf>() - expectTypeOf(result4[3]).toEqualTypeOf>() - - // handles when queryFn returns a Promise - const result5 = useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => Promise.resolve('string'), - }, - ], - }) - expectTypeOf(result5[0]).toEqualTypeOf>() - - // Array as const does not throw error - const result6 = useQueries({ - queries: [ - { - queryKey: ['key1'], - queryFn: () => 'string', - }, - { - queryKey: ['key1'], - queryFn: () => 123, - }, - { - queryKey: key5, - queryFn: () => 'string', - throwOnError, - }, - ], - } as const) - expectTypeOf(result6[0]).toEqualTypeOf>() - expectTypeOf(result6[1]).toEqualTypeOf>() - expectTypeOf(result6[2]).toEqualTypeOf>() - - // field names should be enforced - array literal - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - // @ts-expect-error (invalidField) - someInvalidField: [], - }, - ], - }) - - // field names should be enforced - Array.map() result - useQueries({ - // @ts-expect-error (invalidField) - queries: Array(10).map(() => ({ - someInvalidField: '', - })), - }) - - // field names should be enforced - array literal - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - // @ts-expect-error (invalidField) - someInvalidField: [], - }, - ], - }) - - // supports queryFn using fetch() to return Promise - Array.map() result - useQueries({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => - fetch('return Promise').then((resp) => resp.json()), - })), - }) - - // supports queryFn using fetch() to return Promise - array literal - useQueries({ - queries: [ - { - queryKey: key1, - queryFn: () => - fetch('return Promise').then((resp) => resp.json()), - }, - ], - }) - } - }) - - it('handles strongly typed queryFn factories and useQueries wrappers', () => { - // QueryKey + queryFn factory - type QueryKeyA = ['queryA'] - const getQueryKeyA = (): QueryKeyA => ['queryA'] - type GetQueryFunctionA = () => QueryFunction - const getQueryFunctionA: GetQueryFunctionA = () => () => { - return Promise.resolve(1) - } - type SelectorA = (data: number) => [number, string] - const getSelectorA = (): SelectorA => (data) => [data, data.toString()] - - type QueryKeyB = ['queryB', string] - const getQueryKeyB = (id: string): QueryKeyB => ['queryB', id] - type GetQueryFunctionB = () => QueryFunction - const getQueryFunctionB: GetQueryFunctionB = () => () => { - return Promise.resolve('1') - } - type SelectorB = (data: string) => [string, number] - const getSelectorB = (): SelectorB => (data) => [data, +data] - - // Wrapper with strongly typed array-parameter - function useWrappedQueries< - TQueryFnData, - TError, - TData, - TQueryKey extends QueryKey, - >(queries: Array>) { - return useQueries({ - queries: queries.map( - // no need to type the mapped query - (query) => { - const { queryFn: fn, queryKey: key } = query - expectTypeOf(fn).toEqualTypeOf< - | typeof skipToken - | QueryFunction - | undefined - >() - return { - queryKey: key, - queryFn: - fn && fn !== skipToken - ? (ctx: QueryFunctionContext) => { - // eslint-disable-next-line vitest/valid-expect - expectTypeOf(ctx.queryKey) - return fn.call({}, ctx) - } - : undefined, - } - }, - ), - }) - } - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result = useQueries({ - queries: [ - { - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - }, - { - queryKey: getQueryKeyB('id'), - queryFn: getQueryFunctionB(), - }, - ], - }) - expectTypeOf(result[0]).toEqualTypeOf>() - expectTypeOf(result[1]).toEqualTypeOf>() - - const withSelector = useQueries({ - queries: [ - { - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - select: getSelectorA(), - }, - { - queryKey: getQueryKeyB('id'), - queryFn: getQueryFunctionB(), - select: getSelectorB(), - }, - ], - }) - expectTypeOf(withSelector[0]).toEqualTypeOf< - UseQueryResult<[number, string], Error> - >() - expectTypeOf(withSelector[1]).toEqualTypeOf< - UseQueryResult<[string, number], Error> - >() - - const withWrappedQueries = useWrappedQueries( - Array(10).map(() => ({ - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - select: getSelectorA(), - })), - ) - - expectTypeOf(withWrappedQueries).toEqualTypeOf< - Array> - >() - } - }) - it("should throw error if in one of queries' queryFn throws and throwOnError is in use", async () => { const consoleMock = vi .spyOn(console, 'error') From 784c2f0a07c71dfaebe4d0c4a83d7a79631d07f9 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 16 Jun 2026 14:50:40 +0900 Subject: [PATCH 02/97] test(solid-query/useQueries): move type-only tests to 'useQueries.test-d.tsx' (#10959) --- .../src/__tests__/useQueries.test-d.tsx | 604 +++++++++++++++++- .../src/__tests__/useQueries.test.tsx | 595 +---------------- 2 files changed, 605 insertions(+), 594 deletions(-) diff --git a/packages/solid-query/src/__tests__/useQueries.test-d.tsx b/packages/solid-query/src/__tests__/useQueries.test-d.tsx index 9526923872e..eaa0a42d45f 100644 --- a/packages/solid-query/src/__tests__/useQueries.test-d.tsx +++ b/packages/solid-query/src/__tests__/useQueries.test-d.tsx @@ -3,8 +3,14 @@ import { skipToken } from '@tanstack/query-core' import { queryKey } from '@tanstack/query-test-utils' import { queryOptions, useQueries } from '..' import { QueryClient } from '../QueryClient' +import type * as QueryCore from '@tanstack/query-core' import type { OmitKeyof } from '@tanstack/query-core' -import type { UseQueryResult } from '..' +import type { + QueryFunction, + QueryFunctionContext, + QueryKey, + UseQueryResult, +} from '..' import type { QueryOptions } from '../types' describe('useQueries', () => { @@ -289,4 +295,600 @@ describe('useQueries', () => { }, })) }) + + describe('type parameters', () => { + it('should handle type parameter - tuple of tuples', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() + + // @ts-expect-error (Page component is not rendered) + function Page() { + const result1 = useQueries< + [[number], [string], [Array, boolean]] + >(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + }, + ], + })) + expectTypeOf(result1[0]).toEqualTypeOf>() + expectTypeOf(result1[1]).toEqualTypeOf>() + expectTypeOf(result1[2]).toEqualTypeOf< + UseQueryResult, boolean> + >() + expectTypeOf(result1[0].data).toEqualTypeOf() + expectTypeOf(result1[1].data).toEqualTypeOf() + expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() + expectTypeOf(result1[2].error).toEqualTypeOf() + + // TData (3rd element) takes precedence over TQueryFnData (1st element) + const result2 = useQueries< + [[string, unknown, string], [string, unknown, number]] + >(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + }, + ], + })) + expectTypeOf(result2[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[0].data).toEqualTypeOf() + expectTypeOf(result2[1].data).toEqualTypeOf() + + // types should be enforced + useQueries<[[string, unknown, string], [string, boolean, number]]>( + () => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + ], + }), + ) + + // field names should be enforced + useQueries<[[string]]>(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + }, + ], + })) + } + }) + + it('should handle type parameter - tuple of objects', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() + + // @ts-expect-error (Page component is not rendered) + function Page() { + const result1 = useQueries< + [ + { queryFnData: number }, + { queryFnData: string }, + { queryFnData: Array; error: boolean }, + ] + >(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + }, + ], + })) + expectTypeOf(result1[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result1[2]).toEqualTypeOf< + UseQueryResult, boolean> + >() + expectTypeOf(result1[0].data).toEqualTypeOf() + expectTypeOf(result1[1].data).toEqualTypeOf() + expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() + expectTypeOf(result1[2].error).toEqualTypeOf() + + // TData (data prop) takes precedence over TQueryFnData (queryFnData prop) + const result2 = useQueries< + [ + { queryFnData: string; data: string }, + { queryFnData: string; data: number }, + ] + >(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + }, + ], + })) + expectTypeOf(result2[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result2[0].data).toEqualTypeOf() + expectTypeOf(result2[1].data).toEqualTypeOf() + + // can pass only TData (data prop) although TQueryFnData will be left unknown + const result3 = useQueries<[{ data: string }, { data: number }]>( + () => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a as string + }, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a as number + }, + }, + ], + }), + ) + expectTypeOf(result3[0]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result3[1]).toEqualTypeOf< + UseQueryResult + >() + expectTypeOf(result3[0].data).toEqualTypeOf() + expectTypeOf(result3[1].data).toEqualTypeOf() + + // types should be enforced + useQueries< + [ + { queryFnData: string; data: string }, + { queryFnData: string; data: number; error: boolean }, + ] + >(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return a.toLowerCase() + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 'string', + select: (a) => { + expectTypeOf(a).toEqualTypeOf() + return parseInt(a) + }, + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + ], + })) + + // field names should be enforced + useQueries<[{ queryFnData: string }]>(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + }, + ], + })) + } + }) + + it('should handle array literal without type parameter to infer result type', () => { + const key1 = queryKey() + const key2 = queryKey() + const key3 = queryKey() + const key4 = queryKey() + + // @ts-expect-error (Page component is not rendered) + function Page() { + // Array.map preserves TQueryFnData + const result1 = useQueries(() => ({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + })), + })) + expectTypeOf(result1).toEqualTypeOf< + Array> + >() + if (result1[0]) { + expectTypeOf(result1[0].data).toEqualTypeOf() + } + + // Array.map preserves TData + const result2 = useQueries(() => ({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + })) + expectTypeOf(result2).toEqualTypeOf< + Array> + >() + + const result3 = useQueries(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 1, + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key3, + queryFn: () => ['string[]'], + select: () => 123, + }, + ], + })) + expectTypeOf(result3[0]).toEqualTypeOf>() + expectTypeOf(result3[1]).toEqualTypeOf>() + expectTypeOf(result3[2]).toEqualTypeOf>() + expectTypeOf(result3[0].data).toEqualTypeOf() + expectTypeOf(result3[1].data).toEqualTypeOf() + // select takes precedence over queryFn + expectTypeOf(result3[2].data).toEqualTypeOf() + + // initialData/placeholderData are enforced + useQueries(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + placeholderData: 'string', + // @ts-expect-error (initialData: string) + initialData: 123, + }, + { + queryKey: key2, + queryFn: () => 123, + // @ts-expect-error (placeholderData: number) + placeholderData: 'string', + initialData: 123, + }, + ], + })) + + // select params are "indirectly" enforced + useQueries(() => ({ + queries: [ + // unfortunately TS will not suggest the type for you + { + queryKey: key1, + queryFn: () => 'string', + }, + // however you can add a type to the callback + { + queryKey: key2, + queryFn: () => 'string', + }, + // the type you do pass is enforced + { + queryKey: key3, + queryFn: () => 'string', + }, + { + queryKey: key4, + queryFn: () => 'string', + select: (a: string) => parseInt(a), + }, + ], + })) + + // callbacks are also indirectly enforced with Array.map + useQueries(() => ({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + })) + + useQueries(() => ({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => i + 10, + select: (data: number) => data.toString(), + })), + })) + + // results inference works when all the handlers are defined + const result4 = useQueries(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + }, + { + queryKey: key2, + queryFn: () => 'string', + }, + { + queryKey: key4, + queryFn: () => 'string', + select: (a: string) => parseInt(a), + }, + ], + })) + expectTypeOf(result4[0]).toEqualTypeOf>() + expectTypeOf(result4[1]).toEqualTypeOf>() + expectTypeOf(result4[2]).toEqualTypeOf>() + + // handles when queryFn returns a Promise + const result5 = useQueries(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => Promise.resolve('string'), + }, + ], + })) + expectTypeOf(result5[0]).toEqualTypeOf>() + + // Array as const does not throw error + const result6 = useQueries( + () => + ({ + queries: [ + { + queryKey: ['key1'], + queryFn: () => 'string', + }, + { + queryKey: ['key1'], + queryFn: () => 123, + }, + ], + }) as const, + ) + expectTypeOf(result6[0]).toEqualTypeOf>() + expectTypeOf(result6[1]).toEqualTypeOf>() + + // field names should be enforced - array literal + useQueries(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + }, + ], + })) + + // field names should be enforced - Array.map() result + useQueries(() => ({ + // @ts-expect-error (invalidField) + queries: Array(10).map(() => ({ + someInvalidField: '', + })), + })) + + // field names should be enforced - array literal + useQueries(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => 'string', + }, + ], + })) + + // supports queryFn using fetch() to return Promise - Array.map() result + useQueries(() => ({ + queries: Array(50).map((_, i) => ({ + queryKey: ['key', i] as const, + queryFn: () => + fetch('return Promise').then((resp) => resp.json()), + })), + })) + + // supports queryFn using fetch() to return Promise - array literal + useQueries(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => + fetch('return Promise').then((resp) => resp.json()), + }, + ], + })) + } + }) + + it('should handle strongly typed queryFn factories and useQueries wrappers', () => { + // QueryKey + queryFn factory + type QueryKeyA = ['queryA'] + const getQueryKeyA = (): QueryKeyA => ['queryA'] + type GetQueryFunctionA = () => QueryFunction + const getQueryFunctionA: GetQueryFunctionA = () => () => { + return 1 + } + type SelectorA = (data: number) => [number, string] + const getSelectorA = (): SelectorA => (data) => [data, data.toString()] + + type QueryKeyB = ['queryB', string] + const getQueryKeyB = (id: string): QueryKeyB => ['queryB', id] + type GetQueryFunctionB = () => QueryFunction + const getQueryFunctionB: GetQueryFunctionB = () => () => { + return '1' + } + type SelectorB = (data: string) => [string, number] + const getSelectorB = (): SelectorB => (data) => [data, +data] + + // Wrapper with strongly typed array-parameter + function useWrappedQueries< + TQueryFnData, + TError, + TData, + TQueryKey extends QueryKey, + >(queries: Array>) { + return useQueries(() => ({ + queries: queries.map( + // no need to type the mapped query + (query) => { + const { queryFn: fn, queryKey: key } = query + expectTypeOf(fn).toEqualTypeOf< + | typeof QueryCore.skipToken + | QueryCore.QueryFunction + | undefined + >() + return { + queryKey: key, + queryFn: fn + ? (ctx: QueryFunctionContext) => { + // eslint-disable-next-line vitest/valid-expect + expectTypeOf(ctx.queryKey) + return ( + fn as QueryFunction + ).call({}, ctx) + } + : undefined, + } + }, + ), + })) + } + + // @ts-expect-error (Page component is not rendered) + function Page() { + const result = useQueries(() => ({ + queries: [ + { + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + }, + { + queryKey: getQueryKeyB('id'), + queryFn: getQueryFunctionB(), + }, + ], + })) + expectTypeOf(result[0]).toEqualTypeOf>() + expectTypeOf(result[1]).toEqualTypeOf>() + + const withSelector = useQueries(() => ({ + queries: [ + { + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + select: getSelectorA(), + }, + { + queryKey: getQueryKeyB('id'), + queryFn: getQueryFunctionB(), + select: getSelectorB(), + }, + ], + })) + expectTypeOf(withSelector[0]).toEqualTypeOf< + UseQueryResult<[number, string], Error> + >() + expectTypeOf(withSelector[1]).toEqualTypeOf< + UseQueryResult<[string, number], Error> + >() + + const withWrappedQueries = useWrappedQueries( + Array(10).map(() => ({ + queryKey: getQueryKeyA(), + queryFn: getQueryFunctionA(), + select: getSelectorA(), + })), + ) + + expectTypeOf(withWrappedQueries).toEqualTypeOf< + Array> + >() + } + }) + }) }) diff --git a/packages/solid-query/src/__tests__/useQueries.test.tsx b/packages/solid-query/src/__tests__/useQueries.test.tsx index 6ce1a9a5879..acc344782f9 100644 --- a/packages/solid-query/src/__tests__/useQueries.test.tsx +++ b/packages/solid-query/src/__tests__/useQueries.test.tsx @@ -1,12 +1,4 @@ -import { - afterEach, - beforeEach, - describe, - expect, - expectTypeOf, - it, - vi, -} from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { fireEvent, render } from '@solidjs/testing-library' import * as QueryCore from '@tanstack/query-core' import { createRenderEffect, createSignal } from 'solid-js' @@ -19,13 +11,7 @@ import { useQueries, } from '..' import { renderWithClient } from './utils' -import type { - QueryFunction, - QueryFunctionContext, - QueryKey, - QueryOptions, - UseQueryResult, -} from '..' +import type { UseQueryResult } from '..' describe('useQueries', () => { let queryCache: QueryCache @@ -86,583 +72,6 @@ describe('useQueries', () => { expect(results[2]).toMatchObject([{ data: 1 }, { data: 2 }]) }) - it('handles type parameter - tuple of tuples', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result1 = useQueries< - [[number], [string], [Array, boolean]] - >(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - }, - ], - })) - expectTypeOf(result1[0]).toEqualTypeOf>() - expectTypeOf(result1[1]).toEqualTypeOf>() - expectTypeOf(result1[2]).toEqualTypeOf< - UseQueryResult, boolean> - >() - expectTypeOf(result1[0].data).toEqualTypeOf() - expectTypeOf(result1[1].data).toEqualTypeOf() - expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() - expectTypeOf(result1[2].error).toEqualTypeOf() - - // TData (3rd element) takes precedence over TQueryFnData (1st element) - const result2 = useQueries< - [[string, unknown, string], [string, unknown, number]] - >(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - }, - ], - })) - expectTypeOf(result2[0]).toEqualTypeOf>() - expectTypeOf(result2[1]).toEqualTypeOf>() - expectTypeOf(result2[0].data).toEqualTypeOf() - expectTypeOf(result2[1].data).toEqualTypeOf() - - // types should be enforced - useQueries<[[string, unknown, string], [string, boolean, number]]>( - () => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - ], - }), - ) - - // field names should be enforced - useQueries<[[string]]>(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - }, - ], - })) - } - }) - - it('handles type parameter - tuple of objects', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result1 = useQueries< - [ - { queryFnData: number }, - { queryFnData: string }, - { queryFnData: Array; error: boolean }, - ] - >(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - }, - ], - })) - expectTypeOf(result1[0]).toEqualTypeOf>() - expectTypeOf(result1[1]).toEqualTypeOf>() - expectTypeOf(result1[2]).toEqualTypeOf< - UseQueryResult, boolean> - >() - expectTypeOf(result1[0].data).toEqualTypeOf() - expectTypeOf(result1[1].data).toEqualTypeOf() - expectTypeOf(result1[2].data).toEqualTypeOf | undefined>() - expectTypeOf(result1[2].error).toEqualTypeOf() - - // TData (data prop) takes precedence over TQueryFnData (queryFnData prop) - const result2 = useQueries< - [ - { queryFnData: string; data: string }, - { queryFnData: string; data: number }, - ] - >(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - }, - ], - })) - expectTypeOf(result2[0]).toEqualTypeOf>() - expectTypeOf(result2[1]).toEqualTypeOf>() - expectTypeOf(result2[0].data).toEqualTypeOf() - expectTypeOf(result2[1].data).toEqualTypeOf() - - // can pass only TData (data prop) although TQueryFnData will be left unknown - const result3 = useQueries<[{ data: string }, { data: number }]>(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a as string - }, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a as number - }, - }, - ], - })) - expectTypeOf(result3[0]).toEqualTypeOf>() - expectTypeOf(result3[1]).toEqualTypeOf>() - expectTypeOf(result3[0].data).toEqualTypeOf() - expectTypeOf(result3[1].data).toEqualTypeOf() - - // types should be enforced - useQueries< - [ - { queryFnData: string; data: string }, - { queryFnData: string; data: number; error: boolean }, - ] - >(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return a.toLowerCase() - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 'string', - select: (a) => { - expectTypeOf(a).toEqualTypeOf() - return parseInt(a) - }, - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - ], - })) - - // field names should be enforced - useQueries<[{ queryFnData: string }]>(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - }, - ], - })) - } - }) - - it('handles array literal without type parameter to infer result type', () => { - const key1 = queryKey() - const key2 = queryKey() - const key3 = queryKey() - const key4 = queryKey() - - // @ts-expect-error (Page component is not rendered) - function Page() { - // Array.map preserves TQueryFnData - const result1 = useQueries(() => ({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - })), - })) - expectTypeOf(result1).toEqualTypeOf< - Array> - >() - if (result1[0]) { - expectTypeOf(result1[0].data).toEqualTypeOf() - } - - // Array.map preserves TData - const result2 = useQueries(() => ({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - })) - expectTypeOf(result2).toEqualTypeOf< - Array> - >() - - const result3 = useQueries(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 1, - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key3, - queryFn: () => ['string[]'], - select: () => 123, - }, - ], - })) - expectTypeOf(result3[0]).toEqualTypeOf>() - expectTypeOf(result3[1]).toEqualTypeOf>() - expectTypeOf(result3[2]).toEqualTypeOf>() - expectTypeOf(result3[0].data).toEqualTypeOf() - expectTypeOf(result3[1].data).toEqualTypeOf() - // select takes precedence over queryFn - expectTypeOf(result3[2].data).toEqualTypeOf() - - // initialData/placeholderData are enforced - useQueries(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - placeholderData: 'string', - // @ts-expect-error (initialData: string) - initialData: 123, - }, - { - queryKey: key2, - queryFn: () => 123, - // @ts-expect-error (placeholderData: number) - placeholderData: 'string', - initialData: 123, - }, - ], - })) - - // select params are "indirectly" enforced - useQueries(() => ({ - queries: [ - // unfortunately TS will not suggest the type for you - { - queryKey: key1, - queryFn: () => 'string', - }, - // however you can add a type to the callback - { - queryKey: key2, - queryFn: () => 'string', - }, - // the type you do pass is enforced - { - queryKey: key3, - queryFn: () => 'string', - }, - { - queryKey: key4, - queryFn: () => 'string', - select: (a: string) => parseInt(a), - }, - ], - })) - - // callbacks are also indirectly enforced with Array.map - useQueries(() => ({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - })) - - useQueries(() => ({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => i + 10, - select: (data: number) => data.toString(), - })), - })) - - // results inference works when all the handlers are defined - const result4 = useQueries(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - }, - { - queryKey: key2, - queryFn: () => 'string', - }, - { - queryKey: key4, - queryFn: () => 'string', - select: (a: string) => parseInt(a), - }, - ], - })) - expectTypeOf(result4[0]).toEqualTypeOf>() - expectTypeOf(result4[1]).toEqualTypeOf>() - expectTypeOf(result4[2]).toEqualTypeOf>() - - // handles when queryFn returns a Promise - const result5 = useQueries(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => Promise.resolve('string'), - }, - ], - })) - expectTypeOf(result5[0]).toEqualTypeOf>() - - // Array as const does not throw error - const result6 = useQueries( - () => - ({ - queries: [ - { - queryKey: ['key1'], - queryFn: () => 'string', - }, - { - queryKey: ['key1'], - queryFn: () => 123, - }, - ], - }) as const, - ) - expectTypeOf(result6[0]).toEqualTypeOf>() - expectTypeOf(result6[1]).toEqualTypeOf>() - - // field names should be enforced - array literal - useQueries(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - }, - ], - })) - - // field names should be enforced - Array.map() result - useQueries(() => ({ - // @ts-expect-error (invalidField) - queries: Array(10).map(() => ({ - someInvalidField: '', - })), - })) - - // field names should be enforced - array literal - useQueries(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => 'string', - }, - ], - })) - - // supports queryFn using fetch() to return Promise - Array.map() result - useQueries(() => ({ - queries: Array(50).map((_, i) => ({ - queryKey: ['key', i] as const, - queryFn: () => - fetch('return Promise').then((resp) => resp.json()), - })), - })) - - // supports queryFn using fetch() to return Promise - array literal - useQueries(() => ({ - queries: [ - { - queryKey: key1, - queryFn: () => - fetch('return Promise').then((resp) => resp.json()), - }, - ], - })) - } - }) - - it('handles strongly typed queryFn factories and useQueries wrappers', () => { - // QueryKey + queryFn factory - type QueryKeyA = ['queryA'] - const getQueryKeyA = (): QueryKeyA => ['queryA'] - type GetQueryFunctionA = () => QueryFunction - const getQueryFunctionA: GetQueryFunctionA = () => () => { - return 1 - } - type SelectorA = (data: number) => [number, string] - const getSelectorA = (): SelectorA => (data) => [data, data.toString()] - - type QueryKeyB = ['queryB', string] - const getQueryKeyB = (id: string): QueryKeyB => ['queryB', id] - type GetQueryFunctionB = () => QueryFunction - const getQueryFunctionB: GetQueryFunctionB = () => () => { - return '1' - } - type SelectorB = (data: string) => [string, number] - const getSelectorB = (): SelectorB => (data) => [data, +data] - - // Wrapper with strongly typed array-parameter - function useWrappedQueries< - TQueryFnData, - TError, - TData, - TQueryKey extends QueryKey, - >(queries: Array>) { - return useQueries(() => ({ - queries: queries.map( - // no need to type the mapped query - (query) => { - const { queryFn: fn, queryKey: key } = query - expectTypeOf(fn).toEqualTypeOf< - | typeof QueryCore.skipToken - | QueryCore.QueryFunction - | undefined - >() - return { - queryKey: key, - queryFn: fn - ? (ctx: QueryFunctionContext) => { - // eslint-disable-next-line vitest/valid-expect - expectTypeOf(ctx.queryKey) - return (fn as QueryFunction).call( - {}, - ctx, - ) - } - : undefined, - } - }, - ), - })) - } - - // @ts-expect-error (Page component is not rendered) - function Page() { - const result = useQueries(() => ({ - queries: [ - { - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - }, - { - queryKey: getQueryKeyB('id'), - queryFn: getQueryFunctionB(), - }, - ], - })) - expectTypeOf(result[0]).toEqualTypeOf>() - expectTypeOf(result[1]).toEqualTypeOf>() - - const withSelector = useQueries(() => ({ - queries: [ - { - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - select: getSelectorA(), - }, - { - queryKey: getQueryKeyB('id'), - queryFn: getQueryFunctionB(), - select: getSelectorB(), - }, - ], - })) - expectTypeOf(withSelector[0]).toEqualTypeOf< - UseQueryResult<[number, string], Error> - >() - expectTypeOf(withSelector[1]).toEqualTypeOf< - UseQueryResult<[string, number], Error> - >() - - const withWrappedQueries = useWrappedQueries( - Array(10).map(() => ({ - queryKey: getQueryKeyA(), - queryFn: getQueryFunctionA(), - select: getSelectorA(), - })), - ) - - expectTypeOf(withWrappedQueries).toEqualTypeOf< - Array> - >() - } - }) - // eslint-disable-next-line vitest/expect-expect it('should not change state if unmounted', async () => { const key1 = queryKey() From 84dbefa5d7d73d193e6887e714b55cb18eb0c506 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 16 Jun 2026 17:33:21 +0900 Subject: [PATCH 03/97] test(solid-query/useQuery): move type-only test to 'useQuery.test-d.tsx' (#10960) * test(solid-query/useQuery): move type-only test to 'useQuery.test-d.tsx' * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../src/__tests__/useQuery.test-d.tsx | 152 ++++++++++++++++ .../src/__tests__/useQuery.test.tsx | 166 +----------------- 2 files changed, 153 insertions(+), 165 deletions(-) diff --git a/packages/solid-query/src/__tests__/useQuery.test-d.tsx b/packages/solid-query/src/__tests__/useQuery.test-d.tsx index 64eaa5eb694..08fb3f17bc2 100644 --- a/packages/solid-query/src/__tests__/useQuery.test-d.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test-d.tsx @@ -1,8 +1,160 @@ import { describe, expectTypeOf, it } from 'vitest' import { queryKey } from '@tanstack/query-test-utils' import { queryOptions, useQuery } from '../index' +import type { OmitKeyof, QueryFunction, UseQueryOptions } from '..' describe('useQuery', () => { + const key = queryKey() + + // unspecified query function should default to unknown + const noQueryFn = useQuery(() => ({ queryKey: key })) + expectTypeOf(noQueryFn.data).toEqualTypeOf() + expectTypeOf(noQueryFn.error).toEqualTypeOf() + + // it should infer the result type from the query function + const fromQueryFn = useQuery(() => ({ + queryKey: key, + queryFn: () => 'test', + })) + expectTypeOf(fromQueryFn.data).toEqualTypeOf() + expectTypeOf(fromQueryFn.error).toEqualTypeOf() + + // it should be possible to specify the result type + const withResult = useQuery(() => ({ + queryKey: key, + queryFn: () => 'test', + })) + expectTypeOf(withResult.data).toEqualTypeOf() + expectTypeOf(withResult.error).toEqualTypeOf() + + // it should be possible to specify the error type + const withError = useQuery(() => ({ + queryKey: key, + queryFn: () => 'test', + })) + expectTypeOf(withError.data).toEqualTypeOf() + expectTypeOf(withError.error).toEqualTypeOf() + + // it should provide the result type in the configuration + useQuery(() => ({ + queryKey: [key], + queryFn: () => true, + })) + + // it should be possible to specify a union type as result type + const unionTypeSync = useQuery(() => ({ + queryKey: key, + queryFn: () => (Math.random() > 0.5 ? ('a' as const) : ('b' as const)), + })) + expectTypeOf(unionTypeSync.data).toEqualTypeOf<'a' | 'b' | undefined>() + const unionTypeAsync = useQuery<'a' | 'b'>(() => ({ + queryKey: key, + queryFn: () => Promise.resolve(Math.random() > 0.5 ? 'a' : 'b'), + })) + expectTypeOf(unionTypeAsync.data).toEqualTypeOf<'a' | 'b' | undefined>() + + // should error when the query function result does not match with the specified type + // @ts-expect-error + useQuery(() => ({ queryKey: key, queryFn: () => 'test' })) + + // it should infer the result type from a generic query function + function queryFn(): Promise { + return Promise.resolve({} as T) + } + + const fromGenericQueryFn = useQuery(() => ({ + queryKey: key, + queryFn: () => queryFn(), + })) + expectTypeOf(fromGenericQueryFn.data).toEqualTypeOf() + expectTypeOf(fromGenericQueryFn.error).toEqualTypeOf() + + const fromGenericOptionsQueryFn = useQuery(() => ({ + queryKey: key, + queryFn: () => queryFn(), + })) + expectTypeOf(fromGenericOptionsQueryFn.data).toEqualTypeOf< + string | undefined + >() + expectTypeOf(fromGenericOptionsQueryFn.error).toEqualTypeOf() + + type MyData = number + type MyQueryKey = readonly ['my-data', number] + + const getMyDataArrayKey: QueryFunction = ({ + queryKey: [, n], + }) => { + return n + 42 + } + + useQuery(() => ({ + queryKey: ['my-data', 100] as const, + queryFn: getMyDataArrayKey, + })) + + const getMyDataStringKey: QueryFunction = (context) => { + expectTypeOf(context.queryKey).toEqualTypeOf<['1']>() + return Number(context.queryKey[0]) + 42 + } + + useQuery(() => ({ + queryKey: ['1'] as ['1'], + queryFn: getMyDataStringKey, + })) + + // it should handle query-functions that return Promise + useQuery(() => ({ + queryKey: key, + queryFn: () => fetch('return Promise').then((resp) => resp.json()), + })) + + // handles wrapped queries with custom fetcher passed as inline queryFn + const useWrappedQuery = < + TQueryKey extends [string, Record?], + TQueryFnData, + TError, + TData = TQueryFnData, + >( + qk: TQueryKey, + fetcher: ( + obj: TQueryKey[1], + token: string, + // return type must be wrapped with TQueryFnReturn + ) => Promise, + options?: OmitKeyof< + UseQueryOptions, + 'queryKey' | 'queryFn' | 'initialData', + 'safely' + >, + ) => + useQuery(() => ({ + queryKey: qk, + queryFn: () => fetcher(qk[1], 'token'), + ...options, + })) + const test = useWrappedQuery([''], () => Promise.resolve('1')) + expectTypeOf(test.data).toEqualTypeOf() + + // handles wrapped queries with custom fetcher passed directly to useQuery + const useWrappedFuncStyleQuery = < + TQueryKey extends [string, Record?], + TQueryFnData, + TError, + TData = TQueryFnData, + >( + qk: TQueryKey, + fetcher: () => Promise, + options?: OmitKeyof< + UseQueryOptions, + 'queryKey' | 'queryFn' | 'initialData', + 'safely' + >, + ) => useQuery(() => ({ queryKey: qk, queryFn: fetcher, ...options })) + const testFuncStyle = useWrappedFuncStyleQuery([''], () => + Promise.resolve(true), + ) + expectTypeOf(testFuncStyle.data).toEqualTypeOf() + describe('initialData', () => { describe('Config object overload', () => { it('TData should always be defined when initialData is provided as an object', () => { diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 6eb755a89cb..6c999d10b6d 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -37,13 +37,7 @@ import { renderWithClient, setActTimeout, } from './utils' -import type { - DefinedUseQueryResult, - OmitKeyof, - QueryFunction, - UseQueryOptions, - UseQueryResult, -} from '..' +import type { DefinedUseQueryResult, QueryFunction, UseQueryResult } from '..' import type { Mock } from 'vitest' import type { JSX } from 'solid-js' @@ -62,164 +56,6 @@ describe('useQuery', () => { vi.useRealTimers() }) - it('should return the correct types', () => { - const key = queryKey() - - // @ts-expect-error - function Page() { - // unspecified query function should default to unknown - const noQueryFn = useQuery(() => ({ queryKey: key })) - expectTypeOf(noQueryFn.data).toEqualTypeOf() - expectTypeOf(noQueryFn.error).toEqualTypeOf() - - // it should infer the result type from the query function - const fromQueryFn = useQuery(() => ({ - queryKey: key, - queryFn: () => 'test', - })) - expectTypeOf(fromQueryFn.data).toEqualTypeOf() - expectTypeOf(fromQueryFn.error).toEqualTypeOf() - - // it should be possible to specify the result type - const withResult = useQuery(() => ({ - queryKey: key, - queryFn: () => 'test', - })) - expectTypeOf(withResult.data).toEqualTypeOf() - expectTypeOf(withResult.error).toEqualTypeOf() - - // it should be possible to specify the error type - const withError = useQuery(() => ({ - queryKey: key, - queryFn: () => 'test', - })) - expectTypeOf(withError.data).toEqualTypeOf() - expectTypeOf(withError.error).toEqualTypeOf() - - // it should provide the result type in the configuration - useQuery(() => ({ - queryKey: [key], - queryFn: () => true, - })) - - // it should be possible to specify a union type as result type - const unionTypeSync = useQuery(() => ({ - queryKey: key, - queryFn: () => (Math.random() > 0.5 ? ('a' as const) : ('b' as const)), - })) - expectTypeOf(unionTypeSync.data).toEqualTypeOf<'a' | 'b' | undefined>() - const unionTypeAsync = useQuery<'a' | 'b'>(() => ({ - queryKey: key, - queryFn: () => Promise.resolve(Math.random() > 0.5 ? 'a' : 'b'), - })) - expectTypeOf(unionTypeAsync.data).toEqualTypeOf<'a' | 'b' | undefined>() - - // should error when the query function result does not match with the specified type - // @ts-expect-error - useQuery(() => ({ queryKey: key, queryFn: () => 'test' })) - - // it should infer the result type from a generic query function - function queryFn(): Promise { - return Promise.resolve({} as T) - } - - const fromGenericQueryFn = useQuery(() => ({ - queryKey: key, - queryFn: () => queryFn(), - })) - expectTypeOf(fromGenericQueryFn.data).toEqualTypeOf() - expectTypeOf(fromGenericQueryFn.error).toEqualTypeOf() - - const fromGenericOptionsQueryFn = useQuery(() => ({ - queryKey: key, - queryFn: () => queryFn(), - })) - expectTypeOf(fromGenericOptionsQueryFn.data).toEqualTypeOf< - string | undefined - >() - expectTypeOf( - fromGenericOptionsQueryFn.error, - ).toEqualTypeOf() - - type MyData = number - type MyQueryKey = readonly ['my-data', number] - - const getMyDataArrayKey: QueryFunction = ({ - queryKey: [, n], - }) => { - return n + 42 - } - - useQuery(() => ({ - queryKey: ['my-data', 100] as const, - queryFn: getMyDataArrayKey, - })) - - const getMyDataStringKey: QueryFunction = (context) => { - expectTypeOf(context.queryKey).toEqualTypeOf<['1']>() - return Number(context.queryKey[0]) + 42 - } - - useQuery(() => ({ - queryKey: ['1'] as ['1'], - queryFn: getMyDataStringKey, - })) - - // it should handle query-functions that return Promise - useQuery(() => ({ - queryKey: key, - queryFn: () => fetch('return Promise').then((resp) => resp.json()), - })) - - // handles wrapped queries with custom fetcher passed as inline queryFn - const useWrappedQuery = < - TQueryKey extends [string, Record?], - TQueryFnData, - TError, - TData = TQueryFnData, - >( - qk: TQueryKey, - fetcher: ( - obj: TQueryKey[1], - token: string, - // return type must be wrapped with TQueryFnReturn - ) => Promise, - options?: OmitKeyof< - UseQueryOptions, - 'queryKey' | 'queryFn' | 'initialData', - 'safely' - >, - ) => - useQuery(() => ({ - queryKey: qk, - queryFn: () => fetcher(qk[1], 'token'), - ...options, - })) - const test = useWrappedQuery([''], () => Promise.resolve('1')) - expectTypeOf(test.data).toEqualTypeOf() - - // handles wrapped queries with custom fetcher passed directly to useQuery - const useWrappedFuncStyleQuery = < - TQueryKey extends [string, Record?], - TQueryFnData, - TError, - TData = TQueryFnData, - >( - qk: TQueryKey, - fetcher: () => Promise, - options?: OmitKeyof< - UseQueryOptions, - 'queryKey' | 'queryFn' | 'initialData', - 'safely' - >, - ) => useQuery(() => ({ queryKey: qk, queryFn: fetcher, ...options })) - const testFuncStyle = useWrappedFuncStyleQuery([''], () => - Promise.resolve(true), - ) - expectTypeOf(testFuncStyle.data).toEqualTypeOf() - } - }) - // See https://github.com/tannerlinsley/react-query/issues/105 it('should allow to set default data value', async () => { const key = queryKey() From 18d45046d9c837ad2d2a0fcaaf16fba436922069 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Tue, 16 Jun 2026 17:44:01 +0900 Subject: [PATCH 04/97] test(solid-query/useQuery): add type test for generic indexed-access 'TData' regression guard (#10961) --- .../src/__tests__/useQuery.test-d.tsx | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/packages/solid-query/src/__tests__/useQuery.test-d.tsx b/packages/solid-query/src/__tests__/useQuery.test-d.tsx index 08fb3f17bc2..278f4710b87 100644 --- a/packages/solid-query/src/__tests__/useQuery.test-d.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test-d.tsx @@ -250,4 +250,52 @@ describe('useQuery', () => { }) }) }) + + describe('generic indexed access TData', () => { + // https://github.com/TanStack/query/issues/9937 + it('should be assignable back to its source indexed type when passed to a generic function parameter', () => { + enum DataType { + Account = 'account', + Product = 'product', + } + + interface Account { + name: string + } + interface Product { + code: string + } + + type DataTypeToEntity = { + [DataType.Account]: Account + [DataType.Product]: Product + } + + const getData = ( + _dataType: TDataType, + ): Promise => + Promise.resolve({} as DataTypeToEntity[TDataType]) + + const getLabel = ( + _dataType: TDataType, + _data: DataTypeToEntity[TDataType], + ) => 'test' + + function Test(props: { + dataType: TDataType + }) { + const { data } = useQuery(() => ({ + queryKey: ['test'], + queryFn: () => getData(props.dataType), + })) + + // Regression guard: this call must compile. With the previous + // hand-rolled NoInfer, `data` failed to flow back into the generic + // indexed-access parameter `DataTypeToEntity[TDataType]`. + return data ? getLabel(props.dataType, data) : null + } + + expectTypeOf(Test).toBeFunction() + }) + }) }) From 835a299cead89b60591b1c0fc00181a48156a9ad Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 17 Jun 2026 19:43:02 +0900 Subject: [PATCH 05/97] test(vue-query/useMutation): replace 'vi.waitFor' with 'vi.advanceTimersByTimeAsync' in async 'mutateAsync' tests (#10966) --- .../vue-query/src/__tests__/useMutation.test.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index e8102608f69..7a37a7cff52 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -356,9 +356,11 @@ describe('useMutation', () => { mutationFn: (params: string) => sleep(10).then(() => params), }) - await vi.waitFor(() => - expect(mutation.mutateAsync(result)).resolves.toBe(result), - ) + const promise = mutation.mutateAsync(result) + + await vi.advanceTimersByTimeAsync(10) + + await expect(promise).resolves.toBe(result) expect(mutation).toMatchObject({ isIdle: { value: false }, @@ -376,9 +378,10 @@ describe('useMutation', () => { sleep(10).then(() => Promise.reject(new Error('Some error'))), }) - await vi.waitFor(() => + await Promise.all([ expect(mutation.mutateAsync()).rejects.toThrow('Some error'), - ) + vi.advanceTimersByTimeAsync(10), + ]) expect(mutation).toMatchObject({ isIdle: { value: false }, From a7b783a5ed5451dac44b8062b596e8a5f69ddcdc Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 17 Jun 2026 19:50:09 +0900 Subject: [PATCH 06/97] test(vue-query): replace deprecated 'toBeCalledWith' with 'toHaveBeenCalledWith' (#10968) --- packages/vue-query/src/__tests__/useQuery.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/__tests__/useQuery.test.ts b/packages/vue-query/src/__tests__/useQuery.test.ts index 2f05080f917..d794c97c2b1 100644 --- a/packages/vue-query/src/__tests__/useQuery.test.ts +++ b/packages/vue-query/src/__tests__/useQuery.test.ts @@ -34,7 +34,7 @@ describe('useQuery', () => { staleTime: 1000, }) - expect(useBaseQuery).toBeCalledWith( + expect(useBaseQuery).toHaveBeenCalledWith( QueryObserver, { queryKey: key, From 0bed37a91efa1b6e84b192ca3629d6e0c6cfcb73 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 17 Jun 2026 19:52:08 +0900 Subject: [PATCH 07/97] test(query-core): replace deprecated 'toBeCalledWith' and 'toBeCalledTimes' with 'toHaveBeenCalledWith' and 'toHaveBeenCalledTimes' (#10967) --- .../src/__tests__/infiniteQueryObserver.test.tsx | 10 +++++----- .../query-core/src/__tests__/mutationObserver.test.tsx | 8 ++++---- .../query-core/src/__tests__/queriesObserver.test.tsx | 4 ++-- packages/query-core/src/__tests__/query.test.tsx | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx b/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx index 99c00e37d22..ad560cba801 100644 --- a/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx +++ b/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx @@ -70,7 +70,7 @@ describe('InfiniteQueryObserver', () => { expect(observerResult).toMatchObject({ data: { pages: ['1'], pageParams: [1] }, }) - expect(queryFn).toBeCalledWith(expect.objectContaining({ meta })) + expect(queryFn).toHaveBeenCalledWith(expect.objectContaining({ meta })) }) it('should make getNextPageParam and getPreviousPageParam receive current pageParams', async () => { @@ -162,7 +162,7 @@ describe('InfiniteQueryObserver', () => { await vi.advanceTimersByTimeAsync(10) expect(observer.getCurrentResult().data?.pages).toEqual(['1', '2']) - expect(queryFn).toBeCalledTimes(2) + expect(queryFn).toHaveBeenCalledTimes(2) expect(observer.getCurrentResult().hasNextPage).toBe(true) next = undefined @@ -171,7 +171,7 @@ describe('InfiniteQueryObserver', () => { await vi.advanceTimersByTimeAsync(10) expect(observer.getCurrentResult().data?.pages).toEqual(['1']) - expect(queryFn).toBeCalledTimes(3) + expect(queryFn).toHaveBeenCalledTimes(3) expect(observer.getCurrentResult().hasNextPage).toBe(false) }) @@ -194,7 +194,7 @@ describe('InfiniteQueryObserver', () => { await vi.advanceTimersByTimeAsync(10) expect(observer.getCurrentResult().data?.pages).toEqual(['1', '2']) - expect(queryFn).toBeCalledTimes(2) + expect(queryFn).toHaveBeenCalledTimes(2) expect(observer.getCurrentResult().hasNextPage).toBe(true) next = null @@ -203,7 +203,7 @@ describe('InfiniteQueryObserver', () => { await vi.advanceTimersByTimeAsync(10) expect(observer.getCurrentResult().data?.pages).toEqual(['1']) - expect(queryFn).toBeCalledTimes(3) + expect(queryFn).toHaveBeenCalledTimes(3) expect(observer.getCurrentResult().hasNextPage).toBe(false) }) diff --git a/packages/query-core/src/__tests__/mutationObserver.test.tsx b/packages/query-core/src/__tests__/mutationObserver.test.tsx index 59cb4ebce81..7c72e21e40c 100644 --- a/packages/query-core/src/__tests__/mutationObserver.test.tsx +++ b/packages/query-core/src/__tests__/mutationObserver.test.tsx @@ -31,12 +31,12 @@ describe('mutationObserver', () => { unsubscribe1() - expect(subscription1Handler).toBeCalledTimes(1) - expect(subscription2Handler).toBeCalledTimes(1) + expect(subscription1Handler).toHaveBeenCalledTimes(1) + expect(subscription2Handler).toHaveBeenCalledTimes(1) await vi.advanceTimersByTimeAsync(20) - expect(subscription1Handler).toBeCalledTimes(1) - expect(subscription2Handler).toBeCalledTimes(2) + expect(subscription1Handler).toHaveBeenCalledTimes(1) + expect(subscription2Handler).toHaveBeenCalledTimes(2) unsubscribe2() }) diff --git a/packages/query-core/src/__tests__/queriesObserver.test.tsx b/packages/query-core/src/__tests__/queriesObserver.test.tsx index 1adfa6195a6..6b9c6ee8c2c 100644 --- a/packages/query-core/src/__tests__/queriesObserver.test.tsx +++ b/packages/query-core/src/__tests__/queriesObserver.test.tsx @@ -311,9 +311,9 @@ describe('queriesObserver', () => { await vi.advanceTimersByTimeAsync(20) // 1 call: pending - expect(subscription1Handler).toBeCalledTimes(1) + expect(subscription1Handler).toHaveBeenCalledTimes(1) // 1 call: success - expect(subscription2Handler).toBeCalledTimes(1) + expect(subscription2Handler).toHaveBeenCalledTimes(1) // Clean-up unsubscribe2() diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index 192abac6b8a..f097a11ef7d 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -738,7 +738,7 @@ describe('query', () => { await queryClient.prefetchQuery({ queryKey: key, queryFn, meta }) - expect(queryFn).toBeCalledWith( + expect(queryFn).toHaveBeenCalledWith( expect.objectContaining({ meta, }), From 4f11927ac5f3841984389a07587ee2ae1e0abfbb Mon Sep 17 00:00:00 2001 From: dfedoryshchev <64079946+dfedoryshchev@users.noreply.github.com> Date: Fri, 19 Jun 2026 12:43:35 +0100 Subject: [PATCH 08/97] docs(angular-query): fix "allows to" grammar in JSDoc comments (#10890) --- .../src/infinite-query-options.ts | 8 ++++---- .../angular-query-experimental/src/mutation-options.ts | 4 ++-- packages/angular-query-experimental/src/providers.ts | 4 ++-- packages/angular-query-experimental/src/query-options.ts | 8 ++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/angular-query-experimental/src/infinite-query-options.ts b/packages/angular-query-experimental/src/infinite-query-options.ts index fc18c0e94dc..0bed440730b 100644 --- a/packages/angular-query-experimental/src/infinite-query-options.ts +++ b/packages/angular-query-experimental/src/infinite-query-options.ts @@ -79,7 +79,7 @@ export type DefinedInitialDataInfiniteOptions< } /** - * Allows to share and re-use infinite query options in a type-safe way. + * Allows sharing and re-using infinite query options in a type-safe way. * * The `queryKey` will be tagged with the type from `queryFn`. * @param options - The infinite query options to tag with the type from `queryFn`. @@ -110,7 +110,7 @@ export function infiniteQueryOptions< } /** - * Allows to share and re-use infinite query options in a type-safe way. + * Allows sharing and re-using infinite query options in a type-safe way. * * The `queryKey` will be tagged with the type from `queryFn`. * @param options - The infinite query options to tag with the type from `queryFn`. @@ -141,7 +141,7 @@ export function infiniteQueryOptions< } /** - * Allows to share and re-use infinite query options in a type-safe way. + * Allows sharing and re-using infinite query options in a type-safe way. * * The `queryKey` will be tagged with the type from `queryFn`. * @param options - The infinite query options to tag with the type from `queryFn`. @@ -172,7 +172,7 @@ export function infiniteQueryOptions< } /** - * Allows to share and re-use infinite query options in a type-safe way. + * Allows sharing and re-using infinite query options in a type-safe way. * * The `queryKey` will be tagged with the type from `queryFn`. * @param options - The infinite query options to tag with the type from `queryFn`. diff --git a/packages/angular-query-experimental/src/mutation-options.ts b/packages/angular-query-experimental/src/mutation-options.ts index ef0c2cc8b26..de59b994296 100644 --- a/packages/angular-query-experimental/src/mutation-options.ts +++ b/packages/angular-query-experimental/src/mutation-options.ts @@ -2,7 +2,7 @@ import type { DefaultError, WithRequired } from '@tanstack/query-core' import type { CreateMutationOptions } from './types' /** - * Allows to share and re-use mutation options in a type-safe way. + * Allows sharing and re-using mutation options in a type-safe way. * * **Example** * @@ -66,7 +66,7 @@ export function mutationOptions< > /** - * Allows to share and re-use mutation options in a type-safe way. + * Allows sharing and re-using mutation options in a type-safe way. * * **Example** * diff --git a/packages/angular-query-experimental/src/providers.ts b/packages/angular-query-experimental/src/providers.ts index 076d76d0c34..7d17f93e984 100644 --- a/packages/angular-query-experimental/src/providers.ts +++ b/packages/angular-query-experimental/src/providers.ts @@ -32,7 +32,7 @@ export function provideQueryClient( /** * Sets up providers necessary to enable TanStack Query functionality for Angular applications. * - * Allows to configure a `QueryClient` and optional features such as developer tools. + * Allows configuring a `QueryClient` and optional features such as developer tools. * * **Example - standalone** * @@ -115,7 +115,7 @@ export function provideTanStackQuery( /** * Sets up providers necessary to enable TanStack Query functionality for Angular applications. * - * Allows to configure a `QueryClient`. + * Allows configuring a `QueryClient`. * @param queryClient - A `QueryClient` instance. * @returns A set of providers to set up TanStack Query. * @see https://tanstack.com/query/v5/docs/framework/angular/quick-start diff --git a/packages/angular-query-experimental/src/query-options.ts b/packages/angular-query-experimental/src/query-options.ts index 069472b9032..14a50074b06 100644 --- a/packages/angular-query-experimental/src/query-options.ts +++ b/packages/angular-query-experimental/src/query-options.ts @@ -53,7 +53,7 @@ export type DefinedInitialDataOptions< } /** - * Allows to share and re-use query options in a type-safe way. + * Allows sharing and re-using query options in a type-safe way. * * The `queryKey` will be tagged with the type from `queryFn`. * @@ -85,7 +85,7 @@ export function queryOptions< } /** - * Allows to share and re-use query options in a type-safe way. + * Allows sharing and re-using query options in a type-safe way. * * The `queryKey` will be tagged with the type from `queryFn`. * @@ -117,7 +117,7 @@ export function queryOptions< } /** - * Allows to share and re-use query options in a type-safe way. + * Allows sharing and re-using query options in a type-safe way. * * The `queryKey` will be tagged with the type from `queryFn`. * @@ -149,7 +149,7 @@ export function queryOptions< } /** - * Allows to share and re-use query options in a type-safe way. + * Allows sharing and re-using query options in a type-safe way. * * The `queryKey` will be tagged with the type from `queryFn`. * From 9eff92ed86e284ec0125b3a3539d028688235bd1 Mon Sep 17 00:00:00 2001 From: Dor Alagem Date: Tue, 23 Jun 2026 12:28:35 +0300 Subject: [PATCH 09/97] fix(hydration): set dataUpdatedAt when pending query resolves before hydration (#10610) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(hydration): set dataUpdatedAt when pending query resolves before hydration * test(hydration): add cases for dataUpdatedAt when streamed query resolves before hydration * Add changeset --------- Co-authored-by: Fredrik Höglund --- .changeset/honest-sides-rhyme.md | 5 ++ .../src/__tests__/hydration.test.tsx | 86 +++++++++++++++++++ packages/query-core/src/hydration.ts | 5 ++ 3 files changed, 96 insertions(+) create mode 100644 .changeset/honest-sides-rhyme.md diff --git a/.changeset/honest-sides-rhyme.md b/.changeset/honest-sides-rhyme.md new file mode 100644 index 00000000000..6ef7e7fc889 --- /dev/null +++ b/.changeset/honest-sides-rhyme.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-core': patch +--- + +fix missing `dataUpdatedAt` for streamed queries that resolve before hydration diff --git a/packages/query-core/src/__tests__/hydration.test.tsx b/packages/query-core/src/__tests__/hydration.test.tsx index c64cb10da53..ba643f04368 100644 --- a/packages/query-core/src/__tests__/hydration.test.tsx +++ b/packages/query-core/src/__tests__/hydration.test.tsx @@ -1804,4 +1804,90 @@ describe('dehydration and rehydration', () => { clientQueryClient.clear() serverQueryClient.clear() }) + + it('should set dataUpdatedAt when hydrating a resolved streamed query into a new cache entry', async () => { + const key = queryKey() + + // --- server --- + const serverQueryClient = new QueryClient({ + defaultOptions: { + dehydrate: { shouldDehydrateQuery: () => true }, + }, + }) + + let resolvePrefetch: undefined | ((value?: unknown) => void) + void serverQueryClient.prefetchQuery({ + queryKey: key, + queryFn: () => new Promise((res) => { resolvePrefetch = res }), + }) + + const dehydrated = dehydrate(serverQueryClient) + expect(dehydrated.queries[0]?.state.status).toBe('pending') + + // Resolve before hydration — models a React streaming promise that + // resolved between the dehydrate and hydrate calls + resolvePrefetch?.('streamed data') + // @ts-expect-error + dehydrated.queries[0].promise.then = (cb) => { + cb?.('streamed data') + // @ts-expect-error + return dehydrated.queries[0].promise + } + + // --- client --- + const clientQueryClient = new QueryClient() + hydrate(clientQueryClient, dehydrated) + + const query = clientQueryClient.getQueryCache().find({ queryKey: key })! + expect(query.state.status).toBe('success') + expect(query.state.data).toBe('streamed data') + expect(query.state.dataUpdatedAt).toBeGreaterThan(0) + + clientQueryClient.clear() + serverQueryClient.clear() + }) + + it('should set dataUpdatedAt when hydrating a resolved streamed query into an existing cache entry', async () => { + const key = queryKey() + + // --- server --- + const serverQueryClient = new QueryClient({ + defaultOptions: { + dehydrate: { shouldDehydrateQuery: () => true }, + }, + }) + + let resolvePrefetch: undefined | ((value?: unknown) => void) + void serverQueryClient.prefetchQuery({ + queryKey: key, + queryFn: () => new Promise((res) => { resolvePrefetch = res }), + }) + + const dehydrated = dehydrate(serverQueryClient) + + resolvePrefetch?.('streamed data') + // @ts-expect-error + dehydrated.queries[0].promise.then = (cb) => { + cb?.('streamed data') + // @ts-expect-error + return dehydrated.queries[0].promise + } + + // --- client --- + // Pre-existing stale entry — updatedAt: 0 ensures dehydratedAt wins + const clientQueryClient = new QueryClient() + clientQueryClient.setQueryData(key, 'old data', { updatedAt: 0 }) + + const query = clientQueryClient.getQueryCache().find({ queryKey: key })! + expect(query.state.dataUpdatedAt).toBe(0) + + hydrate(clientQueryClient, dehydrated) + + expect(query.state.status).toBe('success') + expect(query.state.data).toBe('streamed data') + expect(query.state.dataUpdatedAt).toBeGreaterThan(0) + + clientQueryClient.clear() + serverQueryClient.clear() + }) }) diff --git a/packages/query-core/src/hydration.ts b/packages/query-core/src/hydration.ts index 90868dd2623..976b5faafee 100644 --- a/packages/query-core/src/hydration.ts +++ b/packages/query-core/src/hydration.ts @@ -253,6 +253,7 @@ export function hydrate( ...(state.status === 'pending' && data !== undefined && { status: 'success' as const, + dataUpdatedAt: dehydratedAt ?? Date.now(), // Preserve existing fetchStatus if the existing query is actively fetching. ...(!existingQueryIsFetching && { fetchStatus: 'idle' as const, @@ -284,6 +285,10 @@ export function hydrate( state.status === 'pending' && data !== undefined ? 'success' : state.status, + ...(state.status === 'pending' && + data !== undefined && { + dataUpdatedAt: dehydratedAt ?? Date.now(), + }), }, ) } From c28b2f901e55de0b238e91ff80258cac455110ef Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:29:36 +0000 Subject: [PATCH 10/97] ci: apply automated fixes --- packages/query-core/src/__tests__/hydration.test.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/query-core/src/__tests__/hydration.test.tsx b/packages/query-core/src/__tests__/hydration.test.tsx index ba643f04368..0b6cfb7471f 100644 --- a/packages/query-core/src/__tests__/hydration.test.tsx +++ b/packages/query-core/src/__tests__/hydration.test.tsx @@ -1818,7 +1818,10 @@ describe('dehydration and rehydration', () => { let resolvePrefetch: undefined | ((value?: unknown) => void) void serverQueryClient.prefetchQuery({ queryKey: key, - queryFn: () => new Promise((res) => { resolvePrefetch = res }), + queryFn: () => + new Promise((res) => { + resolvePrefetch = res + }), }) const dehydrated = dehydrate(serverQueryClient) @@ -1860,7 +1863,10 @@ describe('dehydration and rehydration', () => { let resolvePrefetch: undefined | ((value?: unknown) => void) void serverQueryClient.prefetchQuery({ queryKey: key, - queryFn: () => new Promise((res) => { resolvePrefetch = res }), + queryFn: () => + new Promise((res) => { + resolvePrefetch = res + }), }) const dehydrated = dehydrate(serverQueryClient) From b80929716f9ae36104245da9d99e8af3550e6f58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 11:57:22 +0200 Subject: [PATCH 11/97] ci: Version Packages (#10977) ci: changeset release Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/honest-sides-rhyme.md | 5 - examples/angular/auto-refetching/package.json | 2 +- examples/angular/basic-persister/package.json | 6 +- examples/angular/basic/package.json | 2 +- examples/angular/devtools-panel/package.json | 2 +- .../package.json | 2 +- .../angular/optimistic-updates/package.json | 2 +- examples/angular/pagination/package.json | 2 +- .../query-options-from-a-service/package.json | 2 +- examples/angular/router/package.json | 2 +- examples/angular/rxjs/package.json | 2 +- examples/angular/simple/package.json | 2 +- examples/lit/basic/package.json | 4 +- examples/lit/pagination/package.json | 4 +- examples/lit/ssr/package.json | 4 +- examples/preact/simple/package.json | 2 +- examples/react/algolia/package.json | 6 +- examples/react/auto-refetching/package.json | 4 +- .../react/basic-graphql-request/package.json | 4 +- examples/react/basic/package.json | 10 +- examples/react/chat/package.json | 4 +- .../react/default-query-function/package.json | 4 +- examples/react/devtools-panel/package.json | 4 +- examples/react/eslint-legacy/package.json | 10 +- .../react/eslint-plugin-demo/package.json | 4 +- .../package.json | 4 +- .../load-more-infinite-scroll/package.json | 4 +- .../react/nextjs-app-prefetching/package.json | 4 +- .../nextjs-suspense-streaming/package.json | 6 +- examples/react/nextjs/package.json | 4 +- examples/react/offline/package.json | 8 +- .../optimistic-updates-cache/package.json | 4 +- .../react/optimistic-updates-ui/package.json | 4 +- examples/react/pagination/package.json | 4 +- examples/react/playground/package.json | 4 +- examples/react/prefetching/package.json | 4 +- examples/react/react-native/package.json | 4 +- examples/react/react-router/package.json | 4 +- examples/react/rick-morty/package.json | 4 +- examples/react/shadow-dom/package.json | 4 +- examples/react/simple/package.json | 4 +- examples/react/star-wars/package.json | 4 +- examples/react/suspense/package.json | 4 +- examples/solid/astro/package.json | 4 +- .../solid/basic-graphql-request/package.json | 4 +- examples/solid/basic/package.json | 4 +- .../solid/default-query-function/package.json | 4 +- examples/solid/offline/package.json | 8 +- examples/solid/simple/package.json | 6 +- .../solid/solid-start-streaming/package.json | 4 +- examples/svelte/auto-refetching/package.json | 4 +- examples/svelte/basic/package.json | 8 +- .../load-more-infinite-scroll/package.json | 4 +- .../svelte/optimistic-updates/package.json | 4 +- examples/svelte/playground/package.json | 4 +- examples/svelte/simple/package.json | 4 +- examples/svelte/ssr/package.json | 4 +- examples/svelte/star-wars/package.json | 4 +- examples/vue/basic/package.json | 4 +- examples/vue/dependent-queries/package.json | 2 +- examples/vue/persister/package.json | 8 +- examples/vue/simple/package.json | 4 +- integrations/angular-cli-20/package.json | 2 +- .../angular-query-experimental/CHANGELOG.md | 7 + .../angular-query-experimental/package.json | 2 +- .../angular-query-persist-client/CHANGELOG.md | 8 + .../angular-query-persist-client/package.json | 2 +- packages/eslint-plugin-query/CHANGELOG.md | 2 + packages/eslint-plugin-query/package.json | 2 +- packages/lit-query/CHANGELOG.md | 7 + packages/lit-query/package.json | 2 +- packages/preact-query-devtools/CHANGELOG.md | 8 + packages/preact-query-devtools/package.json | 2 +- .../preact-query-persist-client/CHANGELOG.md | 8 + .../preact-query-persist-client/package.json | 2 +- packages/preact-query/CHANGELOG.md | 7 + packages/preact-query/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- packages/query-core/CHANGELOG.md | 6 + packages/query-core/package.json | 2 +- packages/query-devtools/CHANGELOG.md | 2 + packages/query-devtools/package.json | 2 +- .../query-persist-client-core/CHANGELOG.md | 7 + .../query-persist-client-core/package.json | 2 +- .../query-sync-storage-persister/CHANGELOG.md | 8 + .../query-sync-storage-persister/package.json | 2 +- packages/react-query-devtools/CHANGELOG.md | 8 + packages/react-query-devtools/package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- .../react-query-persist-client/CHANGELOG.md | 8 + .../react-query-persist-client/package.json | 2 +- packages/react-query/CHANGELOG.md | 7 + packages/react-query/package.json | 2 +- packages/solid-query-devtools/CHANGELOG.md | 8 + packages/solid-query-devtools/package.json | 2 +- .../solid-query-persist-client/CHANGELOG.md | 8 + .../solid-query-persist-client/package.json | 2 +- packages/solid-query/CHANGELOG.md | 7 + packages/solid-query/package.json | 2 +- packages/svelte-query-devtools/CHANGELOG.md | 8 + packages/svelte-query-devtools/package.json | 2 +- .../svelte-query-persist-client/CHANGELOG.md | 8 + .../svelte-query-persist-client/package.json | 2 +- packages/svelte-query/CHANGELOG.md | 7 + packages/svelte-query/package.json | 2 +- packages/vue-query-devtools/CHANGELOG.md | 8 + packages/vue-query-devtools/package.json | 2 +- packages/vue-query/CHANGELOG.md | 7 + packages/vue-query/package.json | 2 +- pnpm-lock.yaml | 258 +++++++++--------- 114 files changed, 459 insertions(+), 288 deletions(-) delete mode 100644 .changeset/honest-sides-rhyme.md diff --git a/.changeset/honest-sides-rhyme.md b/.changeset/honest-sides-rhyme.md deleted file mode 100644 index 6ef7e7fc889..00000000000 --- a/.changeset/honest-sides-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@tanstack/query-core': patch ---- - -fix missing `dataUpdatedAt` for streamed queries that resolve before hydration diff --git a/examples/angular/auto-refetching/package.json b/examples/angular/auto-refetching/package.json index ffa0ba4bb5a..924448dfd6a 100644 --- a/examples/angular/auto-refetching/package.json +++ b/examples/angular/auto-refetching/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/basic-persister/package.json b/examples/angular/basic-persister/package.json index b227eed959f..bd093c24914 100644 --- a/examples/angular/basic-persister/package.json +++ b/examples/angular/basic-persister/package.json @@ -13,9 +13,9 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", - "@tanstack/angular-query-persist-client": "^5.101.0", - "@tanstack/query-async-storage-persister": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-persist-client": "^5.101.1", + "@tanstack/query-async-storage-persister": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/basic/package.json b/examples/angular/basic/package.json index c87b2b5bf7d..4e094dfcf88 100644 --- a/examples/angular/basic/package.json +++ b/examples/angular/basic/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/devtools-panel/package.json b/examples/angular/devtools-panel/package.json index 0376ced8449..8cc5d2eb8e9 100644 --- a/examples/angular/devtools-panel/package.json +++ b/examples/angular/devtools-panel/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/infinite-query-with-max-pages/package.json b/examples/angular/infinite-query-with-max-pages/package.json index f7bc3b933cc..8306712e193 100644 --- a/examples/angular/infinite-query-with-max-pages/package.json +++ b/examples/angular/infinite-query-with-max-pages/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/optimistic-updates/package.json b/examples/angular/optimistic-updates/package.json index 10024dc6b15..9826e37016d 100644 --- a/examples/angular/optimistic-updates/package.json +++ b/examples/angular/optimistic-updates/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/pagination/package.json b/examples/angular/pagination/package.json index 8164f6ea323..75484798088 100644 --- a/examples/angular/pagination/package.json +++ b/examples/angular/pagination/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/query-options-from-a-service/package.json b/examples/angular/query-options-from-a-service/package.json index a95aaff2726..b1f4b6ea1f5 100644 --- a/examples/angular/query-options-from-a-service/package.json +++ b/examples/angular/query-options-from-a-service/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/router/package.json b/examples/angular/router/package.json index 68d4e07f5d8..6f989526abd 100644 --- a/examples/angular/router/package.json +++ b/examples/angular/router/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/rxjs/package.json b/examples/angular/rxjs/package.json index 4859e692f81..e0b5afe0574 100644 --- a/examples/angular/rxjs/package.json +++ b/examples/angular/rxjs/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/simple/package.json b/examples/angular/simple/package.json index 0e613ca6e45..9fb1f1a383f 100644 --- a/examples/angular/simple/package.json +++ b/examples/angular/simple/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/lit/basic/package.json b/examples/lit/basic/package.json index 63d3825dd10..9bec71e1df2 100644 --- a/examples/lit/basic/package.json +++ b/examples/lit/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/lit-query": "^0.2.7", - "@tanstack/query-core": "^5.101.0", + "@tanstack/lit-query": "^0.2.8", + "@tanstack/query-core": "^5.101.1", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/lit/pagination/package.json b/examples/lit/pagination/package.json index 782ab70ad70..d30ce1717bb 100644 --- a/examples/lit/pagination/package.json +++ b/examples/lit/pagination/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/lit-query": "^0.2.7", - "@tanstack/query-core": "^5.101.0", + "@tanstack/lit-query": "^0.2.8", + "@tanstack/query-core": "^5.101.1", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/lit/ssr/package.json b/examples/lit/ssr/package.json index 846cdd904bd..6dd57bfc8a3 100644 --- a/examples/lit/ssr/package.json +++ b/examples/lit/ssr/package.json @@ -8,8 +8,8 @@ }, "dependencies": { "@lit-labs/ssr": "^3.3.0", - "@tanstack/lit-query": "^0.2.7", - "@tanstack/query-core": "^5.101.0", + "@tanstack/lit-query": "^0.2.8", + "@tanstack/query-core": "^5.101.1", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/preact/simple/package.json b/examples/preact/simple/package.json index 45aef72c406..6edc4331298 100644 --- a/examples/preact/simple/package.json +++ b/examples/preact/simple/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/preact-query": "^5.101.0", + "@tanstack/preact-query": "^5.101.1", "preact": "^10.28.0" }, "devDependencies": { diff --git a/examples/react/algolia/package.json b/examples/react/algolia/package.json index 24f31274e3e..4c2d66535b4 100644 --- a/examples/react/algolia/package.json +++ b/examples/react/algolia/package.json @@ -9,13 +9,13 @@ }, "dependencies": { "@algolia/client-search": "5.2.1", - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.0", + "@tanstack/eslint-plugin-query": "^5.101.1", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/auto-refetching/package.json b/examples/react/auto-refetching/package.json index 128303786d7..921a82aa3b0 100644 --- a/examples/react/auto-refetching/package.json +++ b/examples/react/auto-refetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/basic-graphql-request/package.json b/examples/react/basic-graphql-request/package.json index bf03398edcc..2e6d74fda6b 100644 --- a/examples/react/basic-graphql-request/package.json +++ b/examples/react/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "graphql": "^16.9.0", "graphql-request": "^7.1.2", "react": "^19.0.0", diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index 08fe16d9386..0079326ba96 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -9,15 +9,15 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.0", - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", - "@tanstack/react-query-persist-client": "^5.101.0", + "@tanstack/query-async-storage-persister": "^5.101.1", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query-persist-client": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.0", + "@tanstack/eslint-plugin-query": "^5.101.1", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/chat/package.json b/examples/react/chat/package.json index 1309e81e964..0990779934f 100644 --- a/examples/react/chat/package.json +++ b/examples/react/chat/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/default-query-function/package.json b/examples/react/default-query-function/package.json index 2f38d6ba8b4..47c3a2c75c2 100644 --- a/examples/react/default-query-function/package.json +++ b/examples/react/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/devtools-panel/package.json b/examples/react/devtools-panel/package.json index 63af0858e27..5a1944f3b7f 100644 --- a/examples/react/devtools-panel/package.json +++ b/examples/react/devtools-panel/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.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 d4bfab89688..2b30d42add3 100644 --- a/examples/react/eslint-legacy/package.json +++ b/examples/react/eslint-legacy/package.json @@ -9,15 +9,15 @@ "test:eslint": "ESLINT_USE_FLAT_CONFIG=false eslint ./src/**/*.tsx" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.0", - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", - "@tanstack/react-query-persist-client": "^5.101.0", + "@tanstack/query-async-storage-persister": "^5.101.1", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query-persist-client": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.0", + "@tanstack/eslint-plugin-query": "^5.101.1", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/eslint-plugin-demo/package.json b/examples/react/eslint-plugin-demo/package.json index d9e9f1241aa..7292ce6ec52 100644 --- a/examples/react/eslint-plugin-demo/package.json +++ b/examples/react/eslint-plugin-demo/package.json @@ -6,11 +6,11 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", + "@tanstack/react-query": "^5.101.1", "react": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.0", + "@tanstack/eslint-plugin-query": "^5.101.1", "eslint": "^9.39.0", "typescript": "5.8.3", "typescript-eslint": "^8.48.0" diff --git a/examples/react/infinite-query-with-max-pages/package.json b/examples/react/infinite-query-with-max-pages/package.json index cd12dbd5474..e225c9e55f3 100644 --- a/examples/react/infinite-query-with-max-pages/package.json +++ b/examples/react/infinite-query-with-max-pages/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/load-more-infinite-scroll/package.json b/examples/react/load-more-infinite-scroll/package.json index 23f943f9bad..668b2454d97 100644 --- a/examples/react/load-more-infinite-scroll/package.json +++ b/examples/react/load-more-infinite-scroll/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1", diff --git a/examples/react/nextjs-app-prefetching/package.json b/examples/react/nextjs-app-prefetching/package.json index b48c308d6d1..c3aa1f5e053 100644 --- a/examples/react/nextjs-app-prefetching/package.json +++ b/examples/react/nextjs-app-prefetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/nextjs-suspense-streaming/package.json b/examples/react/nextjs-suspense-streaming/package.json index 0ca611d4b40..5ba1a35ec75 100644 --- a/examples/react/nextjs-suspense-streaming/package.json +++ b/examples/react/nextjs-suspense-streaming/package.json @@ -8,9 +8,9 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", - "@tanstack/react-query-next-experimental": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query-next-experimental": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/nextjs/package.json b/examples/react/nextjs/package.json index d5eae449f78..898b6317ae2 100644 --- a/examples/react/nextjs/package.json +++ b/examples/react/nextjs/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/offline/package.json b/examples/react/offline/package.json index e07fb18b391..63fad83de51 100644 --- a/examples/react/offline/package.json +++ b/examples/react/offline/package.json @@ -8,11 +8,11 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.0", + "@tanstack/query-async-storage-persister": "^5.101.1", "@tanstack/react-location": "^3.7.4", - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", - "@tanstack/react-query-persist-client": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query-persist-client": "^5.101.1", "msw": "^2.6.6", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/optimistic-updates-cache/package.json b/examples/react/optimistic-updates-cache/package.json index 6249fa08521..74eb6405e02 100755 --- a/examples/react/optimistic-updates-cache/package.json +++ b/examples/react/optimistic-updates-cache/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/optimistic-updates-ui/package.json b/examples/react/optimistic-updates-ui/package.json index c22ee02e1c0..1745713f94e 100755 --- a/examples/react/optimistic-updates-ui/package.json +++ b/examples/react/optimistic-updates-ui/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/pagination/package.json b/examples/react/pagination/package.json index 02de7bcac16..2573d00e1d8 100644 --- a/examples/react/pagination/package.json +++ b/examples/react/pagination/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/playground/package.json b/examples/react/playground/package.json index 2d819f980ef..2144352db59 100644 --- a/examples/react/playground/package.json +++ b/examples/react/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/prefetching/package.json b/examples/react/prefetching/package.json index 073cfa815f8..9294c5e3dcf 100644 --- a/examples/react/prefetching/package.json +++ b/examples/react/prefetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/react-native/package.json b/examples/react/react-native/package.json index 735c7ff00b1..29845e15d09 100644 --- a/examples/react/react-native/package.json +++ b/examples/react/react-native/package.json @@ -14,8 +14,8 @@ "@react-native-community/netinfo": "^11.4.1", "@react-navigation/native": "^6.1.18", "@react-navigation/stack": "^6.4.1", - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "expo": "^52.0.11", "expo-constants": "^17.0.3", "expo-status-bar": "^2.0.0", diff --git a/examples/react/react-router/package.json b/examples/react/react-router/package.json index 2f071a89287..7e245a18e84 100644 --- a/examples/react/react-router/package.json +++ b/examples/react/react-router/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "localforage": "^1.10.0", "match-sorter": "^6.3.4", "react": "^19.0.0", diff --git a/examples/react/rick-morty/package.json b/examples/react/rick-morty/package.json index c9b8bcb9d5e..b5cdf38c776 100644 --- a/examples/react/rick-morty/package.json +++ b/examples/react/rick-morty/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^6.25.1", diff --git a/examples/react/shadow-dom/package.json b/examples/react/shadow-dom/package.json index 22bd20372e7..57b5e45b60c 100644 --- a/examples/react/shadow-dom/package.json +++ b/examples/react/shadow-dom/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/simple/package.json b/examples/react/simple/package.json index ae93cfe1847..860e9b458a7 100644 --- a/examples/react/simple/package.json +++ b/examples/react/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/star-wars/package.json b/examples/react/star-wars/package.json index db76467358c..21bfd3583de 100644 --- a/examples/react/star-wars/package.json +++ b/examples/react/star-wars/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^6.25.1", diff --git a/examples/react/suspense/package.json b/examples/react/suspense/package.json index d4b105c1c71..7e1ad39cf3b 100644 --- a/examples/react/suspense/package.json +++ b/examples/react/suspense/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.0", - "@tanstack/react-query-devtools": "^5.101.0", + "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query-devtools": "^5.101.1", "font-awesome": "^4.7.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/solid/astro/package.json b/examples/solid/astro/package.json index c69f873f747..7c0752ce83c 100644 --- a/examples/solid/astro/package.json +++ b/examples/solid/astro/package.json @@ -15,8 +15,8 @@ "@astrojs/solid-js": "^5.0.7", "@astrojs/tailwind": "^6.0.2", "@astrojs/vercel": "^8.1.3", - "@tanstack/solid-query": "^5.101.0", - "@tanstack/solid-query-devtools": "^5.101.0", + "@tanstack/solid-query": "^5.101.1", + "@tanstack/solid-query-devtools": "^5.101.1", "astro": "^5.5.6", "solid-js": "^1.9.7", "tailwindcss": "^3.4.7", diff --git a/examples/solid/basic-graphql-request/package.json b/examples/solid/basic-graphql-request/package.json index 2e2a614602f..b89f869eef9 100644 --- a/examples/solid/basic-graphql-request/package.json +++ b/examples/solid/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.0", - "@tanstack/solid-query-devtools": "^5.101.0", + "@tanstack/solid-query": "^5.101.1", + "@tanstack/solid-query-devtools": "^5.101.1", "graphql": "^16.9.0", "graphql-request": "^7.1.2", "solid-js": "^1.9.7" diff --git a/examples/solid/basic/package.json b/examples/solid/basic/package.json index bafc9622a99..a717dc64cb3 100644 --- a/examples/solid/basic/package.json +++ b/examples/solid/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.0", - "@tanstack/solid-query-devtools": "^5.101.0", + "@tanstack/solid-query": "^5.101.1", + "@tanstack/solid-query-devtools": "^5.101.1", "solid-js": "^1.9.7" }, "devDependencies": { diff --git a/examples/solid/default-query-function/package.json b/examples/solid/default-query-function/package.json index cf9089803d8..0def678d251 100644 --- a/examples/solid/default-query-function/package.json +++ b/examples/solid/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.0", - "@tanstack/solid-query-devtools": "^5.101.0", + "@tanstack/solid-query": "^5.101.1", + "@tanstack/solid-query-devtools": "^5.101.1", "solid-js": "^1.9.7" }, "devDependencies": { diff --git a/examples/solid/offline/package.json b/examples/solid/offline/package.json index a2935201176..20a57ae875e 100644 --- a/examples/solid/offline/package.json +++ b/examples/solid/offline/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.0", - "@tanstack/solid-query": "^5.101.0", - "@tanstack/solid-query-devtools": "^5.101.0", - "@tanstack/solid-query-persist-client": "^5.101.0", + "@tanstack/query-async-storage-persister": "^5.101.1", + "@tanstack/solid-query": "^5.101.1", + "@tanstack/solid-query-devtools": "^5.101.1", + "@tanstack/solid-query-persist-client": "^5.101.1", "msw": "^2.6.6", "solid-js": "^1.9.7" }, diff --git a/examples/solid/simple/package.json b/examples/solid/simple/package.json index a9a6cfd947a..c7b49334478 100644 --- a/examples/solid/simple/package.json +++ b/examples/solid/simple/package.json @@ -8,12 +8,12 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.0", - "@tanstack/solid-query-devtools": "^5.101.0", + "@tanstack/solid-query": "^5.101.1", + "@tanstack/solid-query-devtools": "^5.101.1", "solid-js": "^1.9.7" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.0", + "@tanstack/eslint-plugin-query": "^5.101.1", "typescript": "5.8.3", "vite": "^6.4.1", "vite-plugin-solid": "^2.11.6" diff --git a/examples/solid/solid-start-streaming/package.json b/examples/solid/solid-start-streaming/package.json index 81d4b19d6a9..81503a6f780 100644 --- a/examples/solid/solid-start-streaming/package.json +++ b/examples/solid/solid-start-streaming/package.json @@ -12,8 +12,8 @@ "@solidjs/meta": "^0.29.4", "@solidjs/router": "^0.15.3", "@solidjs/start": "^1.1.3", - "@tanstack/solid-query": "^5.101.0", - "@tanstack/solid-query-devtools": "^5.101.0", + "@tanstack/solid-query": "^5.101.1", + "@tanstack/solid-query-devtools": "^5.101.1", "solid-js": "^1.9.7", "vinxi": "^0.5.3" }, diff --git a/examples/svelte/auto-refetching/package.json b/examples/svelte/auto-refetching/package.json index cb49311f46c..61e8cb0ab8d 100644 --- a/examples/svelte/auto-refetching/package.json +++ b/examples/svelte/auto-refetching/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.34", - "@tanstack/svelte-query-devtools": "^6.1.34" + "@tanstack/svelte-query": "^6.1.35", + "@tanstack/svelte-query-devtools": "^6.1.35" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/basic/package.json b/examples/svelte/basic/package.json index f6d34bd8518..57d2e1c75be 100644 --- a/examples/svelte/basic/package.json +++ b/examples/svelte/basic/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.0", - "@tanstack/svelte-query": "^6.1.34", - "@tanstack/svelte-query-devtools": "^6.1.34", - "@tanstack/svelte-query-persist-client": "^6.1.34" + "@tanstack/query-async-storage-persister": "^5.101.1", + "@tanstack/svelte-query": "^6.1.35", + "@tanstack/svelte-query-devtools": "^6.1.35", + "@tanstack/svelte-query-persist-client": "^6.1.35" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/load-more-infinite-scroll/package.json b/examples/svelte/load-more-infinite-scroll/package.json index 15074a7de2f..7406d8285df 100644 --- a/examples/svelte/load-more-infinite-scroll/package.json +++ b/examples/svelte/load-more-infinite-scroll/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.34", - "@tanstack/svelte-query-devtools": "^6.1.34" + "@tanstack/svelte-query": "^6.1.35", + "@tanstack/svelte-query-devtools": "^6.1.35" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/optimistic-updates/package.json b/examples/svelte/optimistic-updates/package.json index 6da280bc9c8..d56032a117b 100644 --- a/examples/svelte/optimistic-updates/package.json +++ b/examples/svelte/optimistic-updates/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.34", - "@tanstack/svelte-query-devtools": "^6.1.34" + "@tanstack/svelte-query": "^6.1.35", + "@tanstack/svelte-query-devtools": "^6.1.35" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/playground/package.json b/examples/svelte/playground/package.json index 448b42fb2c0..8b49aeb4da4 100644 --- a/examples/svelte/playground/package.json +++ b/examples/svelte/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.34", - "@tanstack/svelte-query-devtools": "^6.1.34" + "@tanstack/svelte-query": "^6.1.35", + "@tanstack/svelte-query-devtools": "^6.1.35" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/simple/package.json b/examples/svelte/simple/package.json index 8a4ced340f7..a482f35f761 100644 --- a/examples/svelte/simple/package.json +++ b/examples/svelte/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.34", - "@tanstack/svelte-query-devtools": "^6.1.34" + "@tanstack/svelte-query": "^6.1.35", + "@tanstack/svelte-query-devtools": "^6.1.35" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.1.1", diff --git a/examples/svelte/ssr/package.json b/examples/svelte/ssr/package.json index b7d41464b17..f2f7dc808d0 100644 --- a/examples/svelte/ssr/package.json +++ b/examples/svelte/ssr/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.34", - "@tanstack/svelte-query-devtools": "^6.1.34" + "@tanstack/svelte-query": "^6.1.35", + "@tanstack/svelte-query-devtools": "^6.1.35" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/star-wars/package.json b/examples/svelte/star-wars/package.json index 6f654eef9f6..54bd3c372be 100644 --- a/examples/svelte/star-wars/package.json +++ b/examples/svelte/star-wars/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.34", - "@tanstack/svelte-query-devtools": "^6.1.34" + "@tanstack/svelte-query": "^6.1.35", + "@tanstack/svelte-query-devtools": "^6.1.35" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/vue/basic/package.json b/examples/vue/basic/package.json index 81b7be813a1..5cc2a471a92 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.101.0", - "@tanstack/vue-query-devtools": "^6.1.34", + "@tanstack/vue-query": "^5.101.1", + "@tanstack/vue-query-devtools": "^6.1.35", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/dependent-queries/package.json b/examples/vue/dependent-queries/package.json index fdfb895062d..2d65882e48b 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.101.0", + "@tanstack/vue-query": "^5.101.1", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/persister/package.json b/examples/vue/persister/package.json index 65c42729c3d..600566e7a6e 100644 --- a/examples/vue/persister/package.json +++ b/examples/vue/persister/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-core": "^5.101.0", - "@tanstack/query-persist-client-core": "^5.101.0", - "@tanstack/query-sync-storage-persister": "^5.101.0", - "@tanstack/vue-query": "^5.101.0", + "@tanstack/query-core": "^5.101.1", + "@tanstack/query-persist-client-core": "^5.101.1", + "@tanstack/query-sync-storage-persister": "^5.101.1", + "@tanstack/vue-query": "^5.101.1", "idb-keyval": "^6.2.1", "vue": "^3.4.27" }, diff --git a/examples/vue/simple/package.json b/examples/vue/simple/package.json index b41562f8b53..7f843524a0d 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.101.0", - "@tanstack/vue-query-devtools": "^6.1.34", + "@tanstack/vue-query": "^5.101.1", + "@tanstack/vue-query-devtools": "^6.1.35", "vue": "^3.4.27" }, "devDependencies": { diff --git a/integrations/angular-cli-20/package.json b/integrations/angular-cli-20/package.json index 10e1d3d64a7..16ffcf04539 100644 --- a/integrations/angular-cli-20/package.json +++ b/integrations/angular-cli-20/package.json @@ -14,7 +14,7 @@ "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.0", + "@tanstack/angular-query-experimental": "^5.101.1", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" diff --git a/packages/angular-query-experimental/CHANGELOG.md b/packages/angular-query-experimental/CHANGELOG.md index 94055e7f773..64bc925b686 100644 --- a/packages/angular-query-experimental/CHANGELOG.md +++ b/packages/angular-query-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/angular-query-experimental +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/angular-query-experimental/package.json b/packages/angular-query-experimental/package.json index a566a21079e..278e600cf81 100644 --- a/packages/angular-query-experimental/package.json +++ b/packages/angular-query-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/angular-query-experimental", - "version": "5.101.0", + "version": "5.101.1", "description": "Signals for managing, caching and syncing asynchronous and remote data in Angular", "author": "Arnoud de Vries", "license": "MIT", diff --git a/packages/angular-query-persist-client/CHANGELOG.md b/packages/angular-query-persist-client/CHANGELOG.md index e3f3bea04a7..571d0548ad2 100644 --- a/packages/angular-query-persist-client/CHANGELOG.md +++ b/packages/angular-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/angular-query-persist-client +## 5.101.1 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/angular-query-experimental@5.101.1 + - @tanstack/query-persist-client-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/angular-query-persist-client/package.json b/packages/angular-query-persist-client/package.json index 5b185188179..c5c801ff6b4 100644 --- a/packages/angular-query-persist-client/package.json +++ b/packages/angular-query-persist-client/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/angular-query-persist-client", "private": true, - "version": "5.101.0", + "version": "5.101.1", "description": "Angular bindings to work with persisters in TanStack/angular-query", "author": "Omer Gronich", "license": "MIT", diff --git a/packages/eslint-plugin-query/CHANGELOG.md b/packages/eslint-plugin-query/CHANGELOG.md index 3d3ff84aa7e..d2a9bf846ad 100644 --- a/packages/eslint-plugin-query/CHANGELOG.md +++ b/packages/eslint-plugin-query/CHANGELOG.md @@ -1,5 +1,7 @@ # @tanstack/eslint-plugin-query +## 5.101.1 + ## 5.101.0 ### Minor Changes diff --git a/packages/eslint-plugin-query/package.json b/packages/eslint-plugin-query/package.json index 5efae7fc13c..f143ea40354 100644 --- a/packages/eslint-plugin-query/package.json +++ b/packages/eslint-plugin-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/eslint-plugin-query", - "version": "5.101.0", + "version": "5.101.1", "description": "ESLint plugin for TanStack Query", "author": "Eliya Cohen", "license": "MIT", diff --git a/packages/lit-query/CHANGELOG.md b/packages/lit-query/CHANGELOG.md index d9d2eda1f55..c05a12e73a9 100644 --- a/packages/lit-query/CHANGELOG.md +++ b/packages/lit-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/lit-query +## 0.2.8 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 0.2.7 ### Patch Changes diff --git a/packages/lit-query/package.json b/packages/lit-query/package.json index 635e5958e79..30ad9be03fd 100644 --- a/packages/lit-query/package.json +++ b/packages/lit-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/lit-query", - "version": "0.2.7", + "version": "0.2.8", "description": "Lit adapter for TanStack Query Core", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query-devtools/CHANGELOG.md b/packages/preact-query-devtools/CHANGELOG.md index 6e59fe956d5..7a4d493f0b8 100644 --- a/packages/preact-query-devtools/CHANGELOG.md +++ b/packages/preact-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/preact-query-devtools +## 5.101.1 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/preact-query@5.101.1 + - @tanstack/query-devtools@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/preact-query-devtools/package.json b/packages/preact-query-devtools/package.json index 03a27a29388..26d5077b07f 100644 --- a/packages/preact-query-devtools/package.json +++ b/packages/preact-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query-devtools", - "version": "5.101.0", + "version": "5.101.1", "description": "Developer tools to interact with and visualize the TanStack/preact-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query-persist-client/CHANGELOG.md b/packages/preact-query-persist-client/CHANGELOG.md index 558fd2d15a1..016a934d076 100644 --- a/packages/preact-query-persist-client/CHANGELOG.md +++ b/packages/preact-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/preact-query-persist-client +## 5.101.1 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/preact-query@5.101.1 + - @tanstack/query-persist-client-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/preact-query-persist-client/package.json b/packages/preact-query-persist-client/package.json index 1a3a980080d..cf46f280024 100644 --- a/packages/preact-query-persist-client/package.json +++ b/packages/preact-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query-persist-client", - "version": "5.101.0", + "version": "5.101.1", "description": "Preact bindings to work with persisters in TanStack/preact-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query/CHANGELOG.md b/packages/preact-query/CHANGELOG.md index 5190be09fcc..d802e3b6605 100644 --- a/packages/preact-query/CHANGELOG.md +++ b/packages/preact-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/preact-query +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/preact-query/package.json b/packages/preact-query/package.json index f7cdfc972af..5ccbb614053 100644 --- a/packages/preact-query/package.json +++ b/packages/preact-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query", - "version": "5.101.0", + "version": "5.101.1", "description": "Hooks for managing, caching and syncing asynchronous and remote data in preact", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-async-storage-persister/CHANGELOG.md b/packages/query-async-storage-persister/CHANGELOG.md index 36c5b9ba941..3ae8d214b00 100644 --- a/packages/query-async-storage-persister/CHANGELOG.md +++ b/packages/query-async-storage-persister/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/query-async-storage-persister +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + - @tanstack/query-persist-client-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/query-async-storage-persister/package.json b/packages/query-async-storage-persister/package.json index 1a63a95c0f7..2fa4bff54b2 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.101.0", + "version": "5.101.1", "description": "A persister for asynchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-broadcast-client-experimental/CHANGELOG.md b/packages/query-broadcast-client-experimental/CHANGELOG.md index 9f2a4a56c79..dd95276f329 100644 --- a/packages/query-broadcast-client-experimental/CHANGELOG.md +++ b/packages/query-broadcast-client-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-broadcast-client-experimental +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/query-broadcast-client-experimental/package.json b/packages/query-broadcast-client-experimental/package.json index 3271f4299df..93567e85b26 100644 --- a/packages/query-broadcast-client-experimental/package.json +++ b/packages/query-broadcast-client-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-broadcast-client-experimental", - "version": "5.101.0", + "version": "5.101.1", "description": "An experimental plugin to for broadcasting the state of your queryClient between browser tabs/windows", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-core/CHANGELOG.md b/packages/query-core/CHANGELOG.md index 6f0871c021b..9e83eedd6bb 100644 --- a/packages/query-core/CHANGELOG.md +++ b/packages/query-core/CHANGELOG.md @@ -1,5 +1,11 @@ # @tanstack/query-core +## 5.101.1 + +### Patch Changes + +- [#10610](https://github.com/TanStack/query/pull/10610) [`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1) - fix missing `dataUpdatedAt` for streamed queries that resolve before hydration + ## 5.101.0 ## 5.100.14 diff --git a/packages/query-core/package.json b/packages/query-core/package.json index 80f9f479f82..e51e5754fdd 100644 --- a/packages/query-core/package.json +++ b/packages/query-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-core", - "version": "5.101.0", + "version": "5.101.1", "description": "The framework agnostic core that powers TanStack Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-devtools/CHANGELOG.md b/packages/query-devtools/CHANGELOG.md index b6672a1f24a..f9f805cf4d9 100644 --- a/packages/query-devtools/CHANGELOG.md +++ b/packages/query-devtools/CHANGELOG.md @@ -1,5 +1,7 @@ # @tanstack/query-devtools +## 5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/query-devtools/package.json b/packages/query-devtools/package.json index f1e4ae25800..b7d39cf6950 100644 --- a/packages/query-devtools/package.json +++ b/packages/query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-devtools", - "version": "5.101.0", + "version": "5.101.1", "description": "Developer tools to interact with and visualize the TanStack Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-persist-client-core/CHANGELOG.md b/packages/query-persist-client-core/CHANGELOG.md index 5e875179ee1..5e67228fecb 100644 --- a/packages/query-persist-client-core/CHANGELOG.md +++ b/packages/query-persist-client-core/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-persist-client-core +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/query-persist-client-core/package.json b/packages/query-persist-client-core/package.json index 2156cde6941..638b4b8e57b 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.101.0", + "version": "5.101.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-sync-storage-persister/CHANGELOG.md b/packages/query-sync-storage-persister/CHANGELOG.md index feeb3aac96c..2c9f1e51b2e 100644 --- a/packages/query-sync-storage-persister/CHANGELOG.md +++ b/packages/query-sync-storage-persister/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/query-sync-storage-persister +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + - @tanstack/query-persist-client-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/query-sync-storage-persister/package.json b/packages/query-sync-storage-persister/package.json index da83848041a..45a500bdda1 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.101.0", + "version": "5.101.1", "description": "A persister for synchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-devtools/CHANGELOG.md b/packages/react-query-devtools/CHANGELOG.md index 7a94485ff77..78a1b85bd24 100644 --- a/packages/react-query-devtools/CHANGELOG.md +++ b/packages/react-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/react-query-devtools +## 5.101.1 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.1 + - @tanstack/react-query@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/react-query-devtools/package.json b/packages/react-query-devtools/package.json index 950f2342d49..7b41c9ff9cb 100644 --- a/packages/react-query-devtools/package.json +++ b/packages/react-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-devtools", - "version": "5.101.0", + "version": "5.101.1", "description": "Developer tools to interact with and visualize the TanStack/react-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-next-experimental/CHANGELOG.md b/packages/react-query-next-experimental/CHANGELOG.md index dc28ad19f93..b27abe37f31 100644 --- a/packages/react-query-next-experimental/CHANGELOG.md +++ b/packages/react-query-next-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-query-next-experimental +## 5.101.1 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/react-query@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/react-query-next-experimental/package.json b/packages/react-query-next-experimental/package.json index 0dfb4629852..c578ba14049 100644 --- a/packages/react-query-next-experimental/package.json +++ b/packages/react-query-next-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-next-experimental", - "version": "5.101.0", + "version": "5.101.1", "description": "Hydration utils for React Query in the NextJs app directory", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-persist-client/CHANGELOG.md b/packages/react-query-persist-client/CHANGELOG.md index 8bc27b64e94..fd7c9147504 100644 --- a/packages/react-query-persist-client/CHANGELOG.md +++ b/packages/react-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/react-query-persist-client +## 5.101.1 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.1 + - @tanstack/react-query@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/react-query-persist-client/package.json b/packages/react-query-persist-client/package.json index fd3c4402de8..ae22ff221b6 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.101.0", + "version": "5.101.1", "description": "React bindings to work with persisters in TanStack/react-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query/CHANGELOG.md b/packages/react-query/CHANGELOG.md index de1675fb443..aef2ff58c73 100644 --- a/packages/react-query/CHANGELOG.md +++ b/packages/react-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-query +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/react-query/package.json b/packages/react-query/package.json index 557737649e3..3398aba2e16 100644 --- a/packages/react-query/package.json +++ b/packages/react-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query", - "version": "5.101.0", + "version": "5.101.1", "description": "Hooks for managing, caching and syncing asynchronous and remote data in React", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-devtools/CHANGELOG.md b/packages/solid-query-devtools/CHANGELOG.md index 0bebd79d931..4dd92274967 100644 --- a/packages/solid-query-devtools/CHANGELOG.md +++ b/packages/solid-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/solid-query-devtools +## 5.101.1 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.1 + - @tanstack/solid-query@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/solid-query-devtools/package.json b/packages/solid-query-devtools/package.json index d78bab42cbd..271cf95e0b6 100644 --- a/packages/solid-query-devtools/package.json +++ b/packages/solid-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query-devtools", - "version": "5.101.0", + "version": "5.101.1", "description": "Developer tools to interact with and visualize the TanStack/solid-query Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-persist-client/CHANGELOG.md b/packages/solid-query-persist-client/CHANGELOG.md index 56670033618..6dbb45f0b7c 100644 --- a/packages/solid-query-persist-client/CHANGELOG.md +++ b/packages/solid-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/solid-query-persist-client +## 5.101.1 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.1 + - @tanstack/solid-query@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/solid-query-persist-client/package.json b/packages/solid-query-persist-client/package.json index 3442c97a9eb..60a737b9fd9 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.101.0", + "version": "5.101.1", "description": "Solid.js bindings to work with persisters in TanStack/solid-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query/CHANGELOG.md b/packages/solid-query/CHANGELOG.md index a274ab813ae..557abb92ea1 100644 --- a/packages/solid-query/CHANGELOG.md +++ b/packages/solid-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/solid-query +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/solid-query/package.json b/packages/solid-query/package.json index ce1c72fe678..9623243de8e 100644 --- a/packages/solid-query/package.json +++ b/packages/solid-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query", - "version": "5.101.0", + "version": "5.101.1", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/svelte-query-devtools/CHANGELOG.md b/packages/svelte-query-devtools/CHANGELOG.md index 471b72e174e..dc4b57ba0fb 100644 --- a/packages/svelte-query-devtools/CHANGELOG.md +++ b/packages/svelte-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/svelte-query-devtools +## 6.1.35 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.1 + - @tanstack/svelte-query@6.1.35 + ## 6.1.34 ### Patch Changes diff --git a/packages/svelte-query-devtools/package.json b/packages/svelte-query-devtools/package.json index 8ce36174d37..464ba9125b9 100644 --- a/packages/svelte-query-devtools/package.json +++ b/packages/svelte-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query-devtools", - "version": "6.1.34", + "version": "6.1.35", "description": "Developer tools to interact with and visualize the TanStack/svelte-query cache", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query-persist-client/CHANGELOG.md b/packages/svelte-query-persist-client/CHANGELOG.md index ea17318c566..ca04da9abf0 100644 --- a/packages/svelte-query-persist-client/CHANGELOG.md +++ b/packages/svelte-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/svelte-query-persist-client +## 6.1.35 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.1 + - @tanstack/svelte-query@6.1.35 + ## 6.1.34 ### Patch Changes diff --git a/packages/svelte-query-persist-client/package.json b/packages/svelte-query-persist-client/package.json index d776b95f27d..edbd55b107c 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": "6.1.34", + "version": "6.1.35", "description": "Svelte bindings to work with persisters in TanStack/svelte-query", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query/CHANGELOG.md b/packages/svelte-query/CHANGELOG.md index 33495919b1d..a608fe85312 100644 --- a/packages/svelte-query/CHANGELOG.md +++ b/packages/svelte-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/svelte-query +## 6.1.35 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 6.1.34 ### Patch Changes diff --git a/packages/svelte-query/package.json b/packages/svelte-query/package.json index faaff83c4a4..bd7d771265d 100644 --- a/packages/svelte-query/package.json +++ b/packages/svelte-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query", - "version": "6.1.34", + "version": "6.1.35", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/vue-query-devtools/CHANGELOG.md b/packages/vue-query-devtools/CHANGELOG.md index 30430e3f3cf..f1621becf79 100644 --- a/packages/vue-query-devtools/CHANGELOG.md +++ b/packages/vue-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/vue-query-devtools +## 6.1.35 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.1 + - @tanstack/vue-query@5.101.1 + ## 6.1.34 ### Patch Changes diff --git a/packages/vue-query-devtools/package.json b/packages/vue-query-devtools/package.json index b14cb296e38..0613005b08a 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": "6.1.34", + "version": "6.1.35", "description": "Developer tools to interact with and visualize the TanStack/vue-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/vue-query/CHANGELOG.md b/packages/vue-query/CHANGELOG.md index e991c7b7a72..ebbe2204f07 100644 --- a/packages/vue-query/CHANGELOG.md +++ b/packages/vue-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/vue-query +## 5.101.1 + +### Patch Changes + +- Updated dependencies [[`9eff92e`](https://github.com/TanStack/query/commit/9eff92ed86e284ec0125b3a3539d028688235bd1)]: + - @tanstack/query-core@5.101.1 + ## 5.101.0 ### Patch Changes diff --git a/packages/vue-query/package.json b/packages/vue-query/package.json index 1b4ed4a2bbe..e8a2760d5b0 100644 --- a/packages/vue-query/package.json +++ b/packages/vue-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-query", - "version": "5.101.0", + "version": "5.101.1", "description": "Hooks for managing, caching and syncing asynchronous and remote data in Vue", "author": "Damian Osipiuk", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 859c42dd7a9..5e1de2716ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,7 +170,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -210,7 +210,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -250,13 +250,13 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental '@tanstack/angular-query-persist-client': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-persist-client '@tanstack/query-async-storage-persister': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-async-storage-persister rxjs: specifier: ^7.8.2 @@ -299,7 +299,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -339,7 +339,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -382,7 +382,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -422,7 +422,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -465,7 +465,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -508,7 +508,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -551,7 +551,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -591,7 +591,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -619,10 +619,10 @@ importers: examples/lit/basic: dependencies: '@tanstack/lit-query': - specifier: ^0.2.7 + specifier: ^0.2.8 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -638,10 +638,10 @@ importers: examples/lit/pagination: dependencies: '@tanstack/lit-query': - specifier: ^0.2.7 + specifier: ^0.2.8 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -660,10 +660,10 @@ importers: specifier: ^3.3.0 version: 3.3.1 '@tanstack/lit-query': - specifier: ^0.2.7 + specifier: ^0.2.8 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -685,7 +685,7 @@ importers: examples/preact/simple: dependencies: '@tanstack/preact-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/preact-query preact: specifier: ^10.28.0 @@ -713,10 +713,10 @@ importers: specifier: 5.2.1 version: 5.2.1 '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -726,7 +726,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -747,10 +747,10 @@ importers: examples/react/auto-refetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -775,16 +775,16 @@ importers: examples/react/basic: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-async-storage-persister '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-persist-client react: specifier: ^19.0.0 @@ -794,7 +794,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -815,10 +815,10 @@ importers: examples/react/basic-graphql-request: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools graphql: specifier: ^16.9.0 @@ -843,10 +843,10 @@ importers: examples/react/chat: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -874,10 +874,10 @@ importers: examples/react/default-query-function: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -899,10 +899,10 @@ importers: examples/react/devtools-panel: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -924,16 +924,16 @@ importers: examples/react/eslint-legacy: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-async-storage-persister '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-persist-client react: specifier: ^19.0.0 @@ -943,7 +943,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -964,14 +964,14 @@ importers: examples/react/eslint-plugin-demo: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query react: specifier: ^19.0.0 version: 19.2.4 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/eslint-plugin-query eslint: specifier: ^9.39.0 @@ -986,10 +986,10 @@ importers: examples/react/infinite-query-with-max-pages: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1014,10 +1014,10 @@ importers: examples/react/load-more-infinite-scroll: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1045,10 +1045,10 @@ importers: examples/react/nextjs: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1073,10 +1073,10 @@ importers: examples/react/nextjs-app-prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1101,13 +1101,13 @@ importers: examples/react/nextjs-suspense-streaming: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools '@tanstack/react-query-next-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-next-experimental next: specifier: ^16.0.7 @@ -1132,19 +1132,19 @@ importers: examples/react/offline: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-async-storage-persister '@tanstack/react-location': specifier: ^3.7.4 version: 3.7.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-persist-client msw: specifier: ^2.6.6 @@ -1172,10 +1172,10 @@ importers: examples/react/optimistic-updates-cache: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1200,10 +1200,10 @@ importers: examples/react/optimistic-updates-ui: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1228,10 +1228,10 @@ importers: examples/react/pagination: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1256,10 +1256,10 @@ importers: examples/react/playground: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1281,10 +1281,10 @@ importers: examples/react/prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1318,10 +1318,10 @@ importers: specifier: ^6.4.1 version: 6.4.1(@react-navigation/native@6.1.18(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-gesture-handler@2.30.1(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@4.14.1(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools expo: specifier: ^52.0.11 @@ -1370,10 +1370,10 @@ importers: examples/react/react-router: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools localforage: specifier: ^1.10.0 @@ -1422,10 +1422,10 @@ importers: examples/react/rick-morty: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1459,10 +1459,10 @@ importers: examples/react/shadow-dom: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1490,10 +1490,10 @@ importers: examples/react/simple: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1515,10 +1515,10 @@ importers: examples/react/star-wars: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1552,10 +1552,10 @@ importers: examples/react/suspense: dependencies: '@tanstack/react-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/react-query-devtools font-awesome: specifier: ^4.7.0 @@ -1598,10 +1598,10 @@ importers: specifier: ^8.1.3 version: 8.2.11(@sveltejs/kit@2.57.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.1)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.55.1)(typescript@5.8.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(astro@5.18.1(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@1.21.7)(lightningcss@1.32.0)(rollup@4.60.1)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.8.3)(yaml@2.8.3))(next@16.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.90.0))(react@19.2.4)(rollup@4.60.1)(svelte@5.55.1)(vue@3.5.31(typescript@5.8.3)) '@tanstack/solid-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query-devtools astro: specifier: ^5.5.6 @@ -1619,10 +1619,10 @@ importers: examples/solid/basic: dependencies: '@tanstack/solid-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1641,10 +1641,10 @@ importers: examples/solid/basic-graphql-request: dependencies: '@tanstack/solid-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query-devtools graphql: specifier: ^16.9.0 @@ -1669,10 +1669,10 @@ importers: examples/solid/default-query-function: dependencies: '@tanstack/solid-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1691,16 +1691,16 @@ importers: examples/solid/offline: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-async-storage-persister '@tanstack/solid-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query-devtools '@tanstack/solid-query-persist-client': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query-persist-client msw: specifier: ^2.6.6 @@ -1722,17 +1722,17 @@ importers: examples/solid/simple: dependencies: '@tanstack/solid-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 version: 1.9.12 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/eslint-plugin-query typescript: specifier: 5.8.3 @@ -1756,10 +1756,10 @@ importers: specifier: ^1.1.3 version: 1.3.2(@testing-library/jest-dom@6.9.1)(solid-js@1.9.12)(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/solid-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1771,10 +1771,10 @@ importers: examples/svelte/auto-refetching: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1802,16 +1802,16 @@ importers: examples/svelte/basic: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-async-storage-persister '@tanstack/svelte-query': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-devtools '@tanstack/svelte-query-persist-client': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-persist-client devDependencies: '@sveltejs/adapter-auto': @@ -1839,10 +1839,10 @@ importers: examples/svelte/load-more-infinite-scroll: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1870,10 +1870,10 @@ importers: examples/svelte/optimistic-updates: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1901,10 +1901,10 @@ importers: examples/svelte/playground: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1932,10 +1932,10 @@ importers: examples/svelte/simple: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/vite-plugin-svelte': @@ -1960,10 +1960,10 @@ importers: examples/svelte/ssr: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1991,10 +1991,10 @@ importers: examples/svelte/star-wars: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -2028,10 +2028,10 @@ importers: examples/vue/basic: dependencies: '@tanstack/vue-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.4.27 @@ -2050,7 +2050,7 @@ importers: examples/vue/dependent-queries: dependencies: '@tanstack/vue-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/vue-query vue: specifier: ^3.4.27 @@ -2069,16 +2069,16 @@ importers: examples/vue/persister: dependencies: '@tanstack/query-core': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-core '@tanstack/query-persist-client-core': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-persist-client-core '@tanstack/query-sync-storage-persister': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/query-sync-storage-persister '@tanstack/vue-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/vue-query idb-keyval: specifier: ^6.2.1 @@ -2100,10 +2100,10 @@ importers: examples/vue/simple: dependencies: '@tanstack/vue-query': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^6.1.34 + specifier: ^6.1.35 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.4.27 @@ -2140,7 +2140,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.0 + specifier: ^5.101.1 version: link:../../packages/angular-query-experimental rxjs: specifier: ~7.8.0 From 982c6185a77b934587c545e1a661542164c166aa Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 24 Jun 2026 10:55:40 +0900 Subject: [PATCH 12/97] test(svelte-query/utils): add tests for 'watchChanges' first-run skip, array sources, and cleanup (#10979) --- .../svelte-query/tests/utils.svelte.test.ts | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 packages/svelte-query/tests/utils.svelte.test.ts diff --git a/packages/svelte-query/tests/utils.svelte.test.ts b/packages/svelte-query/tests/utils.svelte.test.ts new file mode 100644 index 00000000000..425586cfac4 --- /dev/null +++ b/packages/svelte-query/tests/utils.svelte.test.ts @@ -0,0 +1,79 @@ +import { flushSync } from 'svelte' +import { describe, expect, it, vi } from 'vitest' +import { watchChanges } from '../src/utils.svelte.js' +import { ref, withEffectRoot } from './utils.svelte.js' + +describe('watchChanges', () => { + it( + 'should skip the first run and only call the effect on subsequent changes', + withEffectRoot(() => { + const source = ref(0) + const effect = vi.fn() + + watchChanges(() => source.value, 'pre', effect) + + // first run only records previousValues, effect is not called + flushSync() + expect(effect).not.toHaveBeenCalled() + + source.value = 1 + flushSync() + expect(effect).toHaveBeenCalledExactlyOnceWith(1, 0) + }), + ) + + it( + 'should run with the "post" flush timing', + withEffectRoot(() => { + const source = ref(0) + const effect = vi.fn() + + watchChanges(() => source.value, 'post', effect) + + flushSync() + expect(effect).not.toHaveBeenCalled() + + source.value = 1 + flushSync() + expect(effect).toHaveBeenCalledExactlyOnceWith(1, 0) + }), + ) + + it( + 'should track an array of sources and pass arrays of values', + withEffectRoot(() => { + const a = ref(1) + const b = ref(2) + const effect = vi.fn() + + watchChanges([() => a.value, () => b.value], 'pre', effect) + + flushSync() + expect(effect).not.toHaveBeenCalled() + + a.value = 10 + flushSync() + expect(effect).toHaveBeenCalledExactlyOnceWith([10, 2], [1, 2]) + }), + ) + + it( + 'should run the returned cleanup before the next effect run', + withEffectRoot(() => { + const source = ref(0) + const cleanup = vi.fn() + const effect = vi.fn(() => cleanup) + + watchChanges(() => source.value, 'pre', effect) + + flushSync() + source.value = 1 + flushSync() + expect(cleanup).not.toHaveBeenCalled() + + source.value = 2 + flushSync() + expect(cleanup).toHaveBeenCalledOnce() + }), + ) +}) From 4eb0ed9322a0db822f289162139ebd22b95ff2b6 Mon Sep 17 00:00:00 2001 From: Flo Date: Wed, 24 Jun 2026 13:46:09 +0200 Subject: [PATCH 13/97] chore: update pnpm to 11.9.0 (#10978) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update pnpm to 11.9.0 * chore: document trust policy exclusions * chore: raise minimum release age --------- Co-authored-by: Dominik Dorfmeister 🔮 --- package.json | 4 ++-- pnpm-workspace.yaml | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index cf09bf7526c..80e2e88104a 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,9 @@ "type": "git", "url": "git+https://github.com/TanStack/query.git" }, - "packageManager": "pnpm@11.1.0", + "packageManager": "pnpm@11.9.0", "engines": { - "pnpm": ">=11.0.0" + "pnpm": ">=11.9.0" }, "type": "module", "scripts": { diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9a58ec4796f..4e37d863ded 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,10 +1,15 @@ cleanupUnusedCatalogs: true +minimumReleaseAge: 1440 linkWorkspacePackages: true preferWorkspacePackages: true blockExoticSubdeps: true trustPolicy: 'no-downgrade' trustPolicyExclude: - - 'vite@6.4.1' + - 'vite@6.4.1' # Socket score 94/100; popular and healthy. + - 'semver@5.7.2' # Socket score 100/100; popular and healthy. + - 'semver@6.3.1' # Socket score 100/100; popular and healthy. + - 'ua-parser-js@1.0.41' # Socket score 100/100; popular and healthy. + - 'undici-types@6.21.0' # Socket score 100/100; popular and healthy. packages: - 'packages/*' @@ -64,4 +69,3 @@ allowBuilds: # nextJs sharp: false # not directly required for build - From 0298c909c075ce19ddde3855ac1e6ddb30845c85 Mon Sep 17 00:00:00 2001 From: Jonghyeon Ko Date: Fri, 26 Jun 2026 00:44:23 +0900 Subject: [PATCH 14/97] test(query-core): keep setQueryData typecheck green on TypeScript 5.4 (#10985) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under TypeScript 5.4, `NoInfer` can't match an inline object literal against the value branch of the `Updater` union in `setQueryData`, so it falls back to the function branch and reports the literal as excess properties (TS2353). TS >= 5.5 handles it correctly. This surfaces in the `test:types:ts54` legacy typecheck via the project reference chain (e.g. react-query-persist-client / react-query-devtools build query-core's test sources). It is normally masked by the Nx remote cache and only re-runs — and fails — when a dependent package's type inputs change, so it can land on `main` unnoticed. Annotate the value before passing it to `setQueryData` to sidestep the 5.4 limitation while preserving the assertions. Verified across TS 5.4–6.0. Co-authored-by: Claude Opus 4.8 --- packages/query-core/src/__tests__/queryClient.test-d.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/query-core/src/__tests__/queryClient.test-d.tsx b/packages/query-core/src/__tests__/queryClient.test-d.tsx index 4cd092ddd64..866d1d5f775 100644 --- a/packages/query-core/src/__tests__/queryClient.test-d.tsx +++ b/packages/query-core/src/__tests__/queryClient.test-d.tsx @@ -283,7 +283,12 @@ describe('fully typed usage', () => { Array<[ReadonlyArray, unknown]> >() - const queryData3 = queryClient.setQueryData(filterKey, { foo: '' }) + // Type the value before passing it: TypeScript 5.4's `NoInfer` can't match + // an inline object literal against the value branch of the `Updater` union + // here, so it falls back to the function branch and reports the literal as + // excess properties. Annotating sidesteps that (TS >= 5.5 handles it). + const newData: TData = { foo: '' } + const queryData3 = queryClient.setQueryData(filterKey, newData) type SetQueryDataUpdaterArg = Parameters< typeof queryClient.setQueryData >[1] From fcdcf8ac080406cabfcd3daf1dcdc2daefde943b Mon Sep 17 00:00:00 2001 From: Hojeong Park Date: Fri, 26 Jun 2026 01:56:53 +0900 Subject: [PATCH 15/97] fix(svelte-query/containers): fix typo from 'Tanstack' to 'TanStack' (#10722) Co-authored-by: Jonghyeon Ko --- packages/svelte-query/src/containers.svelte.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte-query/src/containers.svelte.ts b/packages/svelte-query/src/containers.svelte.ts index 60d27c68431..df602bcb289 100644 --- a/packages/svelte-query/src/containers.svelte.ts +++ b/packages/svelte-query/src/containers.svelte.ts @@ -94,7 +94,7 @@ export function createRawRef>( } for (const key of newKeys) { // @ts-expect-error - // This craziness is required because Tanstack Query defines getters for all of the keys on the object. + // This craziness is required because TanStack Query defines getters for all of the keys on the object. // These getters track property access, so if we access all of them here, we'll end up tracking everything. // So we wrap the property access in a special function that we can identify later to lazily access the value. // (See above) From e6ad3fc404127b8fcda56e819cc4cab4ca42a9f8 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Fri, 26 Jun 2026 07:09:58 -0500 Subject: [PATCH 16/97] fix(release): avoid pre dist tag for prereleases (#10986) --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8f950f033ad..845e85d2de8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,7 +39,6 @@ jobs: BRANCH="${GITHUB_REF_NAME}" if [[ "$BRANCH" == *-pre ]]; then echo "prerelease=true" >> "$GITHUB_OUTPUT" - echo "tag=pre" >> "$GITHUB_OUTPUT" elif [[ "$BRANCH" == *-maint ]]; then echo "tag=maint" >> "$GITHUB_OUTPUT" elif [[ "$BRANCH" =~ ^v[0-9]+$ ]]; then From 0b6b8273897ca3721b92a2d9feaf6559033e3622 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 27 Jun 2026 18:21:06 +0900 Subject: [PATCH 17/97] test(svelte-query/containers): add test for deleting a non-existent property (#10992) --- packages/svelte-query/tests/containers.svelte.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/svelte-query/tests/containers.svelte.test.ts b/packages/svelte-query/tests/containers.svelte.test.ts index 3511dbb5b5d..c2ed0e3f2e4 100644 --- a/packages/svelte-query/tests/containers.svelte.test.ts +++ b/packages/svelte-query/tests/containers.svelte.test.ts @@ -198,6 +198,13 @@ describe('createRawRef', () => { expect(ref).toEqual([7, 8, 9]) }) + it('should return `false` when deleting a property that does not exist', () => { + const [ref] = createRawRef>({ a: 1, b: 2 }) + + expect(Reflect.deleteProperty(ref, 'c')).toBe(false) + expect(ref).toEqual({ a: 1, b: 2 }) + }) + it('should behave like a regular object when not using `update`', () => { const [ref] = createRawRef>({ a: 1, b: 2 }) From 1f84256a2e5967882f65fd2b26e6b67b33a7fdd9 Mon Sep 17 00:00:00 2001 From: Jonghyeon Ko Date: Sat, 27 Jun 2026 22:30:15 +0900 Subject: [PATCH 18/97] docs: document the `select` typing caveat for parallel-queries hooks (#10984) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inlining a `select` on a query object passed to `useQueries` / `useSuspenseQueries` can't infer its `data` argument from the sibling `queryFn` and falls back to `unknown` — a known TypeScript limitation (TanStack/query#6556). Document the two workarounds (annotate the `select` parameter, or define the query with the `queryOptions` helper) in the React docs, and add type tests guarding the behavior. Scoped to React for an easier review; the other framework adapters can follow the same pattern in separate PRs. Co-authored-by: Claude Opus 4.8 --- .../react/guides/parallel-queries.md | 5 + docs/framework/react/reference/useQueries.md | 78 ++++++++ .../react/reference/useSuspenseQueries.md | 2 + .../src/__tests__/useQueries.test-d.tsx | 169 ++++++++++++++++++ .../__tests__/useSuspenseQueries.test-d.tsx | 169 ++++++++++++++++++ 5 files changed, 423 insertions(+) diff --git a/docs/framework/react/guides/parallel-queries.md b/docs/framework/react/guides/parallel-queries.md index 5d078b134ea..83e70f46f2b 100644 --- a/docs/framework/react/guides/parallel-queries.md +++ b/docs/framework/react/guides/parallel-queries.md @@ -56,3 +56,8 @@ function App({ users }) { ``` [//]: # 'Example2' +[//]: # 'TypeScriptSelect' + +> When using TypeScript, an inline `select` written on a query object passed to `useQueries` can't infer its `data` argument from that same object's `queryFn` — it falls back to `unknown`. Annotate the `select` parameter explicitly, or define the query with the [`queryOptions`](../reference/queryOptions.md) helper, to keep type inference. See [this known limitation](https://github.com/TanStack/query/issues/6556). + +[//]: # 'TypeScriptSelect' diff --git a/docs/framework/react/reference/useQueries.md b/docs/framework/react/reference/useQueries.md index d41a73a2b1c..1048b532d29 100644 --- a/docs/framework/react/reference/useQueries.md +++ b/docs/framework/react/reference/useQueries.md @@ -65,3 +65,81 @@ The `combine` function will only re-run if: - any of the query results changed This means that an inlined `combine` function, as shown above, will run on every render. To avoid this, you can wrap the `combine` function in `useCallback`, or extract it to a stable function reference if it doesn't have any dependencies. + +## TypeScript: typing the `select` option + +Unlike `useQuery`, `useQueries` cannot infer the `data` argument of an _inline_ `select` from its sibling `queryFn`. Because `useQueries` infers the type of the whole `queries` array at once, the `select` parameter of a query object written inline cannot be contextually typed from that same object's `queryFn`, so it falls back to `unknown`. This is a [known TypeScript limitation](https://github.com/TanStack/query/issues/6556). + +```tsx +useQueries({ + queries: [ + { + queryKey: ['post', 1], + queryFn: () => fetchPost(1), + // ❌ `data` is `unknown` here + select: (data) => data.title, + }, + ], +}) +``` + +There are two supported workarounds: + +1. Annotate the `select` parameter explicitly: + +```tsx +useQueries({ + queries: [ + { + queryKey: ['post', 1], + queryFn: () => fetchPost(1), + // ✅ `data` is `Post` + select: (data: Post) => data.title, + }, + ], +}) +``` + +2. Define the query with the [`queryOptions`](./queryOptions.md) helper, which resolves its types in a single object _before_ it reaches `useQueries`: + +```tsx +const postOptions = (id: number) => + queryOptions({ + queryKey: ['post', id], + queryFn: () => fetchPost(id), + // ✅ `data` is `Post` + select: (data) => data.title, + }) + +useQueries({ queries: [postOptions(1), postOptions(2)] }) +``` + +The same limitation applies when you spread a `queryOptions` result to override its `select` inline — the overriding `select` still falls back to `unknown`: + +```tsx +useQueries({ + queries: [ + { + ...postOptions(1), + // ❌ `data` is `unknown` here + select: (data) => data.title, + }, + ], +}) +``` + +Wrap the spread in `queryOptions` again so the override is resolved before it reaches `useQueries`: + +```tsx +useQueries({ + queries: [ + queryOptions({ + ...postOptions(1), + // ✅ `data` is `Post` + select: (data) => data.title, + }), + ], +}) +``` + +The same applies to [`useSuspenseQueries`](./useSuspenseQueries.md). diff --git a/docs/framework/react/reference/useSuspenseQueries.md b/docs/framework/react/reference/useSuspenseQueries.md index 702d791ee48..5d106da3e9a 100644 --- a/docs/framework/react/reference/useSuspenseQueries.md +++ b/docs/framework/react/reference/useSuspenseQueries.md @@ -16,6 +16,8 @@ The same as for [useQueries](./useQueries.md), except that each `query` can't ha - `enabled` - `placeholderData` +> The [`select` typing caveat](./useQueries.md#typescript-typing-the-select-option) for `useQueries` applies here as well: annotate the `select` parameter or use the [`queryOptions`](./queryOptions.md) helper to keep type inference. + **Returns** Same structure as [useQueries](./useQueries.md), except that for each `query`: diff --git a/packages/react-query/src/__tests__/useQueries.test-d.tsx b/packages/react-query/src/__tests__/useQueries.test-d.tsx index 32f1d566269..e4bd6497668 100644 --- a/packages/react-query/src/__tests__/useQueries.test-d.tsx +++ b/packages/react-query/src/__tests__/useQueries.test-d.tsx @@ -868,4 +868,173 @@ describe('useQueries', () => { } }) }) + + describe('select', () => { + // Inferring the `select` argument of an *inline* query object from its + // sibling `queryFn` is a known TypeScript limitation, because `useQueries` + // infers its array generic from the argument itself. The two supported + // workarounds are to annotate the `select` parameter, or to define the + // query with the `queryOptions` helper. + // https://github.com/TanStack/query/issues/6556 + + describe('without queryOptions (inline query object)', () => { + it('leaves the select argument as `unknown` without an annotation', () => { + useQueries({ + queries: [ + { + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => { + expectTypeOf(data).toBeUnknown() + // @ts-expect-error `data` is `unknown`, not the expected `number` + return data.toFixed() + }, + }, + ], + }) + }) + + it('infers the result when the select parameter is annotated', () => { + const queryResults = useQueries({ + queries: [ + { + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data: number) => data.toFixed(), + }, + ], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + }) + + describe('with queryOptions passed directly', () => { + it('without select, infers the queryFn data as the result', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }) + const queryResults = useQueries({ queries: [options] }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + + it('with select, infers the select argument and the result', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => { + expectTypeOf(data).toEqualTypeOf() + return data.toFixed() + }, + }) + const queryResults = useQueries({ queries: [options] }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + + it('infers select when a base queryOptions is re-wrapped with queryOptions', () => { + const baseOptions = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }) + const queryResults = useQueries({ + queries: [ + queryOptions({ + ...baseOptions, + select: (data) => { + expectTypeOf(data).toEqualTypeOf() + return data.toFixed() + }, + }), + baseOptions, + ], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + expectTypeOf(queryResults[1].data).toEqualTypeOf() + }) + + it('infers an overriding select when a queryOptions with a select is re-wrapped with queryOptions', () => { + const baseOptions = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => data + 1, + }) + const queryResults = useQueries({ + queries: [ + queryOptions({ + ...baseOptions, + select: (data) => { + expectTypeOf(data).toEqualTypeOf() + return data.toFixed() + }, + }), + ], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + }) + + describe('with queryOptions spread into an inline query object', () => { + it('without select in the factory, leaves an unannotated select as `unknown`', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }) + useQueries({ + queries: [ + // @ts-expect-error Without an annotation the inline `select` receives `data: unknown`, which makes the whole spread query object unassignable to the expected options type + { + ...options, + select: (data) => { + expectTypeOf(data).toBeUnknown() + return data + }, + }, + ], + }) + }) + + it('without select in the factory, an annotated select compiles', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }) + const queryResults = useQueries({ + queries: [{ ...options, select: (data: number) => data.toFixed() }], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + + it('with select in the factory, leaves an unannotated overriding select as `unknown`', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => data + 1, + }) + useQueries({ + queries: [ + // @ts-expect-error Without an annotation the inline `select` receives `data: unknown`, which makes the whole spread query object unassignable to the expected options type + { + ...options, + select: (data) => { + expectTypeOf(data).toBeUnknown() + return data + }, + }, + ], + }) + }) + + it('with select in the factory, an annotated overriding select compiles', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => data + 1, + }) + const queryResults = useQueries({ + queries: [{ ...options, select: (data: number) => data.toFixed() }], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + }) + }) }) diff --git a/packages/react-query/src/__tests__/useSuspenseQueries.test-d.tsx b/packages/react-query/src/__tests__/useSuspenseQueries.test-d.tsx index 98bf336c8df..d9230bdf940 100644 --- a/packages/react-query/src/__tests__/useSuspenseQueries.test-d.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQueries.test-d.tsx @@ -254,4 +254,173 @@ describe('UseSuspenseQueries config object overload', () => { }), ) }) + + describe('select', () => { + // Inferring the `select` argument of an *inline* query object from its + // sibling `queryFn` is a known TypeScript limitation, because + // `useSuspenseQueries` infers its array generic from the argument itself. + // The two supported workarounds are to annotate the `select` parameter, or + // to define the query with the `queryOptions` helper. + // https://github.com/TanStack/query/issues/6556 + + describe('without queryOptions (inline query object)', () => { + it('leaves the select argument as `unknown` without an annotation', () => { + useSuspenseQueries({ + queries: [ + { + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => { + expectTypeOf(data).toBeUnknown() + // @ts-expect-error `data` is `unknown`, not the expected `number` + return data.toFixed() + }, + }, + ], + }) + }) + + it('infers the result when the select parameter is annotated', () => { + const queryResults = useSuspenseQueries({ + queries: [ + { + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data: number) => data.toFixed(), + }, + ], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + }) + + describe('with queryOptions passed directly', () => { + it('without select, infers the queryFn data as the result', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }) + const queryResults = useSuspenseQueries({ queries: [options] }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + + it('with select, infers the select argument and the result', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => { + expectTypeOf(data).toEqualTypeOf() + return data.toFixed() + }, + }) + const queryResults = useSuspenseQueries({ queries: [options] }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + + it('infers select when a base queryOptions is re-wrapped with queryOptions', () => { + const baseOptions = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }) + const queryResults = useSuspenseQueries({ + queries: [ + queryOptions({ + ...baseOptions, + select: (data) => { + expectTypeOf(data).toEqualTypeOf() + return data.toFixed() + }, + }), + baseOptions, + ], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + expectTypeOf(queryResults[1].data).toEqualTypeOf() + }) + + it('infers an overriding select when a queryOptions with a select is re-wrapped with queryOptions', () => { + const baseOptions = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => data + 1, + }) + const queryResults = useSuspenseQueries({ + queries: [ + queryOptions({ + ...baseOptions, + select: (data) => { + expectTypeOf(data).toEqualTypeOf() + return data.toFixed() + }, + }), + ], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + }) + + describe('with queryOptions spread into an inline query object', () => { + it('without select in the factory, leaves an unannotated select untyped', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }) + useSuspenseQueries({ + queries: [ + { + ...options, + // @ts-expect-error Without an annotation the inline `select` parameter `data` implicitly has type `any` + select: (data) => { + expectTypeOf(data).toBeAny() + return data + }, + }, + ], + }) + }) + + it('without select in the factory, an annotated select compiles', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + }) + const queryResults = useSuspenseQueries({ + queries: [{ ...options, select: (data: number) => data.toFixed() }], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + + it('with select in the factory, leaves an unannotated overriding select untyped', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => data + 1, + }) + useSuspenseQueries({ + queries: [ + { + ...options, + // @ts-expect-error Without an annotation the inline `select` parameter `data` implicitly has type `any` + select: (data) => { + expectTypeOf(data).toBeAny() + return data + }, + }, + ], + }) + }) + + it('with select in the factory, an annotated overriding select compiles', () => { + const options = queryOptions({ + queryKey: queryKey(), + queryFn: () => Promise.resolve(1), + select: (data) => data + 1, + }) + const queryResults = useSuspenseQueries({ + queries: [{ ...options, select: (data: number) => data.toFixed() }], + }) + expectTypeOf(queryResults[0].data).toEqualTypeOf() + }) + }) + }) }) From fd495f23159581c74556dee4d80aec5a0bad9b41 Mon Sep 17 00:00:00 2001 From: Benjamin Eckstein <13351939+benjamineckstein@users.noreply.github.com> Date: Sat, 27 Jun 2026 15:32:07 +0200 Subject: [PATCH 19/97] docs: add @codewithagents/openapi-react-query to community resources (#10974) --- docs/community-resources.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/community-resources.md b/docs/community-resources.md index 3ce503b41a5..50753a36ad6 100644 --- a/docs/community-resources.md +++ b/docs/community-resources.md @@ -140,6 +140,11 @@ others: url: 'https://www.kubb.dev/', description: 'Generate SDKs for all your APIs', }, + { + title: '@codewithagents/openapi-react-query', + url: 'https://github.com/codewithagents/openapi-zod-ts', + description: 'Generate fully typed TanStack/React Query v5 hooks from an OpenAPI 3.1 spec, with Zod v4 runtime validation and an end-to-end pipeline (client, mocks, server).', + }, { title: 'OpenAPI codegen', url: 'https://github.com/fabien0102/openapi-codegen', From ac7a42d6a40622e899d50f419488061b87b2abe3 Mon Sep 17 00:00:00 2001 From: Poetry Of Code <101225909+poetryofcode@users.noreply.github.com> Date: Sat, 27 Jun 2026 09:40:35 -0400 Subject: [PATCH 20/97] docs(svelte): replace deprecated isLoading with isPending in overview (#10990) `isLoading` is a deprecated alias for `isPending && isFetching` and is scheduled for removal in the next major version. The overview example shows a standard (always-enabled) query, so `isPending` is the correct flag. All other framework overview docs (React, Vue, Angular, Lit, Preact) already use `isPending`. Note: `isLoading` is intentionally retained in disabling-queries guides where it is the right flag for disabled/lazy queries. Co-authored-by: Claude Sonnet 4.6 --- docs/framework/svelte/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/framework/svelte/overview.md b/docs/framework/svelte/overview.md index 8be6de78d34..980718456d1 100644 --- a/docs/framework/svelte/overview.md +++ b/docs/framework/svelte/overview.md @@ -37,7 +37,7 @@ Then call any function (e.g. createQuery) from any component:
- {#if query.isLoading} + {#if query.isPending}

Loading...

{:else if query.isError}

Error: {query.error.message}

From 661c1afe79751190e385816a54eeeb3fd4802f53 Mon Sep 17 00:00:00 2001 From: Poetry Of Code <101225909+poetryofcode@users.noreply.github.com> Date: Sat, 27 Jun 2026 09:45:37 -0400 Subject: [PATCH 21/97] docs(preact): add polling guide (#10991) * docs(svelte): replace deprecated isLoading with isPending in overview `isLoading` is a deprecated alias for `isPending && isFetching` and is scheduled for removal in the next major version. The overview example shows a standard (always-enabled) query, so `isPending` is the correct flag. All other framework overview docs (React, Vue, Angular, Lit, Preact) already use `isPending`. Note: `isLoading` is intentionally retained in disabling-queries guides where it is the right flag for disabled/lazy queries. Co-Authored-By: Claude Sonnet 4.6 * docs(preact): add missing polling guide The Polling guide existed for React, Vue, Solid, and Angular but was missing from the Preact docs. Added the ref stub and wired it into the nav config between Window Focus Refetching and Disabling Queries, matching the ordering used by all other frameworks. Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- docs/config.json | 4 ++++ docs/framework/preact/guides/polling.md | 6 ++++++ 2 files changed, 10 insertions(+) create mode 100644 docs/framework/preact/guides/polling.md diff --git a/docs/config.json b/docs/config.json index 2b1561d691a..a68832565dc 100644 --- a/docs/config.json +++ b/docs/config.json @@ -864,6 +864,10 @@ "label": "Window Focus Refetching", "to": "framework/preact/guides/window-focus-refetching" }, + { + "label": "Polling", + "to": "framework/preact/guides/polling" + }, { "label": "Disabling/Pausing Queries", "to": "framework/preact/guides/disabling-queries" diff --git a/docs/framework/preact/guides/polling.md b/docs/framework/preact/guides/polling.md new file mode 100644 index 00000000000..1421f4c30b1 --- /dev/null +++ b/docs/framework/preact/guides/polling.md @@ -0,0 +1,6 @@ +--- +id: polling +title: Polling +ref: docs/framework/react/guides/polling.md +replace: { '@tanstack/react-query': '@tanstack/preact-query' } +--- From b03390bfc85ddc0b4347fc95c97159bb6d0c8027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Sat, 27 Jun 2026 17:05:59 +0200 Subject: [PATCH 22/97] docs: add Deno to installation instructions (#10971) docs: add Deno to install instructions --- docs/framework/react/installation.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/framework/react/installation.md b/docs/framework/react/installation.md index f87d92817ef..d4ff6706f55 100644 --- a/docs/framework/react/installation.md +++ b/docs/framework/react/installation.md @@ -31,6 +31,12 @@ or bun add @tanstack/react-query ``` +or + +```bash +deno add @tanstack/react-query +``` + [//]: # 'Compatibility' React Query is compatible with React v18+ and works with ReactDOM and React Native. From 9cb8eac3fb86ed58bbe69ef6000a06c3c8ff339c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Dorfmeister=20=F0=9F=94=AE?= Date: Sat, 27 Jun 2026 21:21:47 +0200 Subject: [PATCH 23/97] fix: lit produces dist-js which needs to be a prod build output (#10995) --- nx.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nx.json b/nx.json index 143d6f40de3..5b9d0cb8162 100644 --- a/nx.json +++ b/nx.json @@ -69,7 +69,11 @@ "cache": true, "dependsOn": ["^build"], "inputs": ["production", "^production"], - "outputs": ["{projectRoot}/build", "{projectRoot}/dist"] + "outputs": [ + "{projectRoot}/build", + "{projectRoot}/dist", + "{projectRoot}/dist-cjs" + ] }, "test:build": { "cache": true, From 25cdd975fed4703d2ca5b600ca5ccd2b600b3dd8 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 28 Jun 2026 04:39:30 +0900 Subject: [PATCH 24/97] fix(query-devtools/utils): make 'last updated' sort return 0 for queries with equal 'dataUpdatedAt' to follow the standard comparator contract (#10812) --- .changeset/devtools-date-sort-equal-timestamps.md | 5 +++++ packages/query-devtools/src/__tests__/utils.test.ts | 7 +++++++ packages/query-devtools/src/utils.tsx | 6 ++++-- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 .changeset/devtools-date-sort-equal-timestamps.md diff --git a/.changeset/devtools-date-sort-equal-timestamps.md b/.changeset/devtools-date-sort-equal-timestamps.md new file mode 100644 index 00000000000..226fbbc7bc4 --- /dev/null +++ b/.changeset/devtools-date-sort-equal-timestamps.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-devtools': patch +--- + +fix(query-devtools/utils): make 'last updated' sort return 0 for queries with equal 'dataUpdatedAt' to follow the standard comparator contract diff --git a/packages/query-devtools/src/__tests__/utils.test.ts b/packages/query-devtools/src/__tests__/utils.test.ts index 511553e2bb8..688a87654eb 100644 --- a/packages/query-devtools/src/__tests__/utils.test.ts +++ b/packages/query-devtools/src/__tests__/utils.test.ts @@ -1076,6 +1076,13 @@ describe('Utils tests', () => { expect(dateSort(older, newer)).toBe(1) expect(dateSort(newer, older)).toBe(-1) }) + + it('should return 0 when both queries share the same "dataUpdatedAt"', () => { + const a = buildQuery(['a'], { dataUpdatedAt: 100 }) + const b = buildQuery(['b'], { dataUpdatedAt: 100 }) + + expect(dateSort(a, b)).toBe(0) + }) }) describe("'query hash'", () => { diff --git a/packages/query-devtools/src/utils.tsx b/packages/query-devtools/src/utils.tsx index 5306f2cf5f2..4a23b157575 100644 --- a/packages/query-devtools/src/utils.tsx +++ b/packages/query-devtools/src/utils.tsx @@ -101,8 +101,10 @@ const getStatusRank = (q: Query) => const queryHashSort: SortFn = (a, b) => a.queryHash.localeCompare(b.queryHash) -const dateSort: SortFn = (a, b) => - a.state.dataUpdatedAt < b.state.dataUpdatedAt ? 1 : -1 +const dateSort: SortFn = (a, b) => { + const diff = b.state.dataUpdatedAt - a.state.dataUpdatedAt + return diff < 0 ? -1 : diff > 0 ? 1 : 0 +} const statusAndDateSort: SortFn = (a, b) => { if (getStatusRank(a) === getStatusRank(b)) { From f5bf180d933d8b8d9d9e7b845e55b26a3a413b07 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 28 Jun 2026 04:40:58 +0900 Subject: [PATCH 25/97] fix(query-devtools/PiPContext): reset 'pip_open' in 'localStore' from 'closePipWindow' so the auto-open createEffect does not reopen the window after a programmatic close (#10813) --- .../devtools-close-pip-window-localstorage.md | 5 +++++ .../src/__tests__/contexts/PiPContext.test.tsx | 16 ++++++++++++++++ .../query-devtools/src/contexts/PiPContext.tsx | 1 + 3 files changed, 22 insertions(+) create mode 100644 .changeset/devtools-close-pip-window-localstorage.md diff --git a/.changeset/devtools-close-pip-window-localstorage.md b/.changeset/devtools-close-pip-window-localstorage.md new file mode 100644 index 00000000000..16039f2982c --- /dev/null +++ b/.changeset/devtools-close-pip-window-localstorage.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-devtools': patch +--- + +fix(query-devtools/PiPContext): reset 'pip_open' in 'localStore' from 'closePipWindow' so the auto-open createEffect does not reopen the window after a programmatic close diff --git a/packages/query-devtools/src/__tests__/contexts/PiPContext.test.tsx b/packages/query-devtools/src/__tests__/contexts/PiPContext.test.tsx index 2eea2323f39..17a53b5bf35 100644 --- a/packages/query-devtools/src/__tests__/contexts/PiPContext.test.tsx +++ b/packages/query-devtools/src/__tests__/contexts/PiPContext.test.tsx @@ -312,6 +312,22 @@ describe('PiPContext', () => { expect(fakeWindow.close).toHaveBeenCalledTimes(1) }) + + it('should reset "pip_open" in "localStore" so the auto-open createEffect does not reopen the window', () => { + stubPipWindow() + + renderAndAct( + (pip) => { + pip().requestPipWindow(640, 480) + pip().closePipWindow() + }, + { disabled: true }, + ) + + expect(localStorage.getItem('TanstackQueryDevtools.pip_open')).toBe( + 'false', + ) + }) }) describe('"pip_open" auto-open createEffect', () => { diff --git a/packages/query-devtools/src/contexts/PiPContext.tsx b/packages/query-devtools/src/contexts/PiPContext.tsx index fb22c8be36a..fe42eef8f2f 100644 --- a/packages/query-devtools/src/contexts/PiPContext.tsx +++ b/packages/query-devtools/src/contexts/PiPContext.tsx @@ -41,6 +41,7 @@ export const PiPProvider = (props: PiPProviderProps) => { const w = pipWindow() if (w != null) { w.close() + props.setLocalStore('pip_open', 'false') setPipWindow(null) } } From 01c763444e3cf3dfa9744f13911aa1533cac3c29 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 28 Jun 2026 04:41:59 +0900 Subject: [PATCH 26/97] fix(query-devtools/Devtools): correct the Theme sub-trigger className from 'position' to 'theme' (#10811) --- .../devtools-theme-subtrigger-classname.md | 5 ++++ packages/query-devtools/src/Devtools.tsx | 2 +- .../src/__tests__/Devtools.test.tsx | 23 +++++++++---------- 3 files changed, 17 insertions(+), 13 deletions(-) create mode 100644 .changeset/devtools-theme-subtrigger-classname.md diff --git a/.changeset/devtools-theme-subtrigger-classname.md b/.changeset/devtools-theme-subtrigger-classname.md new file mode 100644 index 00000000000..3a4dfd57b07 --- /dev/null +++ b/.changeset/devtools-theme-subtrigger-classname.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-devtools': patch +--- + +fix(query-devtools/Devtools): correct the Theme sub-trigger className from 'position' to 'theme' diff --git a/packages/query-devtools/src/Devtools.tsx b/packages/query-devtools/src/Devtools.tsx index dfb66e496a7..e391fe91fcb 100644 --- a/packages/query-devtools/src/Devtools.tsx +++ b/packages/query-devtools/src/Devtools.tsx @@ -1192,7 +1192,7 @@ export const ContentView: Component = (props) => { class={cx( styles().settingsSubTrigger, 'tsqd-settings-menu-sub-trigger', - 'tsqd-settings-menu-sub-trigger-position', + 'tsqd-settings-menu-sub-trigger-theme', )} > Theme diff --git a/packages/query-devtools/src/__tests__/Devtools.test.tsx b/packages/query-devtools/src/__tests__/Devtools.test.tsx index 398bf61e316..5ed22c71816 100644 --- a/packages/query-devtools/src/__tests__/Devtools.test.tsx +++ b/packages/query-devtools/src/__tests__/Devtools.test.tsx @@ -1078,12 +1078,13 @@ describe('Devtools', () => { key: 'Enter', }) - const themeTrigger = Array.from( - document.querySelectorAll( - '.tsqd-settings-menu-sub-trigger', - ), - ).find((el) => String(el.textContent).includes('Theme')) - expect(themeTrigger).not.toBeUndefined() + const themeTrigger = document.querySelector( + '.tsqd-settings-menu-sub-trigger-theme', + ) + expect(themeTrigger).not.toBeNull() + expect(themeTrigger).not.toBe( + document.querySelector('.tsqd-settings-menu-sub-trigger-position'), + ) fireEvent.keyDown(themeTrigger!, { key: 'ArrowRight' }) expect( @@ -1098,12 +1099,10 @@ describe('Devtools', () => { key: 'Enter', }) - const themeTrigger = Array.from( - document.querySelectorAll( - '.tsqd-settings-menu-sub-trigger', - ), - ).find((el) => String(el.textContent).includes('Theme')) - expect(themeTrigger).not.toBeUndefined() + const themeTrigger = document.querySelector( + '.tsqd-settings-menu-sub-trigger-theme', + ) + expect(themeTrigger).not.toBeNull() fireEvent.keyDown(themeTrigger!, { key: 'ArrowRight' }) const themeMenu = document.querySelector( From ecd89c8faf7acc226f00633ea3a761d3ab842c1d Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 28 Jun 2026 04:43:19 +0900 Subject: [PATCH 27/97] fix(query-devtools/utils): scope the 'setupStyleSheet' dedup check to the target so a 'shadowDOMTarget' still receives its own '#_goober' style tag when 'document.head' already has one (#10815) --- .../devtools-setup-stylesheet-cross-target-dedup.md | 5 +++++ packages/query-devtools/src/__tests__/utils.test.ts | 13 +++++++++++++ packages/query-devtools/src/utils.tsx | 12 +++--------- 3 files changed, 21 insertions(+), 9 deletions(-) create mode 100644 .changeset/devtools-setup-stylesheet-cross-target-dedup.md diff --git a/.changeset/devtools-setup-stylesheet-cross-target-dedup.md b/.changeset/devtools-setup-stylesheet-cross-target-dedup.md new file mode 100644 index 00000000000..979db8513b7 --- /dev/null +++ b/.changeset/devtools-setup-stylesheet-cross-target-dedup.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-devtools': patch +--- + +fix(query-devtools/utils): scope the 'setupStyleSheet' dedup check to the target so a 'shadowDOMTarget' still receives its own '#_goober' style tag when 'document.head' already has one diff --git a/packages/query-devtools/src/__tests__/utils.test.ts b/packages/query-devtools/src/__tests__/utils.test.ts index 688a87654eb..42d6abc5f5f 100644 --- a/packages/query-devtools/src/__tests__/utils.test.ts +++ b/packages/query-devtools/src/__tests__/utils.test.ts @@ -1042,6 +1042,19 @@ describe('Utils tests', () => { expect(styleTags).toHaveLength(1) expect(styleTags[0]?.getAttribute('nonce')).toBe('first-nonce') }) + + it('should install the style tag into the "ShadowRoot" target even when "document.head" already has one', () => { + const host = document.createElement('div') + const shadow = host.attachShadow({ mode: 'open' }) + + setupStyleSheet('host-nonce') + setupStyleSheet('shadow-nonce', shadow) + + expect(shadow.querySelector('#_goober')).not.toBeNull() + expect(shadow.querySelector('#_goober')?.getAttribute('nonce')).toBe( + 'shadow-nonce', + ) + }) }) describe('sortFns', () => { diff --git a/packages/query-devtools/src/utils.tsx b/packages/query-devtools/src/utils.tsx index 4a23b157575..0046c2d42c2 100644 --- a/packages/query-devtools/src/utils.tsx +++ b/packages/query-devtools/src/utils.tsx @@ -308,18 +308,12 @@ export const deleteNestedDataByPath = ( // Adds a nonce to the style tag if needed export const setupStyleSheet = (nonce?: string, target?: ShadowRoot) => { if (!nonce) return - const styleExists = - document.querySelector('#_goober') || target?.querySelector('#_goober') - - if (styleExists) return + const root = target ?? document.head + if (root.querySelector('#_goober')) return const styleTag = document.createElement('style') const textNode = document.createTextNode('') styleTag.appendChild(textNode) styleTag.id = '_goober' styleTag.setAttribute('nonce', nonce) - if (target) { - target.appendChild(styleTag) - } else { - document.head.appendChild(styleTag) - } + root.appendChild(styleTag) } From ceec8f0a82258b5759160fa1cb7ef9dce669005b Mon Sep 17 00:00:00 2001 From: Li Duoyang Date: Sat, 27 Jun 2026 12:48:26 -0700 Subject: [PATCH 28/97] fix(devtools): add transform: translateZ(0) for Safari overflow rendering (#10638) Safari has a known issue where overflow: hidden with border-radius doesn't work correctly without hardware acceleration. Adding transform: translateZ(0) forces GPU compositing which fixes the icon rendering issue. Fixes #10633 --- packages/query-devtools/src/Devtools.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/query-devtools/src/Devtools.tsx b/packages/query-devtools/src/Devtools.tsx index e391fe91fcb..daff934932f 100644 --- a/packages/query-devtools/src/Devtools.tsx +++ b/packages/query-devtools/src/Devtools.tsx @@ -2745,6 +2745,8 @@ const stylesFactory = ( right: -8px; bottom: -8px; border-radius: 9999px; + -webkit-transform: translateZ(0); + transform: translateZ(0); & svg { position: absolute; From ad57c81fd32c26cdc6abd24324501178e0e270da Mon Sep 17 00:00:00 2001 From: Dmytro Borysov <4720760+dborysov@users.noreply.github.com> Date: Sat, 27 Jun 2026 21:50:32 +0200 Subject: [PATCH 29/97] docs(devtools): make markdown consistent (#10987) Currently there is a bug, which prevents proper rendering of the links if there are both MD & HTML syntax in the same line (see https://tanstack.com/query/latest/docs/framework/react/devtools), probably should be fixed in @tanstack/markdown. Not sure that the source code of this package is published? In the meantime, I just converted all links to html. Converting everything (logos) to markdown won't work because we need to set width/height, which can't be done in markdown --- docs/framework/angular/devtools.md | 6 +++--- docs/framework/preact/devtools.md | 6 +++--- docs/framework/react/devtools.md | 6 +++--- docs/framework/solid/devtools.md | 6 +++--- docs/framework/svelte/devtools.md | 6 +++--- docs/framework/vue/devtools.md | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/framework/angular/devtools.md b/docs/framework/angular/devtools.md index c0cfb9141c0..e02c328ccbb 100644 --- a/docs/framework/angular/devtools.md +++ b/docs/framework/angular/devtools.md @@ -5,9 +5,9 @@ title: Devtools > For Chrome, Firefox, and Edge users: Third-party browser extensions are available for debugging TanStack Query directly in browser DevTools. These provide the same functionality as the framework-specific devtools packages: > -> - Chrome logo [Devtools for Chrome](https://chromewebstore.google.com/detail/tanstack-query-devtools/annajfchloimdhceglpgglpeepfghfai) -> - Firefox logo [Devtools for Firefox](https://addons.mozilla.org/en-US/firefox/addon/tanstack-query-devtools/) -> - Edge logo [Devtools for Edge](https://microsoftedge.microsoft.com/addons/detail/tanstack-query-devtools/edmdpkgkacmjopodhfolmphdenmddobj) +> - Chrome logo Devtools for Chrome +> - Firefox logo Devtools for Firefox +> - Edge logo Devtools for Edge ## Enable devtools diff --git a/docs/framework/preact/devtools.md b/docs/framework/preact/devtools.md index 4fc60265dc4..509f51637d2 100644 --- a/docs/framework/preact/devtools.md +++ b/docs/framework/preact/devtools.md @@ -9,9 +9,9 @@ When you begin your Preact Query journey, you'll want these devtools by your sid > For Chrome, Firefox, and Edge users: Third-party browser extensions are available for debugging TanStack Query directly in browser DevTools. These provide the same functionality as the framework-specific devtools packages: > -> - Chrome logo [Devtools for Chrome](https://chromewebstore.google.com/detail/tanstack-query-devtools/annajfchloimdhceglpgglpeepfghfai) -> - Firefox logo [Devtools for Firefox](https://addons.mozilla.org/en-US/firefox/addon/tanstack-query-devtools/) -> - Edge logo [Devtools for Edge](https://microsoftedge.microsoft.com/addons/detail/tanstack-query-devtools/edmdpkgkacmjopodhfolmphdenmddobj) +> - Chrome logo Devtools for Chrome +> - Firefox logo Devtools for Firefox +> - Edge logo Devtools for Edge ## Install and Import the Devtools diff --git a/docs/framework/react/devtools.md b/docs/framework/react/devtools.md index ccdde019087..4c7b7d6d68b 100644 --- a/docs/framework/react/devtools.md +++ b/docs/framework/react/devtools.md @@ -9,9 +9,9 @@ When you begin your React Query journey, you'll want these devtools by your side > For Chrome, Firefox, and Edge users: Third-party browser extensions are available for debugging TanStack Query directly in browser DevTools. These provide the same functionality as the framework-specific devtools packages: > -> - Chrome logo [Devtools for Chrome](https://chromewebstore.google.com/detail/tanstack-query-devtools/annajfchloimdhceglpgglpeepfghfai) -> - Firefox logo [Devtools for Firefox](https://addons.mozilla.org/en-US/firefox/addon/tanstack-query-devtools/) -> - Edge logo [Devtools for Edge](https://microsoftedge.microsoft.com/addons/detail/tanstack-query-devtools/edmdpkgkacmjopodhfolmphdenmddobj) +> - Chrome logo Devtools for Chrome +> - Firefox logo Devtools for Firefox +> - Edge logo Devtools for Edge > For React Native users: A third-party native macOS app is available for debugging React Query in ANY js-based application. Monitor queries across devices in real-time. Check it out here: [rn-better-dev-tools](https://github.com/LovesWorking/rn-better-dev-tools) diff --git a/docs/framework/solid/devtools.md b/docs/framework/solid/devtools.md index b6a2cca2480..9f5f0945ce2 100644 --- a/docs/framework/solid/devtools.md +++ b/docs/framework/solid/devtools.md @@ -9,9 +9,9 @@ When you begin your Solid Query journey, you'll want these devtools by your side > For Chrome, Firefox, and Edge users: Third-party browser extensions are available for debugging TanStack Query directly in browser DevTools. These provide the same functionality as the framework-specific devtools packages: > -> - Chrome logo [Devtools for Chrome](https://chromewebstore.google.com/detail/tanstack-query-devtools/annajfchloimdhceglpgglpeepfghfai) -> - Firefox logo [Devtools for Firefox](https://addons.mozilla.org/en-US/firefox/addon/tanstack-query-devtools/) -> - Edge logo [Devtools for Edge](https://microsoftedge.microsoft.com/addons/detail/tanstack-query-devtools/edmdpkgkacmjopodhfolmphdenmddobj) +> - Chrome logo Devtools for Chrome +> - Firefox logo Devtools for Firefox +> - Edge logo Devtools for Edge ## Install and Import the Devtools diff --git a/docs/framework/svelte/devtools.md b/docs/framework/svelte/devtools.md index 179690c2a63..e0465a5fab0 100644 --- a/docs/framework/svelte/devtools.md +++ b/docs/framework/svelte/devtools.md @@ -5,9 +5,9 @@ title: Devtools > For Chrome, Firefox, and Edge users: Third-party browser extensions are available for debugging TanStack Query directly in browser DevTools. These provide the same functionality as the framework-specific devtools packages: > -> - Chrome logo [Devtools for Chrome](https://chromewebstore.google.com/detail/tanstack-query-devtools/annajfchloimdhceglpgglpeepfghfai) -> - Firefox logo [Devtools for Firefox](https://addons.mozilla.org/en-US/firefox/addon/tanstack-query-devtools/) -> - Edge logo [Devtools for Edge](https://microsoftedge.microsoft.com/addons/detail/tanstack-query-devtools/edmdpkgkacmjopodhfolmphdenmddobj) +> - Chrome logo Devtools for Chrome +> - Firefox logo Devtools for Firefox +> - Edge logo Devtools for Edge ## Install and Import the Devtools diff --git a/docs/framework/vue/devtools.md b/docs/framework/vue/devtools.md index a32a5e0f5ba..cbba672f90f 100644 --- a/docs/framework/vue/devtools.md +++ b/docs/framework/vue/devtools.md @@ -9,9 +9,9 @@ When you begin your Vue Query journey, you'll want these devtools by your side. > For Chrome, Firefox, and Edge users: Third-party browser extensions are available for debugging TanStack Query directly in browser DevTools. These provide the same functionality as the framework-specific devtools packages: > -> - Chrome logo [Devtools for Chrome](https://chromewebstore.google.com/detail/tanstack-query-devtools/annajfchloimdhceglpgglpeepfghfai) -> - Firefox logo [Devtools for Firefox](https://addons.mozilla.org/en-US/firefox/addon/tanstack-query-devtools/) -> - Edge logo [Devtools for Edge](https://microsoftedge.microsoft.com/addons/detail/tanstack-query-devtools/edmdpkgkacmjopodhfolmphdenmddobj) +> - Chrome logo Devtools for Chrome +> - Firefox logo Devtools for Firefox +> - Edge logo Devtools for Edge ## Component based Devtools (Vue 3) From a4587b64ce06aabed6c51f9e610681be0ed94521 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 28 Jun 2026 05:03:14 +0900 Subject: [PATCH 30/97] test(query-core/hydration): replace 'vi.waitFor' with 'vi.advanceTimersByTimeAsync' and use 'queryKey' helper for infinite query tests (#10944) --- .../src/__tests__/hydration.test.tsx | 264 +++++++++--------- 1 file changed, 135 insertions(+), 129 deletions(-) diff --git a/packages/query-core/src/__tests__/hydration.test.tsx b/packages/query-core/src/__tests__/hydration.test.tsx index 0b6cfb7471f..606e05d236d 100644 --- a/packages/query-core/src/__tests__/hydration.test.tsx +++ b/packages/query-core/src/__tests__/hydration.test.tsx @@ -1387,29 +1387,30 @@ describe('dehydration and rehydration', () => { }) it('should preserve queryType for infinite queries during hydration', async () => { + const key = queryKey() const queryCache = new QueryCache() const queryClient = new QueryClient({ queryCache }) - await vi.waitFor(() => - queryClient.prefetchInfiniteQuery({ - queryKey: ['infinite'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - items: [`page-${pageParam}`], - nextCursor: pageParam + 1, - })), - initialPageParam: 0, - getNextPageParam: (lastPage: { - items: Array - nextCursor: number - }) => lastPage.nextCursor, - }), - ) + const prefetchPromise = queryClient.prefetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + items: [`page-${pageParam}`], + nextCursor: pageParam + 1, + })), + initialPageParam: 0, + getNextPageParam: (lastPage: { + items: Array + nextCursor: number + }) => lastPage.nextCursor, + }) + await vi.advanceTimersByTimeAsync(10) + await prefetchPromise const dehydrated = dehydrate(queryClient) const infiniteQueryState = dehydrated.queries.find( - (q) => q.queryKey[0] === 'infinite', + (q) => q.queryKey[0] === key[0], ) expect(infiniteQueryState?.queryType).toBe('infinite') @@ -1417,7 +1418,7 @@ describe('dehydration and rehydration', () => { const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, dehydrated) - const hydratedQuery = hydrationCache.find({ queryKey: ['infinite'] }) + const hydratedQuery = hydrationCache.find({ queryKey: key }) expect(hydratedQuery?.state.data).toBeDefined() expect(hydratedQuery?.state.data).toHaveProperty('pages') expect(hydratedQuery?.state.data).toHaveProperty('pageParams') @@ -1425,22 +1426,23 @@ describe('dehydration and rehydration', () => { }) it('should attach infiniteQueryBehavior during hydration', async () => { + const key = queryKey() const queryCache = new QueryCache() const queryClient = new QueryClient({ queryCache }) - await vi.waitFor(() => - queryClient.prefetchInfiniteQuery({ - queryKey: ['infinite-with-behavior'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - data: `page-${pageParam}`, - next: pageParam + 1, - })), - initialPageParam: 0, - getNextPageParam: (lastPage: { data: string; next: number }) => - lastPage.next, - }), - ) + const prefetchPromise = queryClient.prefetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + data: `page-${pageParam}`, + next: pageParam + 1, + })), + initialPageParam: 0, + getNextPageParam: (lastPage: { data: string; next: number }) => + lastPage.next, + }) + await vi.advanceTimersByTimeAsync(10) + await prefetchPromise const dehydrated = dehydrate(queryClient) @@ -1448,45 +1450,46 @@ describe('dehydration and rehydration', () => { const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, dehydrated) - const result = await vi.waitFor(() => - hydrationClient.fetchInfiniteQuery({ - queryKey: ['infinite-with-behavior'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - data: `page-${pageParam}`, - next: pageParam + 1, - })), - initialPageParam: 0, - getNextPageParam: (lastPage: { data: string; next: number }) => - lastPage.next, - }), - ) + const resultPromise = hydrationClient.fetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + data: `page-${pageParam}`, + next: pageParam + 1, + })), + initialPageParam: 0, + getNextPageParam: (lastPage: { data: string; next: number }) => + lastPage.next, + }) + await vi.advanceTimersByTimeAsync(10) + const result = await resultPromise expect(result.pages).toHaveLength(1) expect(result.pageParams).toHaveLength(1) }) it('should restore infinite query type through dehydrate and hydrate cycle', async () => { + const key = queryKey() const serverClient = new QueryClient({ queryCache: new QueryCache() }) - await vi.waitFor(() => - serverClient.prefetchInfiniteQuery({ - queryKey: ['infinite-type-restore'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - items: [`item-${pageParam}`], - next: pageParam + 1, - })), - initialPageParam: 0, - getNextPageParam: (lastPage: { items: Array; next: number }) => - lastPage.next, - }), - ) + const prefetchPromise = serverClient.prefetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + items: [`item-${pageParam}`], + next: pageParam + 1, + })), + initialPageParam: 0, + getNextPageParam: (lastPage: { items: Array; next: number }) => + lastPage.next, + }) + await vi.advanceTimersByTimeAsync(10) + await prefetchPromise const dehydrated = dehydrate(serverClient) const dehydratedQuery = dehydrated.queries.find( - (q) => q.queryKey[0] === 'infinite-type-restore', + (q) => q.queryKey[0] === key[0], ) expect(dehydratedQuery?.queryType).toBe('infinite') @@ -1495,27 +1498,28 @@ describe('dehydration and rehydration', () => { hydrate(clientClient, dehydrated) const hydratedQuery = clientCache.find({ - queryKey: ['infinite-type-restore'], + queryKey: key, }) expect(hydratedQuery?.queryType).toBe('infinite') }) it('should preserve pages structure when refetching infinite query after hydration', async () => { + const key = queryKey() const serverClient = new QueryClient({ queryCache: new QueryCache() }) - await vi.waitFor(() => - serverClient.prefetchInfiniteQuery({ - queryKey: ['refetch'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - items: [`page-${pageParam}`], - next: pageParam + 1, - })), - initialPageParam: 0, - getNextPageParam: (lastPage: { items: Array; next: number }) => - lastPage.next, - }), - ) + const prefetchPromise = serverClient.prefetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + items: [`page-${pageParam}`], + next: pageParam + 1, + })), + initialPageParam: 0, + getNextPageParam: (lastPage: { items: Array; next: number }) => + lastPage.next, + }) + await vi.advanceTimersByTimeAsync(10) + await prefetchPromise const dehydrated = dehydrate(serverClient) @@ -1526,23 +1530,23 @@ describe('dehydration and rehydration', () => { const beforeRefetch = clientClient.getQueryData<{ pages: Array<{ items: Array; next: number }> pageParams: Array - }>(['refetch']) + }>(key) expect(beforeRefetch?.pages).toHaveLength(1) expect(beforeRefetch?.pageParams).toHaveLength(1) - const result = await vi.waitFor(() => - clientClient.fetchInfiniteQuery({ - queryKey: ['refetch'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - items: [`page-${pageParam}`], - next: pageParam + 1, - })), - initialPageParam: 0, - getNextPageParam: (lastPage: { items: Array; next: number }) => - lastPage.next, - }), - ) + const resultPromise = clientClient.fetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + items: [`page-${pageParam}`], + next: pageParam + 1, + })), + initialPageParam: 0, + getNextPageParam: (lastPage: { items: Array; next: number }) => + lastPage.next, + }) + await vi.advanceTimersByTimeAsync(10) + const result = await resultPromise expect(result).toHaveProperty('pages') expect(result).toHaveProperty('pageParams') @@ -1552,21 +1556,22 @@ describe('dehydration and rehydration', () => { }) it('should retain infinite query type after subsequent setOptions calls', async () => { + const key = queryKey() const serverClient = new QueryClient({ queryCache: new QueryCache() }) - await vi.waitFor(() => - serverClient.prefetchInfiniteQuery({ - queryKey: ['infinite-setoptions-guard'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - data: `p${pageParam}`, - next: pageParam + 1, - })), - initialPageParam: 0, - getNextPageParam: (lastPage: { data: string; next: number }) => - lastPage.next, - }), - ) + const prefetchPromise = serverClient.prefetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + data: `p${pageParam}`, + next: pageParam + 1, + })), + initialPageParam: 0, + getNextPageParam: (lastPage: { data: string; next: number }) => + lastPage.next, + }) + await vi.advanceTimersByTimeAsync(10) + await prefetchPromise const dehydrated = dehydrate(serverClient) @@ -1574,30 +1579,31 @@ describe('dehydration and rehydration', () => { const clientClient = new QueryClient({ queryCache: clientCache }) hydrate(clientClient, dehydrated) - const query = clientCache.find({ queryKey: ['infinite-setoptions-guard'] })! + const query = clientCache.find({ queryKey: key })! expect(query.queryType).toBe('infinite') - query.setOptions({ queryKey: ['infinite-setoptions-guard'] }) + query.setOptions({ queryKey: key }) expect(query.queryType).toBe('infinite') }) it('should restore all pages when refetching multi-page infinite query after hydration', async () => { + const key = queryKey() const serverClient = new QueryClient({ queryCache: new QueryCache() }) - await vi.waitFor(() => - serverClient.prefetchInfiniteQuery({ - queryKey: ['infinite-multipage-restore'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - items: [`item-${pageParam}`], - next: pageParam + 1, - })), - initialPageParam: 0, - pages: 2, - getNextPageParam: (lastPage: { items: Array; next: number }) => - lastPage.next, - }), - ) + const prefetchPromise = serverClient.prefetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + items: [`item-${pageParam}`], + next: pageParam + 1, + })), + initialPageParam: 0, + pages: 2, + getNextPageParam: (lastPage: { items: Array; next: number }) => + lastPage.next, + }) + await vi.advanceTimersByTimeAsync(20) + await prefetchPromise const dehydrated = dehydrate(serverClient) @@ -1608,23 +1614,23 @@ describe('dehydration and rehydration', () => { const beforeRefetch = clientClient.getQueryData<{ pages: Array pageParams: Array - }>(['infinite-multipage-restore']) + }>(key) expect(beforeRefetch?.pages).toHaveLength(2) - const result = await vi.waitFor(() => - clientClient.fetchInfiniteQuery({ - queryKey: ['infinite-multipage-restore'], - queryFn: async ({ pageParam }) => - sleep(0).then(() => ({ - items: [`item-${pageParam}`], - next: pageParam + 1, - })), - initialPageParam: 0, - pages: 2, - getNextPageParam: (lastPage: { items: Array; next: number }) => - lastPage.next, - }), - ) + const resultPromise = clientClient.fetchInfiniteQuery({ + queryKey: key, + queryFn: ({ pageParam }) => + sleep(10).then(() => ({ + items: [`item-${pageParam}`], + next: pageParam + 1, + })), + initialPageParam: 0, + pages: 2, + getNextPageParam: (lastPage: { items: Array; next: number }) => + lastPage.next, + }) + await vi.advanceTimersByTimeAsync(20) + const result = await resultPromise expect(result.pages).toHaveLength(2) expect(result.pageParams).toHaveLength(2) From 49012dbd5192dfe483d3b108b72ffaa7f2849e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Ba=C5=BCanow?= Date: Sat, 27 Jun 2026 22:12:25 +0200 Subject: [PATCH 31/97] fix(query-devtools): set window.__nonce__ in setupStyleSheet (#10736) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(query-devtools): set window.__nonce__ in setupStyleSheet * test(query-devtools): add tests for window.__nonce__ in setupStyleSheet * chore: add changeset * fix: merge conflicts * formatting * ci: apply automated fixes --------- Co-authored-by: Dominik Dorfmeister 🔮 Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .changeset/mighty-banks-mate.md | 7 +++++++ packages/query-devtools/src/__tests__/utils.test.ts | 13 +++++++++++++ packages/query-devtools/src/utils.tsx | 7 ++++++- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .changeset/mighty-banks-mate.md diff --git a/.changeset/mighty-banks-mate.md b/.changeset/mighty-banks-mate.md new file mode 100644 index 00000000000..3d36984f5f0 --- /dev/null +++ b/.changeset/mighty-banks-mate.md @@ -0,0 +1,7 @@ +--- +'@tanstack/query-devtools': patch +--- + +`setupStyleSheet` now sets `window.__nonce__` when a `styleNonce` is provided. + +The devtools use [goober](https://goober.js.org/) for CSS-in-JS, which reads `window.__nonce__` every time it creates or accesses its style element. Without this, goober overwrote the nonce with `undefined`, causing CSP violations even when `styleNonce` was correctly passed to ``. diff --git a/packages/query-devtools/src/__tests__/utils.test.ts b/packages/query-devtools/src/__tests__/utils.test.ts index 42d6abc5f5f..496594d63cd 100644 --- a/packages/query-devtools/src/__tests__/utils.test.ts +++ b/packages/query-devtools/src/__tests__/utils.test.ts @@ -982,6 +982,7 @@ describe('Utils tests', () => { describe('setupStyleSheet', () => { afterEach(() => { document.head.querySelector('#_goober')?.remove() + delete (window as any).__nonce__ }) it('should not insert any style tag when "nonce" is missing', () => { @@ -1055,6 +1056,18 @@ describe('Utils tests', () => { 'shadow-nonce', ) }) + + it('should set window.__nonce__ so goober preserves the nonce on its style element', () => { + setupStyleSheet('test-nonce') + + expect((window as any).__nonce__).toBe('test-nonce') + }) + + it('should not set window.__nonce__ when nonce is missing', () => { + setupStyleSheet() + + expect((window as any).__nonce__).toBeUndefined() + }) }) describe('sortFns', () => { diff --git a/packages/query-devtools/src/utils.tsx b/packages/query-devtools/src/utils.tsx index 0046c2d42c2..77247607af8 100644 --- a/packages/query-devtools/src/utils.tsx +++ b/packages/query-devtools/src/utils.tsx @@ -307,7 +307,12 @@ export const deleteNestedDataByPath = ( // Sets up the goober stylesheet // Adds a nonce to the style tag if needed export const setupStyleSheet = (nonce?: string, target?: ShadowRoot) => { - if (!nonce) return + if (!nonce) + return // Goober reads window.__nonce__ every time it creates or accesses its style + // element (el.nonce = window.__nonce__). Without this, goober overwrites the + // nonce we set on the pre-created element with undefined, clearing it. + ;(window as any).__nonce__ = nonce + const root = target ?? document.head if (root.querySelector('#_goober')) return const styleTag = document.createElement('style') From 610e8d1684614f63e13f5829ad4bc375782ff06d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 27 Jun 2026 22:28:10 +0200 Subject: [PATCH 32/97] ci: Version Packages (#10996) ci: changeset release Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../devtools-close-pip-window-localstorage.md | 5 - .../devtools-date-sort-equal-timestamps.md | 5 - ...ols-setup-stylesheet-cross-target-dedup.md | 5 - .../devtools-theme-subtrigger-classname.md | 5 - .changeset/mighty-banks-mate.md | 7 - examples/angular/auto-refetching/package.json | 2 +- examples/angular/basic-persister/package.json | 6 +- examples/angular/basic/package.json | 2 +- examples/angular/devtools-panel/package.json | 2 +- .../package.json | 2 +- .../angular/optimistic-updates/package.json | 2 +- examples/angular/pagination/package.json | 2 +- .../query-options-from-a-service/package.json | 2 +- examples/angular/router/package.json | 2 +- examples/angular/rxjs/package.json | 2 +- examples/angular/simple/package.json | 2 +- examples/lit/basic/package.json | 4 +- examples/lit/pagination/package.json | 4 +- examples/lit/ssr/package.json | 4 +- examples/preact/simple/package.json | 2 +- examples/react/algolia/package.json | 6 +- examples/react/auto-refetching/package.json | 4 +- .../react/basic-graphql-request/package.json | 4 +- examples/react/basic/package.json | 10 +- examples/react/chat/package.json | 4 +- .../react/default-query-function/package.json | 4 +- examples/react/devtools-panel/package.json | 4 +- examples/react/eslint-legacy/package.json | 10 +- .../react/eslint-plugin-demo/package.json | 4 +- .../package.json | 4 +- .../load-more-infinite-scroll/package.json | 4 +- .../react/nextjs-app-prefetching/package.json | 4 +- .../nextjs-suspense-streaming/package.json | 6 +- examples/react/nextjs/package.json | 4 +- examples/react/offline/package.json | 8 +- .../optimistic-updates-cache/package.json | 4 +- .../react/optimistic-updates-ui/package.json | 4 +- examples/react/pagination/package.json | 4 +- examples/react/playground/package.json | 4 +- examples/react/prefetching/package.json | 4 +- examples/react/react-native/package.json | 4 +- examples/react/react-router/package.json | 4 +- examples/react/rick-morty/package.json | 4 +- examples/react/shadow-dom/package.json | 4 +- examples/react/simple/package.json | 4 +- examples/react/star-wars/package.json | 4 +- examples/react/suspense/package.json | 4 +- examples/solid/astro/package.json | 4 +- .../solid/basic-graphql-request/package.json | 4 +- examples/solid/basic/package.json | 4 +- .../solid/default-query-function/package.json | 4 +- examples/solid/offline/package.json | 8 +- examples/solid/simple/package.json | 6 +- .../solid/solid-start-streaming/package.json | 4 +- examples/svelte/auto-refetching/package.json | 4 +- examples/svelte/basic/package.json | 8 +- .../load-more-infinite-scroll/package.json | 4 +- .../svelte/optimistic-updates/package.json | 4 +- examples/svelte/playground/package.json | 4 +- examples/svelte/simple/package.json | 4 +- examples/svelte/ssr/package.json | 4 +- examples/svelte/star-wars/package.json | 4 +- examples/vue/basic/package.json | 4 +- examples/vue/dependent-queries/package.json | 2 +- examples/vue/persister/package.json | 8 +- examples/vue/simple/package.json | 4 +- integrations/angular-cli-20/package.json | 2 +- .../angular-query-experimental/CHANGELOG.md | 7 + .../angular-query-experimental/package.json | 2 +- .../angular-query-persist-client/CHANGELOG.md | 8 + .../angular-query-persist-client/package.json | 2 +- packages/eslint-plugin-query/CHANGELOG.md | 2 + packages/eslint-plugin-query/package.json | 2 +- packages/lit-query/CHANGELOG.md | 7 + packages/lit-query/package.json | 2 +- packages/preact-query-devtools/CHANGELOG.md | 8 + packages/preact-query-devtools/package.json | 2 +- .../preact-query-persist-client/CHANGELOG.md | 8 + .../preact-query-persist-client/package.json | 2 +- packages/preact-query/CHANGELOG.md | 7 + packages/preact-query/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- packages/query-core/CHANGELOG.md | 2 + packages/query-core/package.json | 2 +- packages/query-devtools/CHANGELOG.md | 16 + packages/query-devtools/package.json | 2 +- .../query-persist-client-core/CHANGELOG.md | 7 + .../query-persist-client-core/package.json | 2 +- .../query-sync-storage-persister/CHANGELOG.md | 8 + .../query-sync-storage-persister/package.json | 2 +- packages/react-query-devtools/CHANGELOG.md | 8 + packages/react-query-devtools/package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- .../react-query-persist-client/CHANGELOG.md | 8 + .../react-query-persist-client/package.json | 2 +- packages/react-query/CHANGELOG.md | 7 + packages/react-query/package.json | 2 +- packages/solid-query-devtools/CHANGELOG.md | 8 + packages/solid-query-devtools/package.json | 2 +- .../solid-query-persist-client/CHANGELOG.md | 8 + .../solid-query-persist-client/package.json | 2 +- packages/solid-query/CHANGELOG.md | 7 + packages/solid-query/package.json | 2 +- packages/svelte-query-devtools/CHANGELOG.md | 8 + packages/svelte-query-devtools/package.json | 2 +- .../svelte-query-persist-client/CHANGELOG.md | 8 + .../svelte-query-persist-client/package.json | 2 +- packages/svelte-query/CHANGELOG.md | 7 + packages/svelte-query/package.json | 2 +- packages/vue-query-devtools/CHANGELOG.md | 8 + packages/vue-query-devtools/package.json | 2 +- packages/vue-query/CHANGELOG.md | 7 + packages/vue-query/package.json | 2 +- pnpm-lock.yaml | 415 ++++++------------ 118 files changed, 481 insertions(+), 455 deletions(-) delete mode 100644 .changeset/devtools-close-pip-window-localstorage.md delete mode 100644 .changeset/devtools-date-sort-equal-timestamps.md delete mode 100644 .changeset/devtools-setup-stylesheet-cross-target-dedup.md delete mode 100644 .changeset/devtools-theme-subtrigger-classname.md delete mode 100644 .changeset/mighty-banks-mate.md diff --git a/.changeset/devtools-close-pip-window-localstorage.md b/.changeset/devtools-close-pip-window-localstorage.md deleted file mode 100644 index 16039f2982c..00000000000 --- a/.changeset/devtools-close-pip-window-localstorage.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@tanstack/query-devtools': patch ---- - -fix(query-devtools/PiPContext): reset 'pip_open' in 'localStore' from 'closePipWindow' so the auto-open createEffect does not reopen the window after a programmatic close diff --git a/.changeset/devtools-date-sort-equal-timestamps.md b/.changeset/devtools-date-sort-equal-timestamps.md deleted file mode 100644 index 226fbbc7bc4..00000000000 --- a/.changeset/devtools-date-sort-equal-timestamps.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@tanstack/query-devtools': patch ---- - -fix(query-devtools/utils): make 'last updated' sort return 0 for queries with equal 'dataUpdatedAt' to follow the standard comparator contract diff --git a/.changeset/devtools-setup-stylesheet-cross-target-dedup.md b/.changeset/devtools-setup-stylesheet-cross-target-dedup.md deleted file mode 100644 index 979db8513b7..00000000000 --- a/.changeset/devtools-setup-stylesheet-cross-target-dedup.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@tanstack/query-devtools': patch ---- - -fix(query-devtools/utils): scope the 'setupStyleSheet' dedup check to the target so a 'shadowDOMTarget' still receives its own '#_goober' style tag when 'document.head' already has one diff --git a/.changeset/devtools-theme-subtrigger-classname.md b/.changeset/devtools-theme-subtrigger-classname.md deleted file mode 100644 index 3a4dfd57b07..00000000000 --- a/.changeset/devtools-theme-subtrigger-classname.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@tanstack/query-devtools': patch ---- - -fix(query-devtools/Devtools): correct the Theme sub-trigger className from 'position' to 'theme' diff --git a/.changeset/mighty-banks-mate.md b/.changeset/mighty-banks-mate.md deleted file mode 100644 index 3d36984f5f0..00000000000 --- a/.changeset/mighty-banks-mate.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@tanstack/query-devtools': patch ---- - -`setupStyleSheet` now sets `window.__nonce__` when a `styleNonce` is provided. - -The devtools use [goober](https://goober.js.org/) for CSS-in-JS, which reads `window.__nonce__` every time it creates or accesses its style element. Without this, goober overwrote the nonce with `undefined`, causing CSP violations even when `styleNonce` was correctly passed to ``. diff --git a/examples/angular/auto-refetching/package.json b/examples/angular/auto-refetching/package.json index 924448dfd6a..85e5d27b4f1 100644 --- a/examples/angular/auto-refetching/package.json +++ b/examples/angular/auto-refetching/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/basic-persister/package.json b/examples/angular/basic-persister/package.json index bd093c24914..373be6269ed 100644 --- a/examples/angular/basic-persister/package.json +++ b/examples/angular/basic-persister/package.json @@ -13,9 +13,9 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", - "@tanstack/angular-query-persist-client": "^5.101.1", - "@tanstack/query-async-storage-persister": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-persist-client": "^5.101.2", + "@tanstack/query-async-storage-persister": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/basic/package.json b/examples/angular/basic/package.json index 4e094dfcf88..479bc2131fe 100644 --- a/examples/angular/basic/package.json +++ b/examples/angular/basic/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/devtools-panel/package.json b/examples/angular/devtools-panel/package.json index 8cc5d2eb8e9..1fdadcaa718 100644 --- a/examples/angular/devtools-panel/package.json +++ b/examples/angular/devtools-panel/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/infinite-query-with-max-pages/package.json b/examples/angular/infinite-query-with-max-pages/package.json index 8306712e193..9ca2130d3c4 100644 --- a/examples/angular/infinite-query-with-max-pages/package.json +++ b/examples/angular/infinite-query-with-max-pages/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/optimistic-updates/package.json b/examples/angular/optimistic-updates/package.json index 9826e37016d..4d5f8705818 100644 --- a/examples/angular/optimistic-updates/package.json +++ b/examples/angular/optimistic-updates/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/pagination/package.json b/examples/angular/pagination/package.json index 75484798088..b4a73e1a067 100644 --- a/examples/angular/pagination/package.json +++ b/examples/angular/pagination/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/query-options-from-a-service/package.json b/examples/angular/query-options-from-a-service/package.json index b1f4b6ea1f5..838f25eb77f 100644 --- a/examples/angular/query-options-from-a-service/package.json +++ b/examples/angular/query-options-from-a-service/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/router/package.json b/examples/angular/router/package.json index 6f989526abd..ca1a96961fc 100644 --- a/examples/angular/router/package.json +++ b/examples/angular/router/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/rxjs/package.json b/examples/angular/rxjs/package.json index e0b5afe0574..7d33216d42b 100644 --- a/examples/angular/rxjs/package.json +++ b/examples/angular/rxjs/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/simple/package.json b/examples/angular/simple/package.json index 9fb1f1a383f..1c42afd6a51 100644 --- a/examples/angular/simple/package.json +++ b/examples/angular/simple/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/lit/basic/package.json b/examples/lit/basic/package.json index 9bec71e1df2..adab899194c 100644 --- a/examples/lit/basic/package.json +++ b/examples/lit/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/lit-query": "^0.2.8", - "@tanstack/query-core": "^5.101.1", + "@tanstack/lit-query": "^0.2.9", + "@tanstack/query-core": "^5.101.2", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/lit/pagination/package.json b/examples/lit/pagination/package.json index d30ce1717bb..6ffd899679d 100644 --- a/examples/lit/pagination/package.json +++ b/examples/lit/pagination/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/lit-query": "^0.2.8", - "@tanstack/query-core": "^5.101.1", + "@tanstack/lit-query": "^0.2.9", + "@tanstack/query-core": "^5.101.2", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/lit/ssr/package.json b/examples/lit/ssr/package.json index 6dd57bfc8a3..95c243e5a06 100644 --- a/examples/lit/ssr/package.json +++ b/examples/lit/ssr/package.json @@ -8,8 +8,8 @@ }, "dependencies": { "@lit-labs/ssr": "^3.3.0", - "@tanstack/lit-query": "^0.2.8", - "@tanstack/query-core": "^5.101.1", + "@tanstack/lit-query": "^0.2.9", + "@tanstack/query-core": "^5.101.2", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/preact/simple/package.json b/examples/preact/simple/package.json index 6edc4331298..38212cfcb31 100644 --- a/examples/preact/simple/package.json +++ b/examples/preact/simple/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/preact-query": "^5.101.1", + "@tanstack/preact-query": "^5.101.2", "preact": "^10.28.0" }, "devDependencies": { diff --git a/examples/react/algolia/package.json b/examples/react/algolia/package.json index 4c2d66535b4..40775483a47 100644 --- a/examples/react/algolia/package.json +++ b/examples/react/algolia/package.json @@ -9,13 +9,13 @@ }, "dependencies": { "@algolia/client-search": "5.2.1", - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.1", + "@tanstack/eslint-plugin-query": "^5.101.2", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/auto-refetching/package.json b/examples/react/auto-refetching/package.json index 921a82aa3b0..44b10e61ec0 100644 --- a/examples/react/auto-refetching/package.json +++ b/examples/react/auto-refetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/basic-graphql-request/package.json b/examples/react/basic-graphql-request/package.json index 2e6d74fda6b..e690cbcd55c 100644 --- a/examples/react/basic-graphql-request/package.json +++ b/examples/react/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "graphql": "^16.9.0", "graphql-request": "^7.1.2", "react": "^19.0.0", diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index 0079326ba96..c770923d4fb 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -9,15 +9,15 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.1", - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", - "@tanstack/react-query-persist-client": "^5.101.1", + "@tanstack/query-async-storage-persister": "^5.101.2", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query-persist-client": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.1", + "@tanstack/eslint-plugin-query": "^5.101.2", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/chat/package.json b/examples/react/chat/package.json index 0990779934f..efce271877d 100644 --- a/examples/react/chat/package.json +++ b/examples/react/chat/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/default-query-function/package.json b/examples/react/default-query-function/package.json index 47c3a2c75c2..44c48713b9a 100644 --- a/examples/react/default-query-function/package.json +++ b/examples/react/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/devtools-panel/package.json b/examples/react/devtools-panel/package.json index 5a1944f3b7f..88282ca7685 100644 --- a/examples/react/devtools-panel/package.json +++ b/examples/react/devtools-panel/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "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 2b30d42add3..a7aa065f523 100644 --- a/examples/react/eslint-legacy/package.json +++ b/examples/react/eslint-legacy/package.json @@ -9,15 +9,15 @@ "test:eslint": "ESLINT_USE_FLAT_CONFIG=false eslint ./src/**/*.tsx" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.1", - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", - "@tanstack/react-query-persist-client": "^5.101.1", + "@tanstack/query-async-storage-persister": "^5.101.2", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query-persist-client": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.1", + "@tanstack/eslint-plugin-query": "^5.101.2", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/eslint-plugin-demo/package.json b/examples/react/eslint-plugin-demo/package.json index 7292ce6ec52..5f49708a92b 100644 --- a/examples/react/eslint-plugin-demo/package.json +++ b/examples/react/eslint-plugin-demo/package.json @@ -6,11 +6,11 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query": "^5.101.2", "react": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.1", + "@tanstack/eslint-plugin-query": "^5.101.2", "eslint": "^9.39.0", "typescript": "5.8.3", "typescript-eslint": "^8.48.0" diff --git a/examples/react/infinite-query-with-max-pages/package.json b/examples/react/infinite-query-with-max-pages/package.json index e225c9e55f3..cef50087ea0 100644 --- a/examples/react/infinite-query-with-max-pages/package.json +++ b/examples/react/infinite-query-with-max-pages/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/load-more-infinite-scroll/package.json b/examples/react/load-more-infinite-scroll/package.json index 668b2454d97..1be7838c2b6 100644 --- a/examples/react/load-more-infinite-scroll/package.json +++ b/examples/react/load-more-infinite-scroll/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1", diff --git a/examples/react/nextjs-app-prefetching/package.json b/examples/react/nextjs-app-prefetching/package.json index c3aa1f5e053..bb9d965ae20 100644 --- a/examples/react/nextjs-app-prefetching/package.json +++ b/examples/react/nextjs-app-prefetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/nextjs-suspense-streaming/package.json b/examples/react/nextjs-suspense-streaming/package.json index 5ba1a35ec75..127cc2039cc 100644 --- a/examples/react/nextjs-suspense-streaming/package.json +++ b/examples/react/nextjs-suspense-streaming/package.json @@ -8,9 +8,9 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", - "@tanstack/react-query-next-experimental": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query-next-experimental": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/nextjs/package.json b/examples/react/nextjs/package.json index 898b6317ae2..e277a26e473 100644 --- a/examples/react/nextjs/package.json +++ b/examples/react/nextjs/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/offline/package.json b/examples/react/offline/package.json index 63fad83de51..50935e8592d 100644 --- a/examples/react/offline/package.json +++ b/examples/react/offline/package.json @@ -8,11 +8,11 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.1", + "@tanstack/query-async-storage-persister": "^5.101.2", "@tanstack/react-location": "^3.7.4", - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", - "@tanstack/react-query-persist-client": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query-persist-client": "^5.101.2", "msw": "^2.6.6", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/optimistic-updates-cache/package.json b/examples/react/optimistic-updates-cache/package.json index 74eb6405e02..f8e47de1d0d 100755 --- a/examples/react/optimistic-updates-cache/package.json +++ b/examples/react/optimistic-updates-cache/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/optimistic-updates-ui/package.json b/examples/react/optimistic-updates-ui/package.json index 1745713f94e..7e6fc46e50d 100755 --- a/examples/react/optimistic-updates-ui/package.json +++ b/examples/react/optimistic-updates-ui/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/pagination/package.json b/examples/react/pagination/package.json index 2573d00e1d8..50bbee6a3b6 100644 --- a/examples/react/pagination/package.json +++ b/examples/react/pagination/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/playground/package.json b/examples/react/playground/package.json index 2144352db59..7f6246eee98 100644 --- a/examples/react/playground/package.json +++ b/examples/react/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/prefetching/package.json b/examples/react/prefetching/package.json index 9294c5e3dcf..693c41b8637 100644 --- a/examples/react/prefetching/package.json +++ b/examples/react/prefetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/react-native/package.json b/examples/react/react-native/package.json index 29845e15d09..6c9b2ece29d 100644 --- a/examples/react/react-native/package.json +++ b/examples/react/react-native/package.json @@ -14,8 +14,8 @@ "@react-native-community/netinfo": "^11.4.1", "@react-navigation/native": "^6.1.18", "@react-navigation/stack": "^6.4.1", - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "expo": "^52.0.11", "expo-constants": "^17.0.3", "expo-status-bar": "^2.0.0", diff --git a/examples/react/react-router/package.json b/examples/react/react-router/package.json index 7e245a18e84..28a39b48bc6 100644 --- a/examples/react/react-router/package.json +++ b/examples/react/react-router/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "localforage": "^1.10.0", "match-sorter": "^6.3.4", "react": "^19.0.0", diff --git a/examples/react/rick-morty/package.json b/examples/react/rick-morty/package.json index b5cdf38c776..948ff6efa63 100644 --- a/examples/react/rick-morty/package.json +++ b/examples/react/rick-morty/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^6.25.1", diff --git a/examples/react/shadow-dom/package.json b/examples/react/shadow-dom/package.json index 57b5e45b60c..d35e6fd4027 100644 --- a/examples/react/shadow-dom/package.json +++ b/examples/react/shadow-dom/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/simple/package.json b/examples/react/simple/package.json index 860e9b458a7..9eab98678aa 100644 --- a/examples/react/simple/package.json +++ b/examples/react/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/star-wars/package.json b/examples/react/star-wars/package.json index 21bfd3583de..60a2fea5eef 100644 --- a/examples/react/star-wars/package.json +++ b/examples/react/star-wars/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^6.25.1", diff --git a/examples/react/suspense/package.json b/examples/react/suspense/package.json index 7e1ad39cf3b..a22fccbab75 100644 --- a/examples/react/suspense/package.json +++ b/examples/react/suspense/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.1", - "@tanstack/react-query-devtools": "^5.101.1", + "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query-devtools": "^5.101.2", "font-awesome": "^4.7.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/solid/astro/package.json b/examples/solid/astro/package.json index 7c0752ce83c..6b89c2d774f 100644 --- a/examples/solid/astro/package.json +++ b/examples/solid/astro/package.json @@ -15,8 +15,8 @@ "@astrojs/solid-js": "^5.0.7", "@astrojs/tailwind": "^6.0.2", "@astrojs/vercel": "^8.1.3", - "@tanstack/solid-query": "^5.101.1", - "@tanstack/solid-query-devtools": "^5.101.1", + "@tanstack/solid-query": "^5.101.2", + "@tanstack/solid-query-devtools": "^5.101.2", "astro": "^5.5.6", "solid-js": "^1.9.7", "tailwindcss": "^3.4.7", diff --git a/examples/solid/basic-graphql-request/package.json b/examples/solid/basic-graphql-request/package.json index b89f869eef9..e207a0d5530 100644 --- a/examples/solid/basic-graphql-request/package.json +++ b/examples/solid/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.1", - "@tanstack/solid-query-devtools": "^5.101.1", + "@tanstack/solid-query": "^5.101.2", + "@tanstack/solid-query-devtools": "^5.101.2", "graphql": "^16.9.0", "graphql-request": "^7.1.2", "solid-js": "^1.9.7" diff --git a/examples/solid/basic/package.json b/examples/solid/basic/package.json index a717dc64cb3..df3017b9b6b 100644 --- a/examples/solid/basic/package.json +++ b/examples/solid/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.1", - "@tanstack/solid-query-devtools": "^5.101.1", + "@tanstack/solid-query": "^5.101.2", + "@tanstack/solid-query-devtools": "^5.101.2", "solid-js": "^1.9.7" }, "devDependencies": { diff --git a/examples/solid/default-query-function/package.json b/examples/solid/default-query-function/package.json index 0def678d251..247496adaa5 100644 --- a/examples/solid/default-query-function/package.json +++ b/examples/solid/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.1", - "@tanstack/solid-query-devtools": "^5.101.1", + "@tanstack/solid-query": "^5.101.2", + "@tanstack/solid-query-devtools": "^5.101.2", "solid-js": "^1.9.7" }, "devDependencies": { diff --git a/examples/solid/offline/package.json b/examples/solid/offline/package.json index 20a57ae875e..044044358e6 100644 --- a/examples/solid/offline/package.json +++ b/examples/solid/offline/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.1", - "@tanstack/solid-query": "^5.101.1", - "@tanstack/solid-query-devtools": "^5.101.1", - "@tanstack/solid-query-persist-client": "^5.101.1", + "@tanstack/query-async-storage-persister": "^5.101.2", + "@tanstack/solid-query": "^5.101.2", + "@tanstack/solid-query-devtools": "^5.101.2", + "@tanstack/solid-query-persist-client": "^5.101.2", "msw": "^2.6.6", "solid-js": "^1.9.7" }, diff --git a/examples/solid/simple/package.json b/examples/solid/simple/package.json index c7b49334478..12189e40728 100644 --- a/examples/solid/simple/package.json +++ b/examples/solid/simple/package.json @@ -8,12 +8,12 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.1", - "@tanstack/solid-query-devtools": "^5.101.1", + "@tanstack/solid-query": "^5.101.2", + "@tanstack/solid-query-devtools": "^5.101.2", "solid-js": "^1.9.7" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.1", + "@tanstack/eslint-plugin-query": "^5.101.2", "typescript": "5.8.3", "vite": "^6.4.1", "vite-plugin-solid": "^2.11.6" diff --git a/examples/solid/solid-start-streaming/package.json b/examples/solid/solid-start-streaming/package.json index 81503a6f780..49d4be45c3d 100644 --- a/examples/solid/solid-start-streaming/package.json +++ b/examples/solid/solid-start-streaming/package.json @@ -12,8 +12,8 @@ "@solidjs/meta": "^0.29.4", "@solidjs/router": "^0.15.3", "@solidjs/start": "^1.1.3", - "@tanstack/solid-query": "^5.101.1", - "@tanstack/solid-query-devtools": "^5.101.1", + "@tanstack/solid-query": "^5.101.2", + "@tanstack/solid-query-devtools": "^5.101.2", "solid-js": "^1.9.7", "vinxi": "^0.5.3" }, diff --git a/examples/svelte/auto-refetching/package.json b/examples/svelte/auto-refetching/package.json index 61e8cb0ab8d..07a62a721d4 100644 --- a/examples/svelte/auto-refetching/package.json +++ b/examples/svelte/auto-refetching/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.35", - "@tanstack/svelte-query-devtools": "^6.1.35" + "@tanstack/svelte-query": "^6.1.36", + "@tanstack/svelte-query-devtools": "^6.1.36" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/basic/package.json b/examples/svelte/basic/package.json index 57d2e1c75be..354ebae6910 100644 --- a/examples/svelte/basic/package.json +++ b/examples/svelte/basic/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.1", - "@tanstack/svelte-query": "^6.1.35", - "@tanstack/svelte-query-devtools": "^6.1.35", - "@tanstack/svelte-query-persist-client": "^6.1.35" + "@tanstack/query-async-storage-persister": "^5.101.2", + "@tanstack/svelte-query": "^6.1.36", + "@tanstack/svelte-query-devtools": "^6.1.36", + "@tanstack/svelte-query-persist-client": "^6.1.36" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/load-more-infinite-scroll/package.json b/examples/svelte/load-more-infinite-scroll/package.json index 7406d8285df..60da488dfec 100644 --- a/examples/svelte/load-more-infinite-scroll/package.json +++ b/examples/svelte/load-more-infinite-scroll/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.35", - "@tanstack/svelte-query-devtools": "^6.1.35" + "@tanstack/svelte-query": "^6.1.36", + "@tanstack/svelte-query-devtools": "^6.1.36" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/optimistic-updates/package.json b/examples/svelte/optimistic-updates/package.json index d56032a117b..8f64d775093 100644 --- a/examples/svelte/optimistic-updates/package.json +++ b/examples/svelte/optimistic-updates/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.35", - "@tanstack/svelte-query-devtools": "^6.1.35" + "@tanstack/svelte-query": "^6.1.36", + "@tanstack/svelte-query-devtools": "^6.1.36" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/playground/package.json b/examples/svelte/playground/package.json index 8b49aeb4da4..0cae594f43a 100644 --- a/examples/svelte/playground/package.json +++ b/examples/svelte/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.35", - "@tanstack/svelte-query-devtools": "^6.1.35" + "@tanstack/svelte-query": "^6.1.36", + "@tanstack/svelte-query-devtools": "^6.1.36" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/simple/package.json b/examples/svelte/simple/package.json index a482f35f761..860f6c15880 100644 --- a/examples/svelte/simple/package.json +++ b/examples/svelte/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.35", - "@tanstack/svelte-query-devtools": "^6.1.35" + "@tanstack/svelte-query": "^6.1.36", + "@tanstack/svelte-query-devtools": "^6.1.36" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.1.1", diff --git a/examples/svelte/ssr/package.json b/examples/svelte/ssr/package.json index f2f7dc808d0..fb6e3d44a24 100644 --- a/examples/svelte/ssr/package.json +++ b/examples/svelte/ssr/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.35", - "@tanstack/svelte-query-devtools": "^6.1.35" + "@tanstack/svelte-query": "^6.1.36", + "@tanstack/svelte-query-devtools": "^6.1.36" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/star-wars/package.json b/examples/svelte/star-wars/package.json index 54bd3c372be..5865ce175a1 100644 --- a/examples/svelte/star-wars/package.json +++ b/examples/svelte/star-wars/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.35", - "@tanstack/svelte-query-devtools": "^6.1.35" + "@tanstack/svelte-query": "^6.1.36", + "@tanstack/svelte-query-devtools": "^6.1.36" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/vue/basic/package.json b/examples/vue/basic/package.json index 5cc2a471a92..734ebe85624 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.101.1", - "@tanstack/vue-query-devtools": "^6.1.35", + "@tanstack/vue-query": "^5.101.2", + "@tanstack/vue-query-devtools": "^6.1.36", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/dependent-queries/package.json b/examples/vue/dependent-queries/package.json index 2d65882e48b..4c868552eef 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.101.1", + "@tanstack/vue-query": "^5.101.2", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/persister/package.json b/examples/vue/persister/package.json index 600566e7a6e..a3eb9c2bac8 100644 --- a/examples/vue/persister/package.json +++ b/examples/vue/persister/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-core": "^5.101.1", - "@tanstack/query-persist-client-core": "^5.101.1", - "@tanstack/query-sync-storage-persister": "^5.101.1", - "@tanstack/vue-query": "^5.101.1", + "@tanstack/query-core": "^5.101.2", + "@tanstack/query-persist-client-core": "^5.101.2", + "@tanstack/query-sync-storage-persister": "^5.101.2", + "@tanstack/vue-query": "^5.101.2", "idb-keyval": "^6.2.1", "vue": "^3.4.27" }, diff --git a/examples/vue/simple/package.json b/examples/vue/simple/package.json index 7f843524a0d..d62674b1d9f 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.101.1", - "@tanstack/vue-query-devtools": "^6.1.35", + "@tanstack/vue-query": "^5.101.2", + "@tanstack/vue-query-devtools": "^6.1.36", "vue": "^3.4.27" }, "devDependencies": { diff --git a/integrations/angular-cli-20/package.json b/integrations/angular-cli-20/package.json index 16ffcf04539..02643b9f605 100644 --- a/integrations/angular-cli-20/package.json +++ b/integrations/angular-cli-20/package.json @@ -14,7 +14,7 @@ "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.1", + "@tanstack/angular-query-experimental": "^5.101.2", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" diff --git a/packages/angular-query-experimental/CHANGELOG.md b/packages/angular-query-experimental/CHANGELOG.md index 64bc925b686..cc0fcc7e6b3 100644 --- a/packages/angular-query-experimental/CHANGELOG.md +++ b/packages/angular-query-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/angular-query-experimental +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/angular-query-experimental/package.json b/packages/angular-query-experimental/package.json index 278e600cf81..3e821d50d8e 100644 --- a/packages/angular-query-experimental/package.json +++ b/packages/angular-query-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/angular-query-experimental", - "version": "5.101.1", + "version": "5.101.2", "description": "Signals for managing, caching and syncing asynchronous and remote data in Angular", "author": "Arnoud de Vries", "license": "MIT", diff --git a/packages/angular-query-persist-client/CHANGELOG.md b/packages/angular-query-persist-client/CHANGELOG.md index 571d0548ad2..acaedcf95ab 100644 --- a/packages/angular-query-persist-client/CHANGELOG.md +++ b/packages/angular-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/angular-query-persist-client +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/angular-query-experimental@5.101.2 + - @tanstack/query-persist-client-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/angular-query-persist-client/package.json b/packages/angular-query-persist-client/package.json index c5c801ff6b4..32a34806fc2 100644 --- a/packages/angular-query-persist-client/package.json +++ b/packages/angular-query-persist-client/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/angular-query-persist-client", "private": true, - "version": "5.101.1", + "version": "5.101.2", "description": "Angular bindings to work with persisters in TanStack/angular-query", "author": "Omer Gronich", "license": "MIT", diff --git a/packages/eslint-plugin-query/CHANGELOG.md b/packages/eslint-plugin-query/CHANGELOG.md index d2a9bf846ad..fe185c6295f 100644 --- a/packages/eslint-plugin-query/CHANGELOG.md +++ b/packages/eslint-plugin-query/CHANGELOG.md @@ -1,5 +1,7 @@ # @tanstack/eslint-plugin-query +## 5.101.2 + ## 5.101.1 ## 5.101.0 diff --git a/packages/eslint-plugin-query/package.json b/packages/eslint-plugin-query/package.json index f143ea40354..f800b651e8e 100644 --- a/packages/eslint-plugin-query/package.json +++ b/packages/eslint-plugin-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/eslint-plugin-query", - "version": "5.101.1", + "version": "5.101.2", "description": "ESLint plugin for TanStack Query", "author": "Eliya Cohen", "license": "MIT", diff --git a/packages/lit-query/CHANGELOG.md b/packages/lit-query/CHANGELOG.md index c05a12e73a9..ac8449efc4b 100644 --- a/packages/lit-query/CHANGELOG.md +++ b/packages/lit-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/lit-query +## 0.2.9 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 0.2.8 ### Patch Changes diff --git a/packages/lit-query/package.json b/packages/lit-query/package.json index 30ad9be03fd..be6d000d83f 100644 --- a/packages/lit-query/package.json +++ b/packages/lit-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/lit-query", - "version": "0.2.8", + "version": "0.2.9", "description": "Lit adapter for TanStack Query Core", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query-devtools/CHANGELOG.md b/packages/preact-query-devtools/CHANGELOG.md index 7a4d493f0b8..0667e40aba2 100644 --- a/packages/preact-query-devtools/CHANGELOG.md +++ b/packages/preact-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/preact-query-devtools +## 5.101.2 + +### Patch Changes + +- Updated dependencies [[`f5bf180`](https://github.com/TanStack/query/commit/f5bf180d933d8b8d9d9e7b845e55b26a3a413b07), [`25cdd97`](https://github.com/TanStack/query/commit/25cdd975fed4703d2ca5b600ca5ccd2b600b3dd8), [`ecd89c8`](https://github.com/TanStack/query/commit/ecd89c8faf7acc226f00633ea3a761d3ab842c1d), [`01c7634`](https://github.com/TanStack/query/commit/01c763444e3cf3dfa9744f13911aa1533cac3c29), [`49012db`](https://github.com/TanStack/query/commit/49012dbd5192dfe483d3b108b72ffaa7f2849e0f)]: + - @tanstack/query-devtools@5.101.2 + - @tanstack/preact-query@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/preact-query-devtools/package.json b/packages/preact-query-devtools/package.json index 26d5077b07f..2a5ad4b1f18 100644 --- a/packages/preact-query-devtools/package.json +++ b/packages/preact-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query-devtools", - "version": "5.101.1", + "version": "5.101.2", "description": "Developer tools to interact with and visualize the TanStack/preact-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query-persist-client/CHANGELOG.md b/packages/preact-query-persist-client/CHANGELOG.md index 016a934d076..d46a7a9207e 100644 --- a/packages/preact-query-persist-client/CHANGELOG.md +++ b/packages/preact-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/preact-query-persist-client +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/preact-query@5.101.2 + - @tanstack/query-persist-client-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/preact-query-persist-client/package.json b/packages/preact-query-persist-client/package.json index cf46f280024..8b9d3566da3 100644 --- a/packages/preact-query-persist-client/package.json +++ b/packages/preact-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query-persist-client", - "version": "5.101.1", + "version": "5.101.2", "description": "Preact bindings to work with persisters in TanStack/preact-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query/CHANGELOG.md b/packages/preact-query/CHANGELOG.md index d802e3b6605..9bc6f9616c9 100644 --- a/packages/preact-query/CHANGELOG.md +++ b/packages/preact-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/preact-query +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/preact-query/package.json b/packages/preact-query/package.json index 5ccbb614053..196ba9abd63 100644 --- a/packages/preact-query/package.json +++ b/packages/preact-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query", - "version": "5.101.1", + "version": "5.101.2", "description": "Hooks for managing, caching and syncing asynchronous and remote data in preact", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-async-storage-persister/CHANGELOG.md b/packages/query-async-storage-persister/CHANGELOG.md index 3ae8d214b00..7cfe2b6bc33 100644 --- a/packages/query-async-storage-persister/CHANGELOG.md +++ b/packages/query-async-storage-persister/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/query-async-storage-persister +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + - @tanstack/query-persist-client-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/query-async-storage-persister/package.json b/packages/query-async-storage-persister/package.json index 2fa4bff54b2..2b3b61be821 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.101.1", + "version": "5.101.2", "description": "A persister for asynchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-broadcast-client-experimental/CHANGELOG.md b/packages/query-broadcast-client-experimental/CHANGELOG.md index dd95276f329..0d026db527c 100644 --- a/packages/query-broadcast-client-experimental/CHANGELOG.md +++ b/packages/query-broadcast-client-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-broadcast-client-experimental +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/query-broadcast-client-experimental/package.json b/packages/query-broadcast-client-experimental/package.json index 93567e85b26..7a16c3a60f4 100644 --- a/packages/query-broadcast-client-experimental/package.json +++ b/packages/query-broadcast-client-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-broadcast-client-experimental", - "version": "5.101.1", + "version": "5.101.2", "description": "An experimental plugin to for broadcasting the state of your queryClient between browser tabs/windows", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-core/CHANGELOG.md b/packages/query-core/CHANGELOG.md index 9e83eedd6bb..0c68f25507d 100644 --- a/packages/query-core/CHANGELOG.md +++ b/packages/query-core/CHANGELOG.md @@ -1,5 +1,7 @@ # @tanstack/query-core +## 5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/query-core/package.json b/packages/query-core/package.json index e51e5754fdd..1caa2e7109b 100644 --- a/packages/query-core/package.json +++ b/packages/query-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-core", - "version": "5.101.1", + "version": "5.101.2", "description": "The framework agnostic core that powers TanStack Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-devtools/CHANGELOG.md b/packages/query-devtools/CHANGELOG.md index f9f805cf4d9..228a4d21cee 100644 --- a/packages/query-devtools/CHANGELOG.md +++ b/packages/query-devtools/CHANGELOG.md @@ -1,5 +1,21 @@ # @tanstack/query-devtools +## 5.101.2 + +### Patch Changes + +- [#10813](https://github.com/TanStack/query/pull/10813) [`f5bf180`](https://github.com/TanStack/query/commit/f5bf180d933d8b8d9d9e7b845e55b26a3a413b07) - fix(query-devtools/PiPContext): reset 'pip_open' in 'localStore' from 'closePipWindow' so the auto-open createEffect does not reopen the window after a programmatic close + +- [#10812](https://github.com/TanStack/query/pull/10812) [`25cdd97`](https://github.com/TanStack/query/commit/25cdd975fed4703d2ca5b600ca5ccd2b600b3dd8) - fix(query-devtools/utils): make 'last updated' sort return 0 for queries with equal 'dataUpdatedAt' to follow the standard comparator contract + +- [#10815](https://github.com/TanStack/query/pull/10815) [`ecd89c8`](https://github.com/TanStack/query/commit/ecd89c8faf7acc226f00633ea3a761d3ab842c1d) - fix(query-devtools/utils): scope the 'setupStyleSheet' dedup check to the target so a 'shadowDOMTarget' still receives its own '#\_goober' style tag when 'document.head' already has one + +- [#10811](https://github.com/TanStack/query/pull/10811) [`01c7634`](https://github.com/TanStack/query/commit/01c763444e3cf3dfa9744f13911aa1533cac3c29) - fix(query-devtools/Devtools): correct the Theme sub-trigger className from 'position' to 'theme' + +- [#10736](https://github.com/TanStack/query/pull/10736) [`49012db`](https://github.com/TanStack/query/commit/49012dbd5192dfe483d3b108b72ffaa7f2849e0f) - `setupStyleSheet` now sets `window.__nonce__` when a `styleNonce` is provided. + + The devtools use [goober](https://goober.js.org/) for CSS-in-JS, which reads `window.__nonce__` every time it creates or accesses its style element. Without this, goober overwrote the nonce with `undefined`, causing CSP violations even when `styleNonce` was correctly passed to ``. + ## 5.101.1 ## 5.101.0 diff --git a/packages/query-devtools/package.json b/packages/query-devtools/package.json index b7d39cf6950..11d797c4c4a 100644 --- a/packages/query-devtools/package.json +++ b/packages/query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-devtools", - "version": "5.101.1", + "version": "5.101.2", "description": "Developer tools to interact with and visualize the TanStack Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-persist-client-core/CHANGELOG.md b/packages/query-persist-client-core/CHANGELOG.md index 5e67228fecb..7e903a90f58 100644 --- a/packages/query-persist-client-core/CHANGELOG.md +++ b/packages/query-persist-client-core/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-persist-client-core +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/query-persist-client-core/package.json b/packages/query-persist-client-core/package.json index 638b4b8e57b..21cfd562cf5 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.101.1", + "version": "5.101.2", "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-sync-storage-persister/CHANGELOG.md b/packages/query-sync-storage-persister/CHANGELOG.md index 2c9f1e51b2e..9c395606756 100644 --- a/packages/query-sync-storage-persister/CHANGELOG.md +++ b/packages/query-sync-storage-persister/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/query-sync-storage-persister +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + - @tanstack/query-persist-client-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/query-sync-storage-persister/package.json b/packages/query-sync-storage-persister/package.json index 45a500bdda1..67611996553 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.101.1", + "version": "5.101.2", "description": "A persister for synchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-devtools/CHANGELOG.md b/packages/react-query-devtools/CHANGELOG.md index 78a1b85bd24..32d2fe2f940 100644 --- a/packages/react-query-devtools/CHANGELOG.md +++ b/packages/react-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/react-query-devtools +## 5.101.2 + +### Patch Changes + +- Updated dependencies [[`f5bf180`](https://github.com/TanStack/query/commit/f5bf180d933d8b8d9d9e7b845e55b26a3a413b07), [`25cdd97`](https://github.com/TanStack/query/commit/25cdd975fed4703d2ca5b600ca5ccd2b600b3dd8), [`ecd89c8`](https://github.com/TanStack/query/commit/ecd89c8faf7acc226f00633ea3a761d3ab842c1d), [`01c7634`](https://github.com/TanStack/query/commit/01c763444e3cf3dfa9744f13911aa1533cac3c29), [`49012db`](https://github.com/TanStack/query/commit/49012dbd5192dfe483d3b108b72ffaa7f2849e0f)]: + - @tanstack/query-devtools@5.101.2 + - @tanstack/react-query@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/react-query-devtools/package.json b/packages/react-query-devtools/package.json index 7b41c9ff9cb..236ce6f68dd 100644 --- a/packages/react-query-devtools/package.json +++ b/packages/react-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-devtools", - "version": "5.101.1", + "version": "5.101.2", "description": "Developer tools to interact with and visualize the TanStack/react-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-next-experimental/CHANGELOG.md b/packages/react-query-next-experimental/CHANGELOG.md index b27abe37f31..e1f28ee00d5 100644 --- a/packages/react-query-next-experimental/CHANGELOG.md +++ b/packages/react-query-next-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-query-next-experimental +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/react-query@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/react-query-next-experimental/package.json b/packages/react-query-next-experimental/package.json index c578ba14049..3313aea2543 100644 --- a/packages/react-query-next-experimental/package.json +++ b/packages/react-query-next-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-next-experimental", - "version": "5.101.1", + "version": "5.101.2", "description": "Hydration utils for React Query in the NextJs app directory", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-persist-client/CHANGELOG.md b/packages/react-query-persist-client/CHANGELOG.md index fd7c9147504..d3be6460512 100644 --- a/packages/react-query-persist-client/CHANGELOG.md +++ b/packages/react-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/react-query-persist-client +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.2 + - @tanstack/react-query@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/react-query-persist-client/package.json b/packages/react-query-persist-client/package.json index ae22ff221b6..c4161d9964a 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.101.1", + "version": "5.101.2", "description": "React bindings to work with persisters in TanStack/react-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query/CHANGELOG.md b/packages/react-query/CHANGELOG.md index aef2ff58c73..c6018cf7e50 100644 --- a/packages/react-query/CHANGELOG.md +++ b/packages/react-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-query +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/react-query/package.json b/packages/react-query/package.json index 3398aba2e16..b658013fd4f 100644 --- a/packages/react-query/package.json +++ b/packages/react-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query", - "version": "5.101.1", + "version": "5.101.2", "description": "Hooks for managing, caching and syncing asynchronous and remote data in React", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-devtools/CHANGELOG.md b/packages/solid-query-devtools/CHANGELOG.md index 4dd92274967..2832067d8b8 100644 --- a/packages/solid-query-devtools/CHANGELOG.md +++ b/packages/solid-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/solid-query-devtools +## 5.101.2 + +### Patch Changes + +- Updated dependencies [[`f5bf180`](https://github.com/TanStack/query/commit/f5bf180d933d8b8d9d9e7b845e55b26a3a413b07), [`25cdd97`](https://github.com/TanStack/query/commit/25cdd975fed4703d2ca5b600ca5ccd2b600b3dd8), [`ecd89c8`](https://github.com/TanStack/query/commit/ecd89c8faf7acc226f00633ea3a761d3ab842c1d), [`01c7634`](https://github.com/TanStack/query/commit/01c763444e3cf3dfa9744f13911aa1533cac3c29), [`49012db`](https://github.com/TanStack/query/commit/49012dbd5192dfe483d3b108b72ffaa7f2849e0f)]: + - @tanstack/query-devtools@5.101.2 + - @tanstack/solid-query@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/solid-query-devtools/package.json b/packages/solid-query-devtools/package.json index 271cf95e0b6..32ab1e98c1f 100644 --- a/packages/solid-query-devtools/package.json +++ b/packages/solid-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query-devtools", - "version": "5.101.1", + "version": "5.101.2", "description": "Developer tools to interact with and visualize the TanStack/solid-query Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-persist-client/CHANGELOG.md b/packages/solid-query-persist-client/CHANGELOG.md index 6dbb45f0b7c..5cdb939e784 100644 --- a/packages/solid-query-persist-client/CHANGELOG.md +++ b/packages/solid-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/solid-query-persist-client +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.2 + - @tanstack/solid-query@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/solid-query-persist-client/package.json b/packages/solid-query-persist-client/package.json index 60a737b9fd9..a070313dc4a 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.101.1", + "version": "5.101.2", "description": "Solid.js bindings to work with persisters in TanStack/solid-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query/CHANGELOG.md b/packages/solid-query/CHANGELOG.md index 557abb92ea1..4b2185513f5 100644 --- a/packages/solid-query/CHANGELOG.md +++ b/packages/solid-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/solid-query +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/solid-query/package.json b/packages/solid-query/package.json index 9623243de8e..1353fad46de 100644 --- a/packages/solid-query/package.json +++ b/packages/solid-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query", - "version": "5.101.1", + "version": "5.101.2", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/svelte-query-devtools/CHANGELOG.md b/packages/svelte-query-devtools/CHANGELOG.md index dc4b57ba0fb..c79d8ad3d17 100644 --- a/packages/svelte-query-devtools/CHANGELOG.md +++ b/packages/svelte-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/svelte-query-devtools +## 6.1.36 + +### Patch Changes + +- Updated dependencies [[`f5bf180`](https://github.com/TanStack/query/commit/f5bf180d933d8b8d9d9e7b845e55b26a3a413b07), [`25cdd97`](https://github.com/TanStack/query/commit/25cdd975fed4703d2ca5b600ca5ccd2b600b3dd8), [`ecd89c8`](https://github.com/TanStack/query/commit/ecd89c8faf7acc226f00633ea3a761d3ab842c1d), [`01c7634`](https://github.com/TanStack/query/commit/01c763444e3cf3dfa9744f13911aa1533cac3c29), [`49012db`](https://github.com/TanStack/query/commit/49012dbd5192dfe483d3b108b72ffaa7f2849e0f)]: + - @tanstack/query-devtools@5.101.2 + - @tanstack/svelte-query@6.1.36 + ## 6.1.35 ### Patch Changes diff --git a/packages/svelte-query-devtools/package.json b/packages/svelte-query-devtools/package.json index 464ba9125b9..c5a80fe21f8 100644 --- a/packages/svelte-query-devtools/package.json +++ b/packages/svelte-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query-devtools", - "version": "6.1.35", + "version": "6.1.36", "description": "Developer tools to interact with and visualize the TanStack/svelte-query cache", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query-persist-client/CHANGELOG.md b/packages/svelte-query-persist-client/CHANGELOG.md index ca04da9abf0..7da360e9ded 100644 --- a/packages/svelte-query-persist-client/CHANGELOG.md +++ b/packages/svelte-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/svelte-query-persist-client +## 6.1.36 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.2 + - @tanstack/svelte-query@6.1.36 + ## 6.1.35 ### Patch Changes diff --git a/packages/svelte-query-persist-client/package.json b/packages/svelte-query-persist-client/package.json index edbd55b107c..c6e635978bc 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": "6.1.35", + "version": "6.1.36", "description": "Svelte bindings to work with persisters in TanStack/svelte-query", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query/CHANGELOG.md b/packages/svelte-query/CHANGELOG.md index a608fe85312..cb677a322c1 100644 --- a/packages/svelte-query/CHANGELOG.md +++ b/packages/svelte-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/svelte-query +## 6.1.36 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 6.1.35 ### Patch Changes diff --git a/packages/svelte-query/package.json b/packages/svelte-query/package.json index bd7d771265d..ea8ff898676 100644 --- a/packages/svelte-query/package.json +++ b/packages/svelte-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query", - "version": "6.1.35", + "version": "6.1.36", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/vue-query-devtools/CHANGELOG.md b/packages/vue-query-devtools/CHANGELOG.md index f1621becf79..c80e8d9e95e 100644 --- a/packages/vue-query-devtools/CHANGELOG.md +++ b/packages/vue-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/vue-query-devtools +## 6.1.36 + +### Patch Changes + +- Updated dependencies [[`f5bf180`](https://github.com/TanStack/query/commit/f5bf180d933d8b8d9d9e7b845e55b26a3a413b07), [`25cdd97`](https://github.com/TanStack/query/commit/25cdd975fed4703d2ca5b600ca5ccd2b600b3dd8), [`ecd89c8`](https://github.com/TanStack/query/commit/ecd89c8faf7acc226f00633ea3a761d3ab842c1d), [`01c7634`](https://github.com/TanStack/query/commit/01c763444e3cf3dfa9744f13911aa1533cac3c29), [`49012db`](https://github.com/TanStack/query/commit/49012dbd5192dfe483d3b108b72ffaa7f2849e0f)]: + - @tanstack/query-devtools@5.101.2 + - @tanstack/vue-query@5.101.2 + ## 6.1.35 ### Patch Changes diff --git a/packages/vue-query-devtools/package.json b/packages/vue-query-devtools/package.json index 0613005b08a..925238437d5 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": "6.1.35", + "version": "6.1.36", "description": "Developer tools to interact with and visualize the TanStack/vue-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/vue-query/CHANGELOG.md b/packages/vue-query/CHANGELOG.md index ebbe2204f07..d1da46bb785 100644 --- a/packages/vue-query/CHANGELOG.md +++ b/packages/vue-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/vue-query +## 5.101.2 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.2 + ## 5.101.1 ### Patch Changes diff --git a/packages/vue-query/package.json b/packages/vue-query/package.json index e8a2760d5b0..41fdc082c8e 100644 --- a/packages/vue-query/package.json +++ b/packages/vue-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-query", - "version": "5.101.1", + "version": "5.101.2", "description": "Hooks for managing, caching and syncing asynchronous and remote data in Vue", "author": "Damian Osipiuk", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e1de2716ae..24698d4fd93 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,7 +170,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -210,7 +210,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -250,13 +250,13 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental '@tanstack/angular-query-persist-client': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-persist-client '@tanstack/query-async-storage-persister': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-async-storage-persister rxjs: specifier: ^7.8.2 @@ -299,7 +299,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -339,7 +339,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -382,7 +382,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -422,7 +422,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -465,7 +465,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -508,7 +508,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -551,7 +551,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -591,7 +591,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -619,10 +619,10 @@ importers: examples/lit/basic: dependencies: '@tanstack/lit-query': - specifier: ^0.2.8 + specifier: ^0.2.9 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -638,10 +638,10 @@ importers: examples/lit/pagination: dependencies: '@tanstack/lit-query': - specifier: ^0.2.8 + specifier: ^0.2.9 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -660,10 +660,10 @@ importers: specifier: ^3.3.0 version: 3.3.1 '@tanstack/lit-query': - specifier: ^0.2.8 + specifier: ^0.2.9 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -685,7 +685,7 @@ importers: examples/preact/simple: dependencies: '@tanstack/preact-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/preact-query preact: specifier: ^10.28.0 @@ -713,10 +713,10 @@ importers: specifier: 5.2.1 version: 5.2.1 '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -726,7 +726,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -747,10 +747,10 @@ importers: examples/react/auto-refetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -775,16 +775,16 @@ importers: examples/react/basic: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-async-storage-persister '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-persist-client react: specifier: ^19.0.0 @@ -794,7 +794,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -815,10 +815,10 @@ importers: examples/react/basic-graphql-request: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools graphql: specifier: ^16.9.0 @@ -843,10 +843,10 @@ importers: examples/react/chat: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -874,10 +874,10 @@ importers: examples/react/default-query-function: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -899,10 +899,10 @@ importers: examples/react/devtools-panel: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -924,16 +924,16 @@ importers: examples/react/eslint-legacy: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-async-storage-persister '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-persist-client react: specifier: ^19.0.0 @@ -943,7 +943,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -964,14 +964,14 @@ importers: examples/react/eslint-plugin-demo: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query react: specifier: ^19.0.0 version: 19.2.4 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/eslint-plugin-query eslint: specifier: ^9.39.0 @@ -986,10 +986,10 @@ importers: examples/react/infinite-query-with-max-pages: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1014,10 +1014,10 @@ importers: examples/react/load-more-infinite-scroll: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1045,10 +1045,10 @@ importers: examples/react/nextjs: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1073,10 +1073,10 @@ importers: examples/react/nextjs-app-prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1101,13 +1101,13 @@ importers: examples/react/nextjs-suspense-streaming: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools '@tanstack/react-query-next-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-next-experimental next: specifier: ^16.0.7 @@ -1132,19 +1132,19 @@ importers: examples/react/offline: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-async-storage-persister '@tanstack/react-location': specifier: ^3.7.4 version: 3.7.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-persist-client msw: specifier: ^2.6.6 @@ -1172,10 +1172,10 @@ importers: examples/react/optimistic-updates-cache: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1200,10 +1200,10 @@ importers: examples/react/optimistic-updates-ui: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1228,10 +1228,10 @@ importers: examples/react/pagination: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1256,10 +1256,10 @@ importers: examples/react/playground: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1281,10 +1281,10 @@ importers: examples/react/prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1318,10 +1318,10 @@ importers: specifier: ^6.4.1 version: 6.4.1(@react-navigation/native@6.1.18(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-gesture-handler@2.30.1(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@4.14.1(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools expo: specifier: ^52.0.11 @@ -1370,10 +1370,10 @@ importers: examples/react/react-router: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools localforage: specifier: ^1.10.0 @@ -1422,10 +1422,10 @@ importers: examples/react/rick-morty: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1459,10 +1459,10 @@ importers: examples/react/shadow-dom: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1490,10 +1490,10 @@ importers: examples/react/simple: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1515,10 +1515,10 @@ importers: examples/react/star-wars: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1552,10 +1552,10 @@ importers: examples/react/suspense: dependencies: '@tanstack/react-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/react-query-devtools font-awesome: specifier: ^4.7.0 @@ -1598,10 +1598,10 @@ importers: specifier: ^8.1.3 version: 8.2.11(@sveltejs/kit@2.57.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.1)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.55.1)(typescript@5.8.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(astro@5.18.1(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@1.21.7)(lightningcss@1.32.0)(rollup@4.60.1)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.8.3)(yaml@2.8.3))(next@16.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.90.0))(react@19.2.4)(rollup@4.60.1)(svelte@5.55.1)(vue@3.5.31(typescript@5.8.3)) '@tanstack/solid-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query-devtools astro: specifier: ^5.5.6 @@ -1619,10 +1619,10 @@ importers: examples/solid/basic: dependencies: '@tanstack/solid-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1641,10 +1641,10 @@ importers: examples/solid/basic-graphql-request: dependencies: '@tanstack/solid-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query-devtools graphql: specifier: ^16.9.0 @@ -1669,10 +1669,10 @@ importers: examples/solid/default-query-function: dependencies: '@tanstack/solid-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1691,16 +1691,16 @@ importers: examples/solid/offline: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-async-storage-persister '@tanstack/solid-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query-devtools '@tanstack/solid-query-persist-client': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query-persist-client msw: specifier: ^2.6.6 @@ -1722,17 +1722,17 @@ importers: examples/solid/simple: dependencies: '@tanstack/solid-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 version: 1.9.12 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/eslint-plugin-query typescript: specifier: 5.8.3 @@ -1756,10 +1756,10 @@ importers: specifier: ^1.1.3 version: 1.3.2(@testing-library/jest-dom@6.9.1)(solid-js@1.9.12)(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/solid-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1771,10 +1771,10 @@ importers: examples/svelte/auto-refetching: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1802,16 +1802,16 @@ importers: examples/svelte/basic: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-async-storage-persister '@tanstack/svelte-query': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-devtools '@tanstack/svelte-query-persist-client': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-persist-client devDependencies: '@sveltejs/adapter-auto': @@ -1839,10 +1839,10 @@ importers: examples/svelte/load-more-infinite-scroll: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1870,10 +1870,10 @@ importers: examples/svelte/optimistic-updates: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1901,10 +1901,10 @@ importers: examples/svelte/playground: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1932,10 +1932,10 @@ importers: examples/svelte/simple: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/vite-plugin-svelte': @@ -1960,10 +1960,10 @@ importers: examples/svelte/ssr: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1991,10 +1991,10 @@ importers: examples/svelte/star-wars: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -2028,10 +2028,10 @@ importers: examples/vue/basic: dependencies: '@tanstack/vue-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.4.27 @@ -2050,7 +2050,7 @@ importers: examples/vue/dependent-queries: dependencies: '@tanstack/vue-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/vue-query vue: specifier: ^3.4.27 @@ -2069,16 +2069,16 @@ importers: examples/vue/persister: dependencies: '@tanstack/query-core': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-core '@tanstack/query-persist-client-core': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-persist-client-core '@tanstack/query-sync-storage-persister': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/query-sync-storage-persister '@tanstack/vue-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/vue-query idb-keyval: specifier: ^6.2.1 @@ -2100,10 +2100,10 @@ importers: examples/vue/simple: dependencies: '@tanstack/vue-query': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^6.1.35 + specifier: ^6.1.36 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.4.27 @@ -2140,7 +2140,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.1 + specifier: ^5.101.2 version: link:../../packages/angular-query-experimental rxjs: specifier: ~7.8.0 @@ -2459,13 +2459,13 @@ importers: version: 7.8.2 vite-plugin-dts: specifier: 4.2.3 - version: 4.2.3(@types/node@22.19.15)(rollup@4.60.1)(typescript@6.0.1-rc)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.2.3(@types/node@22.19.15)(rollup@4.60.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vite-plugin-externalize-deps: specifier: ^0.9.0 version: 0.9.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@6.0.1-rc)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: '@tanstack/query-devtools': specifier: workspace:* @@ -2557,7 +2557,7 @@ importers: version: 17.5.0 typescript-eslint: specifier: 8.58.1 - version: 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc) + version: 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) packages/preact-query: dependencies: @@ -3287,6 +3287,7 @@ packages: '@angular/animations@20.3.18': resolution: {integrity: sha512-XFxgSyjfs0SRD2vQVFJljmM4z9nTvUoI8TRqSre/+l8D2FgzD5pG67Aj2BgDgpSFAUkIcI37G48ijK7a3ZZ3WA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + deprecated: '@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.' peerDependencies: '@angular/core': 20.3.18 @@ -4912,7 +4913,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {'0': node >=0.10.0} + engines: {node: '>=0.10.0'} '@expo/cli@0.22.28': resolution: {integrity: sha512-lvt72KNitGuixYD2l3SZmRKVu2G4zJpmg5V7WfUBNpmUU5oODBw/6qmiJ6kSLAlfDozscUk+BBGknBBzxUrwrA==} @@ -6497,11 +6498,13 @@ packages: '@react-navigation/core@6.4.17': resolution: {integrity: sha512-Nd76EpomzChWAosGqWOYE3ItayhDzIEzzZsT7PfGcRFDgW5miHV2t4MZcq9YIK4tzxZjVVpYbIynOOQQd1e0Cg==} + deprecated: This version is no longer supported peerDependencies: react: '*' '@react-navigation/elements@1.3.31': resolution: {integrity: sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ==} + deprecated: This version is no longer supported peerDependencies: '@react-navigation/native': ^6.0.0 react: '*' @@ -6510,15 +6513,18 @@ packages: '@react-navigation/native@6.1.18': resolution: {integrity: sha512-mIT9MiL/vMm4eirLcmw2h6h/Nm5FICtnYSdohq4vTLA2FF/6PNhByM7s8ffqoVfE5L0uAa6Xda1B7oddolUiGg==} + deprecated: This version is no longer supported peerDependencies: react: '*' react-native: '*' '@react-navigation/routers@6.1.9': resolution: {integrity: sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==} + deprecated: This version is no longer supported '@react-navigation/stack@6.4.1': resolution: {integrity: sha512-upMEHOKMtuMu4c9gmoPlO/JqI6mDlSqwXg1aXKOTQLXAF8H5koOLRfrmi7AkdiE9A7lDXWUAZoGuD9O88cYvDQ==} + deprecated: This version is no longer supported peerDependencies: '@react-navigation/native': ^6.0.0 react: '*' @@ -7613,6 +7619,7 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} @@ -15276,6 +15283,7 @@ packages: tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} + deprecated: unmaintained hasBin: true peerDependencies: typescript: ^5.0.0 @@ -21516,22 +21524,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/type-utils': 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc) - '@typescript-eslint/utils': 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc) - '@typescript-eslint/visitor-keys': 8.58.1 - eslint: 9.39.4(jiti@2.6.1) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.1-rc) - typescript: 6.0.1-rc - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.58.1 @@ -21556,18 +21548,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc)': - dependencies: - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.1-rc) - '@typescript-eslint/visitor-keys': 8.58.1 - debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) - typescript: 6.0.1-rc - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.58.1(typescript@5.8.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.8.3) @@ -21586,15 +21566,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.1(typescript@6.0.1-rc)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.1-rc) - '@typescript-eslint/types': 8.58.1 - debug: 4.4.3 - typescript: 6.0.1-rc - transitivePeerDependencies: - - supports-color - '@typescript-eslint/rule-tester@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/parser': 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) @@ -21622,10 +21593,6 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.58.1(typescript@6.0.1-rc)': - dependencies: - typescript: 6.0.1-rc - '@typescript-eslint/type-utils@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.58.1 @@ -21650,18 +21617,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc)': - dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.1-rc) - '@typescript-eslint/utils': 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc) - debug: 4.4.3 - eslint: 9.39.4(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@6.0.1-rc) - typescript: 6.0.1-rc - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@8.58.1': {} '@typescript-eslint/typescript-estree@8.58.1(typescript@5.8.3)': @@ -21694,21 +21649,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.58.1(typescript@6.0.1-rc)': - dependencies: - '@typescript-eslint/project-service': 8.58.1(typescript@6.0.1-rc) - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.1-rc) - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.5.0(typescript@6.0.1-rc) - typescript: 6.0.1-rc - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) @@ -21731,17 +21671,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.1-rc) - eslint: 9.39.4(jiti@2.6.1) - typescript: 6.0.1-rc - transitivePeerDependencies: - - supports-color - '@typescript-eslint/visitor-keys@8.58.1': dependencies: '@typescript-eslint/types': 8.58.1 @@ -22145,19 +22074,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@vue/language-core@2.1.6(typescript@6.0.1-rc)': - dependencies: - '@volar/language-core': 2.4.28 - '@vue/compiler-dom': 3.5.31 - '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.31 - computeds: 0.0.1 - minimatch: 9.0.9 - muggle-string: 0.4.1 - path-browserify: 1.0.1 - optionalDependencies: - typescript: 6.0.1-rc - '@vue/language-core@2.2.12(typescript@5.8.3)': dependencies: '@volar/language-core': 2.4.15 @@ -31412,10 +31328,6 @@ snapshots: dependencies: typescript: 5.9.3 - ts-api-utils@2.5.0(typescript@6.0.1-rc): - dependencies: - typescript: 6.0.1-rc - ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: picomatch: 4.0.4 @@ -31435,10 +31347,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - tsconfck@3.1.6(typescript@6.0.1-rc): - optionalDependencies: - typescript: 6.0.1-rc - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -31611,17 +31519,6 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-eslint@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc): - dependencies: - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc) - '@typescript-eslint/parser': 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc) - '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.1-rc) - '@typescript-eslint/utils': 8.58.1(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.1-rc) - eslint: 9.39.4(jiti@2.6.1) - typescript: 6.0.1-rc - transitivePeerDependencies: - - supports-color - typescript@5.3.3: {} typescript@5.4.2: {} @@ -32080,25 +31977,6 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.2.3(@types/node@22.19.15)(rollup@4.60.1)(typescript@6.0.1-rc)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): - dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@22.19.15) - '@rollup/pluginutils': 5.3.0(rollup@4.60.1) - '@volar/typescript': 2.4.28 - '@vue/language-core': 2.1.6(typescript@6.0.1-rc) - compare-versions: 6.1.1 - debug: 4.4.3 - kolorist: 1.8.0 - local-pkg: 0.5.1 - magic-string: 0.30.21 - typescript: 6.0.1-rc - optionalDependencies: - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - vite-plugin-externalize-deps@0.10.0(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) @@ -32158,17 +32036,6 @@ snapshots: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@6.0.1-rc)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): - dependencies: - debug: 4.4.3 - globrex: 0.1.2 - tsconfck: 3.1.6(typescript@6.0.1-rc) - optionalDependencies: - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - transitivePeerDependencies: - - supports-color - - typescript - vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): dependencies: esbuild: 0.27.4 From 41b775fe6a39e05c23f06be69eb24c2283e45c4d Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 29 Jun 2026 10:30:53 +0900 Subject: [PATCH 33/97] test(query-core/queryObserver): add test for pending state with a synchronous queryFn (#10998) --- .../src/__tests__/queryObserver.test.tsx | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/query-core/src/__tests__/queryObserver.test.tsx b/packages/query-core/src/__tests__/queryObserver.test.tsx index 93946f289a6..79dc3a8e588 100644 --- a/packages/query-core/src/__tests__/queryObserver.test.tsx +++ b/packages/query-core/src/__tests__/queryObserver.test.tsx @@ -42,6 +42,34 @@ describe('queryObserver', () => { expect(queryFn).toHaveBeenCalledTimes(1) }) + it('should go through a pending state even when the queryFn returns synchronously', async () => { + const key = queryKey() + const queryFn = vi + .fn<(...args: Array) => string>() + .mockReturnValue('data') + const observer = new QueryObserver(queryClient, { queryKey: key, queryFn }) + const unsubscribe = observer.subscribe(() => undefined) + + // A synchronous return value is still wrapped in a promise, so the query + // goes through a fetching state before it resolves. + expect(queryFn).toHaveBeenCalledTimes(1) + expect(observer.getCurrentResult()).toMatchObject({ + status: 'pending', + fetchStatus: 'fetching', + data: undefined, + }) + + await vi.advanceTimersByTimeAsync(0) + + expect(observer.getCurrentResult()).toMatchObject({ + status: 'success', + fetchStatus: 'idle', + data: 'data', + }) + + unsubscribe() + }) + it('should be able to read latest data after subscribing', () => { const key = queryKey() queryClient.setQueryData(key, 'data') From 8d979dad832998d2d75707d268b7f97bae12e4a9 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 29 Jun 2026 11:54:05 +0900 Subject: [PATCH 34/97] test(angular-query/devtools): add test for reactive 'theme' update (#10999) --- .../src/__tests__/with-devtools.test.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/packages/angular-query-experimental/src/__tests__/with-devtools.test.ts b/packages/angular-query-experimental/src/__tests__/with-devtools.test.ts index 6907186a928..47ce1173440 100644 --- a/packages/angular-query-experimental/src/__tests__/with-devtools.test.ts +++ b/packages/angular-query-experimental/src/__tests__/with-devtools.test.ts @@ -17,6 +17,7 @@ import type { DevtoolsButtonPosition, DevtoolsErrorType, DevtoolsPosition, + Theme, } from '@tanstack/query-devtools' import type { DevtoolsOptions } from '../devtools' @@ -28,6 +29,7 @@ const mockDevtoolsInstance = { setErrorTypes: vi.fn(), setButtonPosition: vi.fn(), setInitialIsOpen: vi.fn(), + setTheme: vi.fn(), } function MockTanstackQueryDevtools() { @@ -433,6 +435,38 @@ describe('withDevtools feature', () => { expect(mockDevtoolsInstance.setInitialIsOpen).toHaveBeenCalledWith(true) }) + it('should update theme', async () => { + const theme = signal('system') + + TestBed.configureTestingModule({ + providers: [ + provideZonelessChangeDetection(), + provideTanStackQuery( + new QueryClient(), + withDevtools(() => ({ + loadDevtools: true, + theme: theme(), + })), + ), + ], + }) + + TestBed.inject(ENVIRONMENT_INITIALIZER) + await vi.advanceTimersByTimeAsync(0) + await vi.dynamicImportSettled() + + TestBed.tick() + + expect(mockDevtoolsInstance.setTheme).toHaveBeenCalledTimes(0) + + theme.set('dark') + + TestBed.tick() + + expect(mockDevtoolsInstance.setTheme).toHaveBeenCalledTimes(1) + expect(mockDevtoolsInstance.setTheme).toHaveBeenCalledWith('dark') + }) + it('should destroy devtools', async () => { const loadDevtools = signal(true) From d6798b56b454a54fbeaf65fef894f323ed264ead Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 29 Jun 2026 12:10:31 +0900 Subject: [PATCH 35/97] docs(angular-query/devtools): add the 'theme' option (#11002) --- docs/framework/angular/devtools.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/framework/angular/devtools.md b/docs/framework/angular/devtools.md index e02c328ccbb..0103213a350 100644 --- a/docs/framework/angular/devtools.md +++ b/docs/framework/angular/devtools.md @@ -137,7 +137,7 @@ export const appConfig: ApplicationConfig = { ### Options returned from the callback -Of these options `loadDevtools`, `client`, `position`, `errorTypes`, `buttonPosition`, and `initialIsOpen` support reactivity through signals. +Of these options `loadDevtools`, `client`, `position`, `errorTypes`, `buttonPosition`, `initialIsOpen`, and `theme` support reactivity through signals. - `loadDevtools?: 'auto' | boolean` - Defaults to `auto`: lazily loads devtools when in development mode. Skips loading in production mode. @@ -162,3 +162,6 @@ Of these options `loadDevtools`, `client`, `position`, `errorTypes`, `buttonPosi - Use this to pass a shadow DOM target to the devtools so that the styles will be applied within the shadow DOM instead of within the head tag in the light DOM. - `hideDisabledQueries?: boolean` - Set this to true to hide disabled queries from the devtools panel. +- `theme?: "light" | "dark" | "system"` + - Defaults to `system`. + - Set this to change the theme of the devtools panel. From cb115eaf029a7a0c4e9acf7257d9306e4bc0c9fa Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Fri, 3 Jul 2026 10:40:02 +0900 Subject: [PATCH 36/97] test(react-query-devtools/ReactQueryDevtools): add tests for forwarding option changes after mount (#11019) * test(react-query-devtools/ReactQueryDevtools): add tests for forwarding option changes after mount * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../src/__tests__/ReactQueryDevtools.test.tsx | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/packages/react-query-devtools/src/__tests__/ReactQueryDevtools.test.tsx b/packages/react-query-devtools/src/__tests__/ReactQueryDevtools.test.tsx index a869ef1fd04..922ba82377a 100644 --- a/packages/react-query-devtools/src/__tests__/ReactQueryDevtools.test.tsx +++ b/packages/react-query-devtools/src/__tests__/ReactQueryDevtools.test.tsx @@ -182,6 +182,83 @@ describe('ReactQueryDevtools', () => { ) }) + it('should forward a "buttonPosition" change to the devtools instance after mount', async () => { + const { ReactQueryDevtools } = await import('../ReactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setButtonPositionMock.mockClear() + + rerender( + , + ) + + expect(setButtonPositionMock).toHaveBeenCalledWith('top-left') + }) + + it('should forward a "position" change to the devtools instance after mount', async () => { + const { ReactQueryDevtools } = await import('../ReactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setPositionMock.mockClear() + + rerender() + + expect(setPositionMock).toHaveBeenCalledWith('top') + }) + + it('should forward an "initialIsOpen" change to the devtools instance after mount', async () => { + const { ReactQueryDevtools } = await import('../ReactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setInitialIsOpenMock.mockClear() + + rerender() + + expect(setInitialIsOpenMock).toHaveBeenCalledWith(true) + }) + + it('should forward an "errorTypes" change to the devtools instance after mount', async () => { + const { ReactQueryDevtools } = await import('../ReactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setErrorTypesMock.mockClear() + + const errorTypes = [ + { name: 'Network', initializer: () => new Error('Network') }, + ] + rerender( + , + ) + + expect(setErrorTypesMock).toHaveBeenCalledWith(errorTypes) + }) + + it('should forward a "theme" change to the devtools instance after mount', async () => { + const { ReactQueryDevtools } = await import('../ReactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setThemeMock.mockClear() + + rerender() + + expect(setThemeMock).toHaveBeenCalledWith('dark') + }) + it('should call "unmount" on the devtools instance when the component unmounts', async () => { const { ReactQueryDevtools } = await import('../ReactQueryDevtools') const queryClient = new QueryClient() From 6ec2ebcbe618b3262a4a38ebbbadb29803133780 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Fri, 3 Jul 2026 12:44:31 +0900 Subject: [PATCH 37/97] test(preact-query-devtools/PreactQueryDevtools): add tests for forwarding option changes after mount (#11020) * test(preact-query-devtools/PreactQueryDevtools): add tests for forwarding option changes after mount * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../__tests__/PreactQueryDevtools.test.tsx | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/packages/preact-query-devtools/src/__tests__/PreactQueryDevtools.test.tsx b/packages/preact-query-devtools/src/__tests__/PreactQueryDevtools.test.tsx index cdbd85021d6..3dea38a137a 100644 --- a/packages/preact-query-devtools/src/__tests__/PreactQueryDevtools.test.tsx +++ b/packages/preact-query-devtools/src/__tests__/PreactQueryDevtools.test.tsx @@ -182,6 +182,86 @@ describe('PreactQueryDevtools', () => { ) }) + it('should forward a "buttonPosition" change to the devtools instance after mount', async () => { + const { PreactQueryDevtools } = await import('../PreactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setButtonPositionMock.mockClear() + + rerender( + , + ) + + expect(setButtonPositionMock).toHaveBeenCalledWith('top-left') + }) + + it('should forward a "position" change to the devtools instance after mount', async () => { + const { PreactQueryDevtools } = await import('../PreactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setPositionMock.mockClear() + + rerender() + + expect(setPositionMock).toHaveBeenCalledWith('top') + }) + + it('should forward an "initialIsOpen" change to the devtools instance after mount', async () => { + const { PreactQueryDevtools } = await import('../PreactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setInitialIsOpenMock.mockClear() + + rerender() + + expect(setInitialIsOpenMock).toHaveBeenCalledWith(true) + }) + + it('should forward an "errorTypes" change to the devtools instance after mount', async () => { + const { PreactQueryDevtools } = await import('../PreactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setErrorTypesMock.mockClear() + + const errorTypes = [ + { name: 'Network', initializer: () => new Error('Network') }, + ] + rerender( + , + ) + + expect(setErrorTypesMock).toHaveBeenCalledWith(errorTypes) + }) + + it('should forward a "theme" change to the devtools instance after mount', async () => { + const { PreactQueryDevtools } = await import('../PreactQueryDevtools') + const queryClient = new QueryClient() + + const { rerender } = render( + , + ) + setThemeMock.mockClear() + + rerender() + + expect(setThemeMock).toHaveBeenCalledWith('dark') + }) + it('should call "unmount" on the devtools instance when the component unmounts', async () => { const { PreactQueryDevtools } = await import('../PreactQueryDevtools') const queryClient = new QueryClient() From be8f11b22b6509763cb58bdaedf9b8e0a96ee141 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Fri, 3 Jul 2026 12:51:09 +0900 Subject: [PATCH 38/97] test(solid-query-devtools/devtools): add tests for forwarding option changes after mount (#11021) * test(solid-query-devtools/devtools): add tests for forwarding option changes after mount * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../src/__tests__/devtools.test.tsx | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/packages/solid-query-devtools/src/__tests__/devtools.test.tsx b/packages/solid-query-devtools/src/__tests__/devtools.test.tsx index 5d197d7e75c..f171551b7c8 100644 --- a/packages/solid-query-devtools/src/__tests__/devtools.test.tsx +++ b/packages/solid-query-devtools/src/__tests__/devtools.test.tsx @@ -1,8 +1,15 @@ import { afterEach, describe, expect, it, vi } from 'vitest' +import { createSignal } from 'solid-js' import { render } from '@solidjs/testing-library' import { QueryClient, QueryClientProvider } from '@tanstack/solid-query' import { TanstackQueryDevtools } from '@tanstack/query-devtools' import SolidQueryDevtools from '../devtools' +import type { + DevtoolsButtonPosition, + DevtoolsErrorType, + DevtoolsPosition, + Theme, +} from '@tanstack/query-devtools' describe('SolidQueryDevtools', () => { afterEach(() => { @@ -140,6 +147,101 @@ describe('SolidQueryDevtools', () => { expect(setClient).toHaveBeenCalledWith(queryClient) }) + it('should forward a "buttonPosition" change to the devtools instance after mount', () => { + const setButtonPosition = vi.spyOn( + TanstackQueryDevtools.prototype, + 'setButtonPosition', + ) + const queryClient = new QueryClient() + const [buttonPosition, setButtonPositionSignal] = + createSignal('bottom-right') + + render(() => ( + + )) + setButtonPosition.mockClear() + + setButtonPositionSignal('top-left') + + expect(setButtonPosition).toHaveBeenCalledWith('top-left') + }) + + it('should forward a "position" change to the devtools instance after mount', () => { + const setPosition = vi.spyOn(TanstackQueryDevtools.prototype, 'setPosition') + const queryClient = new QueryClient() + const [position, setPositionSignal] = + createSignal('bottom') + + render(() => ( + + )) + setPosition.mockClear() + + setPositionSignal('top') + + expect(setPosition).toHaveBeenCalledWith('top') + }) + + it('should forward an "initialIsOpen" change to the devtools instance after mount', () => { + const setInitialIsOpen = vi.spyOn( + TanstackQueryDevtools.prototype, + 'setInitialIsOpen', + ) + const queryClient = new QueryClient() + const [initialIsOpen, setInitialIsOpenSignal] = createSignal(false) + + render(() => ( + + )) + setInitialIsOpen.mockClear() + + setInitialIsOpenSignal(true) + + expect(setInitialIsOpen).toHaveBeenCalledWith(true) + }) + + it('should forward an "errorTypes" change to the devtools instance after mount', () => { + const setErrorTypes = vi.spyOn( + TanstackQueryDevtools.prototype, + 'setErrorTypes', + ) + const queryClient = new QueryClient() + const [errorTypes, setErrorTypesSignal] = createSignal< + Array + >([]) + + render(() => ( + + )) + setErrorTypes.mockClear() + + const nextErrorTypes = [ + { name: 'Network', initializer: () => new Error('Network') }, + ] + setErrorTypesSignal(nextErrorTypes) + + expect(setErrorTypes).toHaveBeenCalledWith(nextErrorTypes) + }) + + it('should forward a "theme" change to the devtools instance after mount', () => { + const setTheme = vi.spyOn(TanstackQueryDevtools.prototype, 'setTheme') + const queryClient = new QueryClient() + const [theme, setThemeSignal] = createSignal('light') + + render(() => ) + setTheme.mockClear() + + setThemeSignal('dark') + + expect(setTheme).toHaveBeenCalledWith('dark') + }) + it('should call "unmount" on the devtools instance when the component unmounts', () => { const unmount = vi.spyOn(TanstackQueryDevtools.prototype, 'unmount') const queryClient = new QueryClient() From 6a5bc45f92bc10d9470468cf8487054dc9721a2a Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 4 Jul 2026 15:28:45 +0900 Subject: [PATCH 39/97] test(react-query-devtools): extract shared test setup into 'beforeEach' (#11026) --- .../src/__tests__/ReactQueryDevtools.test.tsx | 109 +++++------------- .../ReactQueryDevtoolsPanel.test.tsx | 99 ++++------------ 2 files changed, 54 insertions(+), 154 deletions(-) diff --git a/packages/react-query-devtools/src/__tests__/ReactQueryDevtools.test.tsx b/packages/react-query-devtools/src/__tests__/ReactQueryDevtools.test.tsx index 922ba82377a..a55b98970b5 100644 --- a/packages/react-query-devtools/src/__tests__/ReactQueryDevtools.test.tsx +++ b/packages/react-query-devtools/src/__tests__/ReactQueryDevtools.test.tsx @@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { render } from '@testing-library/react' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { TanstackQueryDevtools } from '@tanstack/query-devtools' +import type { ReactQueryDevtools as ReactQueryDevtoolsComponent } from '../ReactQueryDevtools' const mountMock = vi.fn() const unmountMock = vi.fn() @@ -26,22 +27,22 @@ vi.mock('@tanstack/query-devtools', () => ({ })) describe('ReactQueryDevtools', () => { - beforeEach(() => { + let ReactQueryDevtools: typeof ReactQueryDevtoolsComponent + let queryClient: QueryClient + + beforeEach(async () => { vi.clearAllMocks() + ;({ ReactQueryDevtools } = await import('../ReactQueryDevtools')) + queryClient = new QueryClient() }) - it('should throw an error if no query client has been set', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - + it('should throw an error if no query client has been set', () => { expect(() => render()).toThrow( 'No QueryClient set, use QueryClientProvider to set one', ) }) - it('should not throw an error if query client is provided via context', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should not throw an error if query client is provided via context', () => { expect(() => render( @@ -52,20 +53,14 @@ describe('ReactQueryDevtools', () => { expect(mountMock).toHaveBeenCalled() }) - it('should not throw an error if query client is provided via props', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should not throw an error if query client is provided via props', () => { expect(() => render(), ).not.toThrow() expect(mountMock).toHaveBeenCalled() }) - it('should forward "buttonPosition" to the devtools instance', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "buttonPosition" to the devtools instance', () => { render( , ) @@ -73,36 +68,25 @@ describe('ReactQueryDevtools', () => { expect(setButtonPositionMock).toHaveBeenCalledWith('top-left') }) - it('should forward "position" to the devtools instance', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "position" to the devtools instance', () => { render() expect(setPositionMock).toHaveBeenCalledWith('left') }) - it('should forward "initialIsOpen" to the devtools instance', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "initialIsOpen" to the devtools instance', () => { render() expect(setInitialIsOpenMock).toHaveBeenCalledWith(true) }) - it('should default "initialIsOpen" to "false" when the prop is omitted', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should default "initialIsOpen" to "false" when the prop is omitted', () => { render() expect(setInitialIsOpenMock).toHaveBeenCalledWith(false) }) - it('should forward "errorTypes" to the devtools instance', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() + it('should forward "errorTypes" to the devtools instance', () => { const errorTypes = [ { name: 'Network', initializer: () => new Error('Network') }, ] @@ -112,37 +96,25 @@ describe('ReactQueryDevtools', () => { expect(setErrorTypesMock).toHaveBeenCalledWith(errorTypes) }) - it('should default "errorTypes" to an empty array when the prop is omitted', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should default "errorTypes" to an empty array when the prop is omitted', () => { render() expect(setErrorTypesMock).toHaveBeenCalledWith([]) }) - it('should forward "theme" to the devtools instance', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "theme" to the devtools instance', () => { render() expect(setThemeMock).toHaveBeenCalledWith('dark') }) - it('should forward the resolved "QueryClient" via "setClient"', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward the resolved "QueryClient" via "setClient"', () => { render() expect(setClientMock).toHaveBeenCalledWith(queryClient) }) - it('should forward "styleNonce" to the devtools constructor', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "styleNonce" to the devtools constructor', () => { render() expect(TanstackQueryDevtools).toHaveBeenCalledWith( @@ -150,9 +122,7 @@ describe('ReactQueryDevtools', () => { ) }) - it('should forward "shadowDOMTarget" to the devtools constructor', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() + it('should forward "shadowDOMTarget" to the devtools constructor', () => { const shadowDOMTarget = document .createElement('div') .attachShadow({ mode: 'open' }) @@ -169,10 +139,7 @@ describe('ReactQueryDevtools', () => { ) }) - it('should forward "hideDisabledQueries" to the devtools constructor', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "hideDisabledQueries" to the devtools constructor', () => { render( , ) @@ -182,10 +149,7 @@ describe('ReactQueryDevtools', () => { ) }) - it('should forward a "buttonPosition" change to the devtools instance after mount', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward a "buttonPosition" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -198,10 +162,7 @@ describe('ReactQueryDevtools', () => { expect(setButtonPositionMock).toHaveBeenCalledWith('top-left') }) - it('should forward a "position" change to the devtools instance after mount', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward a "position" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -212,10 +173,7 @@ describe('ReactQueryDevtools', () => { expect(setPositionMock).toHaveBeenCalledWith('top') }) - it('should forward an "initialIsOpen" change to the devtools instance after mount', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward an "initialIsOpen" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -226,10 +184,7 @@ describe('ReactQueryDevtools', () => { expect(setInitialIsOpenMock).toHaveBeenCalledWith(true) }) - it('should forward an "errorTypes" change to the devtools instance after mount', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward an "errorTypes" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -245,10 +200,7 @@ describe('ReactQueryDevtools', () => { expect(setErrorTypesMock).toHaveBeenCalledWith(errorTypes) }) - it('should forward a "theme" change to the devtools instance after mount', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward a "theme" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -259,10 +211,7 @@ describe('ReactQueryDevtools', () => { expect(setThemeMock).toHaveBeenCalledWith('dark') }) - it('should call "unmount" on the devtools instance when the component unmounts', async () => { - const { ReactQueryDevtools } = await import('../ReactQueryDevtools') - const queryClient = new QueryClient() - + it('should call "unmount" on the devtools instance when the component unmounts', () => { const { unmount } = render() unmount() @@ -274,8 +223,8 @@ describe('ReactQueryDevtools', () => { vi.resetModules() try { - const { ReactQueryDevtools } = await import('..') - expect(ReactQueryDevtools({})).toBeNull() + const { ReactQueryDevtools: ProductionDevtools } = await import('..') + expect(ProductionDevtools({})).toBeNull() } finally { vi.unstubAllEnvs() vi.resetModules() diff --git a/packages/react-query-devtools/src/__tests__/ReactQueryDevtoolsPanel.test.tsx b/packages/react-query-devtools/src/__tests__/ReactQueryDevtoolsPanel.test.tsx index 779498826d4..a1e15494c1a 100644 --- a/packages/react-query-devtools/src/__tests__/ReactQueryDevtoolsPanel.test.tsx +++ b/packages/react-query-devtools/src/__tests__/ReactQueryDevtoolsPanel.test.tsx @@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { render } from '@testing-library/react' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { TanstackQueryDevtoolsPanel } from '@tanstack/query-devtools' +import type { ReactQueryDevtoolsPanel as ReactQueryDevtoolsPanelComponent } from '../ReactQueryDevtoolsPanel' const mountMock = vi.fn() const unmountMock = vi.fn() @@ -24,24 +25,22 @@ vi.mock('@tanstack/query-devtools', () => ({ })) describe('ReactQueryDevtoolsPanel', () => { - beforeEach(() => { + let ReactQueryDevtoolsPanel: typeof ReactQueryDevtoolsPanelComponent + let queryClient: QueryClient + + beforeEach(async () => { vi.clearAllMocks() + ;({ ReactQueryDevtoolsPanel } = await import('../ReactQueryDevtoolsPanel')) + queryClient = new QueryClient() }) - it('should throw an error if no query client has been set', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - + it('should throw an error if no query client has been set', () => { expect(() => render()).toThrow( 'No QueryClient set, use QueryClientProvider to set one', ) }) - it('should not throw an error if query client is provided via context', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should not throw an error if query client is provided via context', () => { expect(() => render( @@ -52,21 +51,14 @@ describe('ReactQueryDevtoolsPanel', () => { expect(mountMock).toHaveBeenCalled() }) - it('should not throw an error if query client is provided via props', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should not throw an error if query client is provided via props', () => { expect(() => render(), ).not.toThrow() expect(mountMock).toHaveBeenCalled() }) - it('should forward "onClose" to the devtools instance', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() + it('should forward "onClose" to the devtools instance', () => { const onClose = vi.fn() render() @@ -74,20 +66,13 @@ describe('ReactQueryDevtoolsPanel', () => { expect(setOnCloseMock).toHaveBeenCalledWith(expect.any(Function)) }) - it('should default "onClose" to a no-op function when the prop is omitted', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should default "onClose" to a no-op function when the prop is omitted', () => { render() expect(setOnCloseMock).toHaveBeenCalledWith(expect.any(Function)) }) - it('should forward "errorTypes" to the devtools instance', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() + it('should forward "errorTypes" to the devtools instance', () => { const errorTypes = [ { name: 'Network', initializer: () => new Error('Network') }, ] @@ -99,41 +84,25 @@ describe('ReactQueryDevtoolsPanel', () => { expect(setErrorTypesMock).toHaveBeenCalledWith(errorTypes) }) - it('should default "errorTypes" to an empty array when the prop is omitted', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should default "errorTypes" to an empty array when the prop is omitted', () => { render() expect(setErrorTypesMock).toHaveBeenCalledWith([]) }) - it('should forward "theme" to the devtools instance', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should forward "theme" to the devtools instance', () => { render() expect(setThemeMock).toHaveBeenCalledWith('dark') }) - it('should forward the resolved "QueryClient" via "setClient"', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should forward the resolved "QueryClient" via "setClient"', () => { render() expect(setClientMock).toHaveBeenCalledWith(queryClient) }) - it('should forward "styleNonce" to the devtools constructor', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should forward "styleNonce" to the devtools constructor', () => { render() expect(TanstackQueryDevtoolsPanel).toHaveBeenCalledWith( @@ -141,10 +110,7 @@ describe('ReactQueryDevtoolsPanel', () => { ) }) - it('should forward "shadowDOMTarget" to the devtools constructor', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() + it('should forward "shadowDOMTarget" to the devtools constructor', () => { const shadowDOMTarget = document .createElement('div') .attachShadow({ mode: 'open' }) @@ -161,11 +127,7 @@ describe('ReactQueryDevtoolsPanel', () => { ) }) - it('should forward "hideDisabledQueries" to the devtools constructor', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should forward "hideDisabledQueries" to the devtools constructor', () => { render( { ) }) - it('should preserve the default container height when "style" omits "height"', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should preserve the default container height when "style" omits "height"', () => { const { container } = render( { }) }) - it('should let "style" override the default container height on the rendered element', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should let "style" override the default container height on the rendered element', () => { const { container } = render( { }) }) - it('should call "unmount" on the devtools instance when the component unmounts', async () => { - const { ReactQueryDevtoolsPanel } = - await import('../ReactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should call "unmount" on the devtools instance when the component unmounts', () => { const { unmount } = render() unmount() @@ -230,8 +180,9 @@ describe('ReactQueryDevtoolsPanel', () => { vi.resetModules() try { - const { ReactQueryDevtoolsPanel } = await import('..') - expect(ReactQueryDevtoolsPanel({})).toBeNull() + const { ReactQueryDevtoolsPanel: ProductionDevtoolsPanel } = + await import('..') + expect(ProductionDevtoolsPanel({})).toBeNull() } finally { vi.unstubAllEnvs() vi.resetModules() From ee301adc6e3689c841c5c27c99a44d2b29ee3228 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 4 Jul 2026 15:29:26 +0900 Subject: [PATCH 40/97] test(preact-query-devtools): extract shared test setup into 'beforeEach' (#11027) * test(preact-query-devtools): extract shared test setup into 'beforeEach' * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../__tests__/PreactQueryDevtools.test.tsx | 109 +++++------------- .../PreactQueryDevtoolsPanel.test.tsx | 100 +++++----------- 2 files changed, 55 insertions(+), 154 deletions(-) diff --git a/packages/preact-query-devtools/src/__tests__/PreactQueryDevtools.test.tsx b/packages/preact-query-devtools/src/__tests__/PreactQueryDevtools.test.tsx index 3dea38a137a..75e69860edd 100644 --- a/packages/preact-query-devtools/src/__tests__/PreactQueryDevtools.test.tsx +++ b/packages/preact-query-devtools/src/__tests__/PreactQueryDevtools.test.tsx @@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { render } from '@testing-library/preact' import { QueryClient, QueryClientProvider } from '@tanstack/preact-query' import { TanstackQueryDevtools } from '@tanstack/query-devtools' +import type { PreactQueryDevtools as PreactQueryDevtoolsComponent } from '../PreactQueryDevtools' const mountMock = vi.fn() const unmountMock = vi.fn() @@ -26,22 +27,22 @@ vi.mock('@tanstack/query-devtools', () => ({ })) describe('PreactQueryDevtools', () => { - beforeEach(() => { + let PreactQueryDevtools: typeof PreactQueryDevtoolsComponent + let queryClient: QueryClient + + beforeEach(async () => { vi.clearAllMocks() + ;({ PreactQueryDevtools } = await import('../PreactQueryDevtools')) + queryClient = new QueryClient() }) - it('should throw an error if no query client has been set', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - + it('should throw an error if no query client has been set', () => { expect(() => render()).toThrow( 'No QueryClient set, use QueryClientProvider to set one', ) }) - it('should not throw an error if query client is provided via context', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should not throw an error if query client is provided via context', () => { expect(() => render( @@ -52,20 +53,14 @@ describe('PreactQueryDevtools', () => { expect(mountMock).toHaveBeenCalled() }) - it('should not throw an error if query client is provided via props', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should not throw an error if query client is provided via props', () => { expect(() => render(), ).not.toThrow() expect(mountMock).toHaveBeenCalled() }) - it('should forward "buttonPosition" to the devtools instance', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "buttonPosition" to the devtools instance', () => { render( , ) @@ -73,36 +68,25 @@ describe('PreactQueryDevtools', () => { expect(setButtonPositionMock).toHaveBeenCalledWith('top-left') }) - it('should forward "position" to the devtools instance', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "position" to the devtools instance', () => { render() expect(setPositionMock).toHaveBeenCalledWith('left') }) - it('should forward "initialIsOpen" to the devtools instance', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "initialIsOpen" to the devtools instance', () => { render() expect(setInitialIsOpenMock).toHaveBeenCalledWith(true) }) - it('should default "initialIsOpen" to "false" when the prop is omitted', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should default "initialIsOpen" to "false" when the prop is omitted', () => { render() expect(setInitialIsOpenMock).toHaveBeenCalledWith(false) }) - it('should forward "errorTypes" to the devtools instance', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() + it('should forward "errorTypes" to the devtools instance', () => { const errorTypes = [ { name: 'Network', initializer: () => new Error('Network') }, ] @@ -112,37 +96,25 @@ describe('PreactQueryDevtools', () => { expect(setErrorTypesMock).toHaveBeenCalledWith(errorTypes) }) - it('should default "errorTypes" to an empty array when the prop is omitted', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should default "errorTypes" to an empty array when the prop is omitted', () => { render() expect(setErrorTypesMock).toHaveBeenCalledWith([]) }) - it('should forward "theme" to the devtools instance', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "theme" to the devtools instance', () => { render() expect(setThemeMock).toHaveBeenCalledWith('dark') }) - it('should forward the resolved "QueryClient" via "setClient"', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward the resolved "QueryClient" via "setClient"', () => { render() expect(setClientMock).toHaveBeenCalledWith(queryClient) }) - it('should forward "styleNonce" to the devtools constructor', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "styleNonce" to the devtools constructor', () => { render() expect(TanstackQueryDevtools).toHaveBeenCalledWith( @@ -150,9 +122,7 @@ describe('PreactQueryDevtools', () => { ) }) - it('should forward "shadowDOMTarget" to the devtools constructor', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() + it('should forward "shadowDOMTarget" to the devtools constructor', () => { const shadowDOMTarget = document .createElement('div') .attachShadow({ mode: 'open' }) @@ -169,10 +139,7 @@ describe('PreactQueryDevtools', () => { ) }) - it('should forward "hideDisabledQueries" to the devtools constructor', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward "hideDisabledQueries" to the devtools constructor', () => { render( , ) @@ -182,10 +149,7 @@ describe('PreactQueryDevtools', () => { ) }) - it('should forward a "buttonPosition" change to the devtools instance after mount', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward a "buttonPosition" change to the devtools instance after mount', () => { const { rerender } = render( { expect(setButtonPositionMock).toHaveBeenCalledWith('top-left') }) - it('should forward a "position" change to the devtools instance after mount', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward a "position" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -215,10 +176,7 @@ describe('PreactQueryDevtools', () => { expect(setPositionMock).toHaveBeenCalledWith('top') }) - it('should forward an "initialIsOpen" change to the devtools instance after mount', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward an "initialIsOpen" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -229,10 +187,7 @@ describe('PreactQueryDevtools', () => { expect(setInitialIsOpenMock).toHaveBeenCalledWith(true) }) - it('should forward an "errorTypes" change to the devtools instance after mount', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward an "errorTypes" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -248,10 +203,7 @@ describe('PreactQueryDevtools', () => { expect(setErrorTypesMock).toHaveBeenCalledWith(errorTypes) }) - it('should forward a "theme" change to the devtools instance after mount', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should forward a "theme" change to the devtools instance after mount', () => { const { rerender } = render( , ) @@ -262,10 +214,7 @@ describe('PreactQueryDevtools', () => { expect(setThemeMock).toHaveBeenCalledWith('dark') }) - it('should call "unmount" on the devtools instance when the component unmounts', async () => { - const { PreactQueryDevtools } = await import('../PreactQueryDevtools') - const queryClient = new QueryClient() - + it('should call "unmount" on the devtools instance when the component unmounts', () => { const { unmount } = render() unmount() @@ -277,8 +226,8 @@ describe('PreactQueryDevtools', () => { vi.resetModules() try { - const { PreactQueryDevtools } = await import('..') - expect(PreactQueryDevtools({})).toBeNull() + const { PreactQueryDevtools: ProductionDevtools } = await import('..') + expect(ProductionDevtools({})).toBeNull() } finally { vi.unstubAllEnvs() vi.resetModules() diff --git a/packages/preact-query-devtools/src/__tests__/PreactQueryDevtoolsPanel.test.tsx b/packages/preact-query-devtools/src/__tests__/PreactQueryDevtoolsPanel.test.tsx index 1d54b36bb60..fd159307967 100644 --- a/packages/preact-query-devtools/src/__tests__/PreactQueryDevtoolsPanel.test.tsx +++ b/packages/preact-query-devtools/src/__tests__/PreactQueryDevtoolsPanel.test.tsx @@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import { render } from '@testing-library/preact' import { QueryClient, QueryClientProvider } from '@tanstack/preact-query' import { TanstackQueryDevtoolsPanel } from '@tanstack/query-devtools' +import type { PreactQueryDevtoolsPanel as PreactQueryDevtoolsPanelComponent } from '../PreactQueryDevtoolsPanel' const mountMock = vi.fn() const unmountMock = vi.fn() @@ -24,24 +25,23 @@ vi.mock('@tanstack/query-devtools', () => ({ })) describe('PreactQueryDevtoolsPanel', () => { - beforeEach(() => { + let PreactQueryDevtoolsPanel: typeof PreactQueryDevtoolsPanelComponent + let queryClient: QueryClient + + beforeEach(async () => { vi.clearAllMocks() + ;({ PreactQueryDevtoolsPanel } = + await import('../PreactQueryDevtoolsPanel')) + queryClient = new QueryClient() }) - it('should throw an error if no query client has been set', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - + it('should throw an error if no query client has been set', () => { expect(() => render()).toThrow( 'No QueryClient set, use QueryClientProvider to set one', ) }) - it('should not throw an error if query client is provided via context', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should not throw an error if query client is provided via context', () => { expect(() => render( @@ -52,21 +52,14 @@ describe('PreactQueryDevtoolsPanel', () => { expect(mountMock).toHaveBeenCalled() }) - it('should not throw an error if query client is provided via props', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should not throw an error if query client is provided via props', () => { expect(() => render(), ).not.toThrow() expect(mountMock).toHaveBeenCalled() }) - it('should forward "onClose" to the devtools instance', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() + it('should forward "onClose" to the devtools instance', () => { const onClose = vi.fn() render() @@ -74,20 +67,13 @@ describe('PreactQueryDevtoolsPanel', () => { expect(setOnCloseMock).toHaveBeenCalledWith(expect.any(Function)) }) - it('should default "onClose" to a no-op function when the prop is omitted', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should default "onClose" to a no-op function when the prop is omitted', () => { render() expect(setOnCloseMock).toHaveBeenCalledWith(expect.any(Function)) }) - it('should forward "errorTypes" to the devtools instance', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() + it('should forward "errorTypes" to the devtools instance', () => { const errorTypes = [ { name: 'Network', initializer: () => new Error('Network') }, ] @@ -99,41 +85,25 @@ describe('PreactQueryDevtoolsPanel', () => { expect(setErrorTypesMock).toHaveBeenCalledWith(errorTypes) }) - it('should default "errorTypes" to an empty array when the prop is omitted', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should default "errorTypes" to an empty array when the prop is omitted', () => { render() expect(setErrorTypesMock).toHaveBeenCalledWith([]) }) - it('should forward "theme" to the devtools instance', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should forward "theme" to the devtools instance', () => { render() expect(setThemeMock).toHaveBeenCalledWith('dark') }) - it('should forward the resolved "QueryClient" via "setClient"', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should forward the resolved "QueryClient" via "setClient"', () => { render() expect(setClientMock).toHaveBeenCalledWith(queryClient) }) - it('should forward "styleNonce" to the devtools constructor', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should forward "styleNonce" to the devtools constructor', () => { render() expect(TanstackQueryDevtoolsPanel).toHaveBeenCalledWith( @@ -141,10 +111,7 @@ describe('PreactQueryDevtoolsPanel', () => { ) }) - it('should forward "shadowDOMTarget" to the devtools constructor', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() + it('should forward "shadowDOMTarget" to the devtools constructor', () => { const shadowDOMTarget = document .createElement('div') .attachShadow({ mode: 'open' }) @@ -161,11 +128,7 @@ describe('PreactQueryDevtoolsPanel', () => { ) }) - it('should forward "hideDisabledQueries" to the devtools constructor', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should forward "hideDisabledQueries" to the devtools constructor', () => { render( { ) }) - it('should preserve the default container height when "style" omits "height"', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should preserve the default container height when "style" omits "height"', () => { const { container } = render( { }) }) - it('should let "style" override the default container height on the rendered element', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should let "style" override the default container height on the rendered element', () => { const { container } = render( { }) }) - it('should call "unmount" on the devtools instance when the component unmounts', async () => { - const { PreactQueryDevtoolsPanel } = - await import('../PreactQueryDevtoolsPanel') - const queryClient = new QueryClient() - + it('should call "unmount" on the devtools instance when the component unmounts', () => { const { unmount } = render( , ) @@ -232,8 +183,9 @@ describe('PreactQueryDevtoolsPanel', () => { vi.resetModules() try { - const { PreactQueryDevtoolsPanel } = await import('..') - expect(PreactQueryDevtoolsPanel({})).toBeNull() + const { PreactQueryDevtoolsPanel: ProductionDevtoolsPanel } = + await import('..') + expect(ProductionDevtoolsPanel({})).toBeNull() } finally { vi.unstubAllEnvs() vi.resetModules() From 27e680fe3441e83f02bf2e1949c5ea6058cd710a Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 4 Jul 2026 15:33:23 +0900 Subject: [PATCH 41/97] test(solid-query-devtools): extract shared test setup into 'beforeEach' (#11028) --- .../src/__tests__/devtools.test.tsx | 36 ++++--------------- .../src/__tests__/devtoolsPanel.test.tsx | 30 ++++------------ 2 files changed, 14 insertions(+), 52 deletions(-) diff --git a/packages/solid-query-devtools/src/__tests__/devtools.test.tsx b/packages/solid-query-devtools/src/__tests__/devtools.test.tsx index f171551b7c8..26da91a25ae 100644 --- a/packages/solid-query-devtools/src/__tests__/devtools.test.tsx +++ b/packages/solid-query-devtools/src/__tests__/devtools.test.tsx @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, it, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { createSignal } from 'solid-js' import { render } from '@solidjs/testing-library' import { QueryClient, QueryClientProvider } from '@tanstack/solid-query' @@ -12,6 +12,12 @@ import type { } from '@tanstack/query-devtools' describe('SolidQueryDevtools', () => { + let queryClient: QueryClient + + beforeEach(() => { + queryClient = new QueryClient() + }) + afterEach(() => { vi.restoreAllMocks() }) @@ -23,8 +29,6 @@ describe('SolidQueryDevtools', () => { }) it('should not throw an error if query client is provided via context', () => { - const queryClient = new QueryClient() - expect(() => render(() => ( @@ -35,8 +39,6 @@ describe('SolidQueryDevtools', () => { }) it('should not throw an error if query client is provided via props', () => { - const queryClient = new QueryClient() - expect(() => render(() => ), ).not.toThrow() @@ -47,8 +49,6 @@ describe('SolidQueryDevtools', () => { TanstackQueryDevtools.prototype, 'setButtonPosition', ) - const queryClient = new QueryClient() - render(() => ( )) @@ -58,8 +58,6 @@ describe('SolidQueryDevtools', () => { it('should forward "position" to the devtools instance', () => { const setPosition = vi.spyOn(TanstackQueryDevtools.prototype, 'setPosition') - const queryClient = new QueryClient() - render(() => ) expect(setPosition).toHaveBeenCalledWith('left') @@ -70,8 +68,6 @@ describe('SolidQueryDevtools', () => { TanstackQueryDevtools.prototype, 'setInitialIsOpen', ) - const queryClient = new QueryClient() - render(() => ( )) @@ -84,8 +80,6 @@ describe('SolidQueryDevtools', () => { TanstackQueryDevtools.prototype, 'setInitialIsOpen', ) - const queryClient = new QueryClient() - render(() => ) expect(setInitialIsOpen).toHaveBeenCalledWith(false) @@ -96,7 +90,6 @@ describe('SolidQueryDevtools', () => { TanstackQueryDevtools.prototype, 'setErrorTypes', ) - const queryClient = new QueryClient() const errorTypes = [ { name: 'Network', initializer: () => new Error('Network') }, ] @@ -113,8 +106,6 @@ describe('SolidQueryDevtools', () => { TanstackQueryDevtools.prototype, 'setErrorTypes', ) - const queryClient = new QueryClient() - render(() => ) expect(setErrorTypes).toHaveBeenCalledWith([]) @@ -122,8 +113,6 @@ describe('SolidQueryDevtools', () => { it('should forward "theme" to the devtools instance', () => { const setTheme = vi.spyOn(TanstackQueryDevtools.prototype, 'setTheme') - const queryClient = new QueryClient() - render(() => ) expect(setTheme).toHaveBeenCalledWith('dark') @@ -131,8 +120,6 @@ describe('SolidQueryDevtools', () => { it('should default "theme" to "system" when the prop is omitted', () => { const setTheme = vi.spyOn(TanstackQueryDevtools.prototype, 'setTheme') - const queryClient = new QueryClient() - render(() => ) expect(setTheme).toHaveBeenCalledWith('system') @@ -140,8 +127,6 @@ describe('SolidQueryDevtools', () => { it('should forward the resolved "QueryClient" via "setClient"', () => { const setClient = vi.spyOn(TanstackQueryDevtools.prototype, 'setClient') - const queryClient = new QueryClient() - render(() => ) expect(setClient).toHaveBeenCalledWith(queryClient) @@ -152,7 +137,6 @@ describe('SolidQueryDevtools', () => { TanstackQueryDevtools.prototype, 'setButtonPosition', ) - const queryClient = new QueryClient() const [buttonPosition, setButtonPositionSignal] = createSignal('bottom-right') @@ -171,7 +155,6 @@ describe('SolidQueryDevtools', () => { it('should forward a "position" change to the devtools instance after mount', () => { const setPosition = vi.spyOn(TanstackQueryDevtools.prototype, 'setPosition') - const queryClient = new QueryClient() const [position, setPositionSignal] = createSignal('bottom') @@ -190,7 +173,6 @@ describe('SolidQueryDevtools', () => { TanstackQueryDevtools.prototype, 'setInitialIsOpen', ) - const queryClient = new QueryClient() const [initialIsOpen, setInitialIsOpenSignal] = createSignal(false) render(() => ( @@ -211,7 +193,6 @@ describe('SolidQueryDevtools', () => { TanstackQueryDevtools.prototype, 'setErrorTypes', ) - const queryClient = new QueryClient() const [errorTypes, setErrorTypesSignal] = createSignal< Array >([]) @@ -231,7 +212,6 @@ describe('SolidQueryDevtools', () => { it('should forward a "theme" change to the devtools instance after mount', () => { const setTheme = vi.spyOn(TanstackQueryDevtools.prototype, 'setTheme') - const queryClient = new QueryClient() const [theme, setThemeSignal] = createSignal('light') render(() => ) @@ -244,8 +224,6 @@ describe('SolidQueryDevtools', () => { it('should call "unmount" on the devtools instance when the component unmounts', () => { const unmount = vi.spyOn(TanstackQueryDevtools.prototype, 'unmount') - const queryClient = new QueryClient() - const { unmount: unmountComponent } = render(() => ( )) diff --git a/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx b/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx index 76e5e30eeae..d69bac088cc 100644 --- a/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx +++ b/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx @@ -1,10 +1,16 @@ -import { afterEach, describe, expect, it, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { render } from '@solidjs/testing-library' import { QueryClient, QueryClientProvider } from '@tanstack/solid-query' import { TanstackQueryDevtoolsPanel } from '@tanstack/query-devtools' import SolidQueryDevtoolsPanel from '../devtoolsPanel' describe('SolidQueryDevtoolsPanel', () => { + let queryClient: QueryClient + + beforeEach(() => { + queryClient = new QueryClient() + }) + afterEach(() => { vi.restoreAllMocks() }) @@ -16,8 +22,6 @@ describe('SolidQueryDevtoolsPanel', () => { }) it('should not throw an error if query client is provided via context', () => { - const queryClient = new QueryClient() - expect(() => render(() => ( @@ -28,8 +32,6 @@ describe('SolidQueryDevtoolsPanel', () => { }) it('should not throw an error if query client is provided via props', () => { - const queryClient = new QueryClient() - expect(() => render(() => ), ).not.toThrow() @@ -40,7 +42,6 @@ describe('SolidQueryDevtoolsPanel', () => { TanstackQueryDevtoolsPanel.prototype, 'setOnClose', ) - const queryClient = new QueryClient() const onClose = vi.fn() render(() => ( @@ -55,8 +56,6 @@ describe('SolidQueryDevtoolsPanel', () => { TanstackQueryDevtoolsPanel.prototype, 'setOnClose', ) - const queryClient = new QueryClient() - render(() => ) expect(setOnClose).toHaveBeenCalledWith(expect.any(Function)) @@ -67,7 +66,6 @@ describe('SolidQueryDevtoolsPanel', () => { TanstackQueryDevtoolsPanel.prototype, 'setErrorTypes', ) - const queryClient = new QueryClient() const errorTypes = [ { name: 'Network', initializer: () => new Error('Network') }, ] @@ -84,8 +82,6 @@ describe('SolidQueryDevtoolsPanel', () => { TanstackQueryDevtoolsPanel.prototype, 'setErrorTypes', ) - const queryClient = new QueryClient() - render(() => ) expect(setErrorTypes).toHaveBeenCalledWith([]) @@ -93,8 +89,6 @@ describe('SolidQueryDevtoolsPanel', () => { it('should forward "theme" to the devtools instance', () => { const setTheme = vi.spyOn(TanstackQueryDevtoolsPanel.prototype, 'setTheme') - const queryClient = new QueryClient() - render(() => ) expect(setTheme).toHaveBeenCalledWith('dark') @@ -102,8 +96,6 @@ describe('SolidQueryDevtoolsPanel', () => { it('should default "theme" to "system" when the prop is omitted', () => { const setTheme = vi.spyOn(TanstackQueryDevtoolsPanel.prototype, 'setTheme') - const queryClient = new QueryClient() - render(() => ) expect(setTheme).toHaveBeenCalledWith('system') @@ -114,16 +106,12 @@ describe('SolidQueryDevtoolsPanel', () => { TanstackQueryDevtoolsPanel.prototype, 'setClient', ) - const queryClient = new QueryClient() - render(() => ) expect(setClient).toHaveBeenCalledWith(queryClient) }) it('should preserve the default container height when "style" omits "height"', () => { - const queryClient = new QueryClient() - const { container } = render(() => ( { }) it('should let "style" override the default container height on the rendered element', () => { - const queryClient = new QueryClient() - const { container } = render(() => ( { it('should call "unmount" on the devtools instance when the component unmounts', () => { const unmount = vi.spyOn(TanstackQueryDevtoolsPanel.prototype, 'unmount') - const queryClient = new QueryClient() - const { unmount: unmountComponent } = render(() => ( )) From c47678129db66610e210534ed26af5847c82a89c Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 5 Jul 2026 00:20:20 +0900 Subject: [PATCH 42/97] test({react,preact}-query-devtools): assert the forwarded 'onClose' callback in the panel instead of 'expect.any(Function)' (#11029) --- .../src/__tests__/PreactQueryDevtoolsPanel.test.tsx | 6 ++++-- .../src/__tests__/ReactQueryDevtoolsPanel.test.tsx | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/preact-query-devtools/src/__tests__/PreactQueryDevtoolsPanel.test.tsx b/packages/preact-query-devtools/src/__tests__/PreactQueryDevtoolsPanel.test.tsx index fd159307967..3eedadff41f 100644 --- a/packages/preact-query-devtools/src/__tests__/PreactQueryDevtoolsPanel.test.tsx +++ b/packages/preact-query-devtools/src/__tests__/PreactQueryDevtoolsPanel.test.tsx @@ -64,13 +64,15 @@ describe('PreactQueryDevtoolsPanel', () => { render() - expect(setOnCloseMock).toHaveBeenCalledWith(expect.any(Function)) + expect(setOnCloseMock).toHaveBeenCalledWith(onClose) }) it('should default "onClose" to a no-op function when the prop is omitted', () => { render() - expect(setOnCloseMock).toHaveBeenCalledWith(expect.any(Function)) + const forwarded = setOnCloseMock.mock.calls[0]?.[0] + expect(forwarded).toBeInstanceOf(Function) + expect(forwarded()).toBeUndefined() }) it('should forward "errorTypes" to the devtools instance', () => { diff --git a/packages/react-query-devtools/src/__tests__/ReactQueryDevtoolsPanel.test.tsx b/packages/react-query-devtools/src/__tests__/ReactQueryDevtoolsPanel.test.tsx index a1e15494c1a..bdee2f39e9a 100644 --- a/packages/react-query-devtools/src/__tests__/ReactQueryDevtoolsPanel.test.tsx +++ b/packages/react-query-devtools/src/__tests__/ReactQueryDevtoolsPanel.test.tsx @@ -63,13 +63,15 @@ describe('ReactQueryDevtoolsPanel', () => { render() - expect(setOnCloseMock).toHaveBeenCalledWith(expect.any(Function)) + expect(setOnCloseMock).toHaveBeenCalledWith(onClose) }) it('should default "onClose" to a no-op function when the prop is omitted', () => { render() - expect(setOnCloseMock).toHaveBeenCalledWith(expect.any(Function)) + const forwarded = setOnCloseMock.mock.calls[0]?.[0] + expect(forwarded).toBeInstanceOf(Function) + expect(forwarded()).toBeUndefined() }) it('should forward "errorTypes" to the devtools instance', () => { From bb68fa0aa1478640884007ecd989a9e48db253eb Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 5 Jul 2026 00:20:30 +0900 Subject: [PATCH 43/97] test(solid-query-devtools/devtoolsPanel): assert the default 'onClose' is a no-op instead of 'expect.any(Function)' (#11030) --- .../solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx b/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx index d69bac088cc..99d5a5259ba 100644 --- a/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx +++ b/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx @@ -58,7 +58,9 @@ describe('SolidQueryDevtoolsPanel', () => { ) render(() => ) - expect(setOnClose).toHaveBeenCalledWith(expect.any(Function)) + const forwarded = setOnClose.mock.calls[0]![0] + expect(forwarded).toBeInstanceOf(Function) + expect(forwarded()).toBeUndefined() }) it('should forward "errorTypes" to the devtools instance', () => { From 64241b877828b37f812d8cf951c2f8f9848e934d Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 8 Jul 2026 10:39:30 +0900 Subject: [PATCH 44/97] test(query-core/{hydration,queriesObserver}): remove unnecessary 'async' from tests without 'await' (#11035) --- packages/query-core/src/__tests__/hydration.test.tsx | 6 +++--- packages/query-core/src/__tests__/queriesObserver.test.tsx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/query-core/src/__tests__/hydration.test.tsx b/packages/query-core/src/__tests__/hydration.test.tsx index 606e05d236d..2434b7b2b08 100644 --- a/packages/query-core/src/__tests__/hydration.test.tsx +++ b/packages/query-core/src/__tests__/hydration.test.tsx @@ -1643,7 +1643,7 @@ describe('dehydration and rehydration', () => { // synchronous thenable resolution must also produce status: 'success'. // Previously the if (query) branch would spread status: 'pending' from the // server state without correcting it for the resolved data. - it('should set status to success when rehydrating an existing pending query with a synchronously resolved promise', async () => { + it('should set status to success when rehydrating an existing pending query with a synchronously resolved promise', () => { const key = queryKey() // --- server --- @@ -1811,7 +1811,7 @@ describe('dehydration and rehydration', () => { serverQueryClient.clear() }) - it('should set dataUpdatedAt when hydrating a resolved streamed query into a new cache entry', async () => { + it('should set dataUpdatedAt when hydrating a resolved streamed query into a new cache entry', () => { const key = queryKey() // --- server --- @@ -1856,7 +1856,7 @@ describe('dehydration and rehydration', () => { serverQueryClient.clear() }) - it('should set dataUpdatedAt when hydrating a resolved streamed query into an existing cache entry', async () => { + it('should set dataUpdatedAt when hydrating a resolved streamed query into an existing cache entry', () => { const key = queryKey() // --- server --- diff --git a/packages/query-core/src/__tests__/queriesObserver.test.tsx b/packages/query-core/src/__tests__/queriesObserver.test.tsx index 6b9c6ee8c2c..171d1493c7e 100644 --- a/packages/query-core/src/__tests__/queriesObserver.test.tsx +++ b/packages/query-core/src/__tests__/queriesObserver.test.tsx @@ -473,7 +473,7 @@ describe('queriesObserver', () => { expect(newCombined.count).toBe(2) }) - it('should skip combine notifications while suspense queries have no data', async () => { + it('should skip combine notifications while suspense queries have no data', () => { const key = queryKey() const combine = vi.fn((results: Array) => results.map((result) => result.data), @@ -506,7 +506,7 @@ describe('queriesObserver', () => { unsubscribe() }) - it('should skip combine notifications after suspense is enabled without structural changes', async () => { + it('should skip combine notifications after suspense is enabled without structural changes', () => { const key = queryKey() const combine = vi.fn((results: Array) => results.map((result) => result.data), From dea3698b521e9a1d2bb4f781bae7f21d7000674d Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 11 Jul 2026 11:43:57 +0900 Subject: [PATCH 45/97] test(query-core): assert exact booleans with 'toBe' instead of 'toBeTruthy'/'toBeFalsy' (#11043) --- .../src/__tests__/focusManager.test.tsx | 4 ++-- .../src/__tests__/onlineManager.test.tsx | 6 ++--- .../query-core/src/__tests__/query.test.tsx | 2 +- .../src/__tests__/queryClient.test.tsx | 24 +++++++++---------- .../query-core/src/__tests__/utils.test.tsx | 10 ++++---- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/query-core/src/__tests__/focusManager.test.tsx b/packages/query-core/src/__tests__/focusManager.test.tsx index 03e60d5d7f5..842e1b61ce5 100644 --- a/packages/query-core/src/__tests__/focusManager.test.tsx +++ b/packages/query-core/src/__tests__/focusManager.test.tsx @@ -39,7 +39,7 @@ describe('focusManager', () => { vi.advanceTimersByTime(20) expect(count).toEqual(1) - expect(focusManager.isFocused()).toBeTruthy() + expect(focusManager.isFocused()).toBe(true) }) it('should return true for isFocused if document is undefined', () => { @@ -49,7 +49,7 @@ describe('focusManager', () => { delete globalThis.document focusManager.setFocused() - expect(focusManager.isFocused()).toBeTruthy() + expect(focusManager.isFocused()).toBe(true) globalThis.document = document }) diff --git a/packages/query-core/src/__tests__/onlineManager.test.tsx b/packages/query-core/src/__tests__/onlineManager.test.tsx index d9219e01970..ad726274311 100644 --- a/packages/query-core/src/__tests__/onlineManager.test.tsx +++ b/packages/query-core/src/__tests__/onlineManager.test.tsx @@ -19,7 +19,7 @@ describe('onlineManager', () => { // Force navigator to be undefined // @ts-expect-error navigatorSpy.mockImplementation(() => undefined) - expect(onlineManager.isOnline()).toBeTruthy() + expect(onlineManager.isOnline()).toBe(true) navigatorSpy.mockRestore() }) @@ -28,7 +28,7 @@ describe('onlineManager', () => { const navigatorSpy = vi.spyOn(navigator, 'onLine', 'get') navigatorSpy.mockImplementation(() => true) - expect(onlineManager.isOnline()).toBeTruthy() + expect(onlineManager.isOnline()).toBe(true) navigatorSpy.mockRestore() }) @@ -48,7 +48,7 @@ describe('onlineManager', () => { vi.advanceTimersByTime(20) expect(count).toEqual(1) - expect(onlineManager.isOnline()).toBeFalsy() + expect(onlineManager.isOnline()).toBe(false) }) it('setEventListener should call previous remove handler when replacing an event listener', () => { diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index f097a11ef7d..00caf5704ee 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -807,7 +807,7 @@ describe('query', () => { const query = queryCache.find({ queryKey: key })! query.invalidate() - expect(query.state.isInvalidated).toBeTruthy() + expect(query.state.isInvalidated).toBe(true) const previousState = query.state diff --git a/packages/query-core/src/__tests__/queryClient.test.tsx b/packages/query-core/src/__tests__/queryClient.test.tsx index c09db304467..a8db8d10c76 100644 --- a/packages/query-core/src/__tests__/queryClient.test.tsx +++ b/packages/query-core/src/__tests__/queryClient.test.tsx @@ -1781,8 +1781,8 @@ describe('queryClient', () => { void observer1.mutate() void observer2.mutate() - expect(observer1.getCurrentResult().isPaused).toBeTruthy() - expect(observer2.getCurrentResult().isPaused).toBeTruthy() + expect(observer1.getCurrentResult().isPaused).toBe(true) + expect(observer2.getCurrentResult().isPaused).toBe(true) onlineManager.setOnline(true) @@ -1816,8 +1816,8 @@ describe('queryClient', () => { void observer1.mutate() void observer2.mutate() - expect(observer1.getCurrentResult().isPaused).toBeTruthy() - expect(observer2.getCurrentResult().isPaused).toBeTruthy() + expect(observer1.getCurrentResult().isPaused).toBe(true) + expect(observer2.getCurrentResult().isPaused).toBe(true) onlineManager.setOnline(true) @@ -1861,8 +1861,8 @@ describe('queryClient', () => { void observer1.mutate() void observer2.mutate() - expect(observer1.getCurrentResult().isPaused).toBeTruthy() - expect(observer2.getCurrentResult().isPaused).toBeTruthy() + expect(observer1.getCurrentResult().isPaused).toBe(true) + expect(observer2.getCurrentResult().isPaused).toBe(true) onlineManager.setOnline(true) void queryClient.resumePausedMutations() @@ -1885,12 +1885,12 @@ describe('queryClient', () => { void observer.mutate() - expect(observer.getCurrentResult().isPaused).toBeTruthy() + expect(observer.getCurrentResult().isPaused).toBe(true) await queryClient.resumePausedMutations() // still paused because we are still offline - expect(observer.getCurrentResult().isPaused).toBeTruthy() + expect(observer.getCurrentResult().isPaused).toBe(true) onlineManager.setOnline(true) @@ -1909,7 +1909,7 @@ describe('queryClient', () => { void observer.mutate() - expect(observer.getCurrentResult().isPaused).toBeTruthy() + expect(observer.getCurrentResult().isPaused).toBe(true) const state = dehydrate(queryClient) @@ -2004,9 +2004,9 @@ describe('queryClient', () => { void observer3.mutate() - expect(observer.getCurrentResult().isPaused).toBeTruthy() - expect(observer2.getCurrentResult().isPaused).toBeTruthy() - expect(observer3.getCurrentResult().isPaused).toBeTruthy() + expect(observer.getCurrentResult().isPaused).toBe(true) + expect(observer2.getCurrentResult().isPaused).toBe(true) + expect(observer3.getCurrentResult().isPaused).toBe(true) onlineManager.setOnline(true) await vi.advanceTimersByTimeAsync(110) diff --git a/packages/query-core/src/__tests__/utils.test.tsx b/packages/query-core/src/__tests__/utils.test.tsx index 9abd1bf265c..1b102b40d35 100644 --- a/packages/query-core/src/__tests__/utils.test.tsx +++ b/packages/query-core/src/__tests__/utils.test.tsx @@ -79,7 +79,7 @@ describe('core/utils', () => { }) it('should return `true` for object with an undefined constructor', () => { - expect(isPlainObject(Object.create(null))).toBeTruthy() + expect(isPlainObject(Object.create(null))).toBe(true) }) it('should return `false` if constructor does not have an Object-specific method', () => { @@ -89,7 +89,7 @@ describe('core/utils', () => { this.abc = {} } } - expect(isPlainObject(new Foo())).toBeFalsy() + expect(isPlainObject(new Foo())).toBe(false) }) it('should return `false` if the object has a modified prototype', () => { @@ -102,7 +102,7 @@ describe('core/utils', () => { this.vertices.push(v) } - expect(isPlainObject(Object.create(Graph))).toBeFalsy() + expect(isPlainObject(Object.create(Graph))).toBe(false) }) it('should return `false` for object with custom prototype', () => { @@ -110,7 +110,7 @@ describe('core/utils', () => { const obj = Object.create(CustomProto) obj.b = 2 - expect(isPlainObject(obj)).toBeFalsy() + expect(isPlainObject(obj)).toBe(false) }) }) @@ -456,7 +456,7 @@ describe('core/utils', () => { mutationCache: queryClient.getMutationCache(), options: {}, }) - expect(matchMutation(filters, mutation)).toBeFalsy() + expect(matchMutation(filters, mutation)).toBe(false) }) }) From bd0733945f1f7735f2b4208481fbc88e277dcd8b Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 11 Jul 2026 13:28:58 +0900 Subject: [PATCH 46/97] test(solid-query-persist-client/PersistQueryClientProvider): replace 'toMatchObject' with 'toEqual' (#11044) --- .../PersistQueryClientProvider.test.tsx | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) 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 a60e113463e..719a46cf5fa 100644 --- a/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx +++ b/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -114,19 +114,19 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(3) - expect(states[0]).toMatchObject({ + expect(states[0]).toEqual({ status: 'pending', fetchStatus: 'idle', data: undefined, }) - expect(states[1]).toMatchObject({ + expect(states[1]).toEqual({ status: 'success', fetchStatus: 'fetching', data: 'hydrated', }) - expect(states[2]).toMatchObject({ + expect(states[2]).toEqual({ status: 'success', fetchStatus: 'idle', data: 'fetched', @@ -198,19 +198,19 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(3) - expect(states[0]).toMatchObject({ + expect(states[0]).toEqual({ status: 'pending', fetchStatus: 'idle', data: undefined, }) - expect(states[1]).toMatchObject({ + expect(states[1]).toEqual({ status: 'success', fetchStatus: 'fetching', data: 'hydrated', }) - expect(states[2]).toMatchObject({ + expect(states[2]).toEqual({ status: 'success', fetchStatus: 'idle', data: 'fetched', @@ -282,19 +282,19 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(3) - expect(states[0]).toMatchObject({ + expect(states[0]).toEqual({ status: 'success', fetchStatus: 'idle', data: 'initial', }) - expect(states[1]).toMatchObject({ + expect(states[1]).toEqual({ status: 'success', fetchStatus: 'fetching', data: 'hydrated', }) - expect(states[2]).toMatchObject({ + expect(states[2]).toEqual({ status: 'success', fetchStatus: 'idle', data: 'fetched', @@ -371,13 +371,13 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(2) - expect(states[0]).toMatchObject({ + expect(states[0]).toEqual({ status: 'pending', fetchStatus: 'idle', data: undefined, }) - expect(states[1]).toMatchObject({ + expect(states[1]).toEqual({ status: 'success', fetchStatus: 'idle', data: 'hydrated', @@ -580,19 +580,19 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(3) - expect(states[0]).toMatchObject({ + expect(states[0]).toEqual({ status: 'pending', fetchStatus: 'idle', data: undefined, }) - expect(states[1]).toMatchObject({ + expect(states[1]).toEqual({ status: 'success', fetchStatus: 'fetching', data: 'hydrated', }) - expect(states[2]).toMatchObject({ + expect(states[2]).toEqual({ status: 'success', fetchStatus: 'idle', data: 'queryFn2', From 969772dabd7f0da9c41e4c23702cfa3078d762e9 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 11 Jul 2026 13:32:18 +0900 Subject: [PATCH 47/97] test(query-core/hydration): assert the exact infinite query result with 'toEqual' (#11045) --- .../src/__tests__/hydration.test.tsx | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/query-core/src/__tests__/hydration.test.tsx b/packages/query-core/src/__tests__/hydration.test.tsx index 2434b7b2b08..3c61a7ba771 100644 --- a/packages/query-core/src/__tests__/hydration.test.tsx +++ b/packages/query-core/src/__tests__/hydration.test.tsx @@ -1419,10 +1419,10 @@ describe('dehydration and rehydration', () => { hydrate(hydrationClient, dehydrated) const hydratedQuery = hydrationCache.find({ queryKey: key }) - expect(hydratedQuery?.state.data).toBeDefined() - expect(hydratedQuery?.state.data).toHaveProperty('pages') - expect(hydratedQuery?.state.data).toHaveProperty('pageParams') - expect((hydratedQuery?.state.data as any).pages).toHaveLength(1) + expect(hydratedQuery?.state.data).toEqual({ + pages: [{ items: ['page-0'], nextCursor: 1 }], + pageParams: [0], + }) }) it('should attach infiniteQueryBehavior during hydration', async () => { @@ -1548,11 +1548,10 @@ describe('dehydration and rehydration', () => { await vi.advanceTimersByTimeAsync(10) const result = await resultPromise - expect(result).toHaveProperty('pages') - expect(result).toHaveProperty('pageParams') - expect(Array.isArray(result.pages)).toBe(true) - expect(result.pages).toHaveLength(1) - expect(result.pages[0]).toHaveProperty('items') + expect(result).toEqual({ + pages: [{ items: ['page-0'], next: 1 }], + pageParams: [0], + }) }) it('should retain infinite query type after subsequent setOptions calls', async () => { @@ -1632,10 +1631,13 @@ describe('dehydration and rehydration', () => { await vi.advanceTimersByTimeAsync(20) const result = await resultPromise - expect(result.pages).toHaveLength(2) - expect(result.pageParams).toHaveLength(2) - expect(result.pages[0]).toHaveProperty('items') - expect(result.pages[1]).toHaveProperty('items') + expect(result).toEqual({ + pages: [ + { items: ['item-0'], next: 1 }, + { items: ['item-1'], next: 2 }, + ], + pageParams: [0, 1], + }) }) // Companion to the test above: when the query already exists in the cache From f79938ea08b8f5cd5c57d30783b20184865c4002 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 11 Jul 2026 13:32:40 +0900 Subject: [PATCH 48/97] test(vue-query/useQueries): replace 'toMatchObject' with 'toEqual' (#11046) --- packages/vue-query/src/__tests__/useQueries.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-query/src/__tests__/useQueries.test.ts b/packages/vue-query/src/__tests__/useQueries.test.ts index d9dd4b37e37..e0ba22953f1 100644 --- a/packages/vue-query/src/__tests__/useQueries.test.ts +++ b/packages/vue-query/src/__tests__/useQueries.test.ts @@ -264,7 +264,7 @@ describe('useQueries', () => { ) await vi.advanceTimersByTimeAsync(0) - expect(queriesResult.value).toMatchObject({ + expect(queriesResult.value).toEqual({ combined: true, res: [firstResult, secondResult], }) From 7bc34156b01476dc347ab3fbd87b49a3a50a6a07 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 11 Jul 2026 13:51:36 +0900 Subject: [PATCH 49/97] test(solid-query-persist-client/PersistQueryClientProvider): use 'toStrictEqual' to assert the exact state shape (#11047) --- .../PersistQueryClientProvider.test.tsx | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) 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 719a46cf5fa..def88d6df5d 100644 --- a/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx +++ b/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -114,19 +114,19 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(3) - expect(states[0]).toEqual({ + expect(states[0]).toStrictEqual({ status: 'pending', fetchStatus: 'idle', data: undefined, }) - expect(states[1]).toEqual({ + expect(states[1]).toStrictEqual({ status: 'success', fetchStatus: 'fetching', data: 'hydrated', }) - expect(states[2]).toEqual({ + expect(states[2]).toStrictEqual({ status: 'success', fetchStatus: 'idle', data: 'fetched', @@ -198,19 +198,19 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(3) - expect(states[0]).toEqual({ + expect(states[0]).toStrictEqual({ status: 'pending', fetchStatus: 'idle', data: undefined, }) - expect(states[1]).toEqual({ + expect(states[1]).toStrictEqual({ status: 'success', fetchStatus: 'fetching', data: 'hydrated', }) - expect(states[2]).toEqual({ + expect(states[2]).toStrictEqual({ status: 'success', fetchStatus: 'idle', data: 'fetched', @@ -282,19 +282,19 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(3) - expect(states[0]).toEqual({ + expect(states[0]).toStrictEqual({ status: 'success', fetchStatus: 'idle', data: 'initial', }) - expect(states[1]).toEqual({ + expect(states[1]).toStrictEqual({ status: 'success', fetchStatus: 'fetching', data: 'hydrated', }) - expect(states[2]).toEqual({ + expect(states[2]).toStrictEqual({ status: 'success', fetchStatus: 'idle', data: 'fetched', @@ -371,13 +371,13 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(2) - expect(states[0]).toEqual({ + expect(states[0]).toStrictEqual({ status: 'pending', fetchStatus: 'idle', data: undefined, }) - expect(states[1]).toEqual({ + expect(states[1]).toStrictEqual({ status: 'success', fetchStatus: 'idle', data: 'hydrated', @@ -580,19 +580,19 @@ describe('PersistQueryClientProvider', () => { expect(states).toHaveLength(3) - expect(states[0]).toEqual({ + expect(states[0]).toStrictEqual({ status: 'pending', fetchStatus: 'idle', data: undefined, }) - expect(states[1]).toEqual({ + expect(states[1]).toStrictEqual({ status: 'success', fetchStatus: 'fetching', data: 'hydrated', }) - expect(states[2]).toEqual({ + expect(states[2]).toStrictEqual({ status: 'success', fetchStatus: 'idle', data: 'queryFn2', From 0cdfdea38893797642a72fc3da72b58df3dc7265 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 11 Jul 2026 14:52:39 +0900 Subject: [PATCH 50/97] test(query-core/utils,vue-query/mutationOptions): assert reference identity with 'toBe' (#11048) --- packages/query-core/src/__tests__/utils.test.tsx | 2 +- packages/vue-query/src/__tests__/mutationOptions.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/query-core/src/__tests__/utils.test.tsx b/packages/query-core/src/__tests__/utils.test.tsx index 1b102b40d35..7e72376b35c 100644 --- a/packages/query-core/src/__tests__/utils.test.tsx +++ b/packages/query-core/src/__tests__/utils.test.tsx @@ -463,7 +463,7 @@ describe('core/utils', () => { describe('keepPreviousData', () => { it('should return the parameter as is', () => { const x = { a: 1, b: 2 } - expect(keepPreviousData(x)).toEqual(x) + expect(keepPreviousData(x)).toBe(x) }) }) diff --git a/packages/vue-query/src/__tests__/mutationOptions.test.ts b/packages/vue-query/src/__tests__/mutationOptions.test.ts index c58bc8e715a..8c0d424caff 100644 --- a/packages/vue-query/src/__tests__/mutationOptions.test.ts +++ b/packages/vue-query/src/__tests__/mutationOptions.test.ts @@ -24,7 +24,7 @@ describe('mutationOptions', () => { mutationFn: () => sleep(10).then(() => 5), } as const - expect(mutationOptions(object)).toStrictEqual(object) + expect(mutationOptions(object)).toBe(object) }) it('should return the object received as a parameter without any modification (without mutationKey in mutationOptions)', () => { @@ -32,7 +32,7 @@ describe('mutationOptions', () => { mutationFn: () => sleep(10).then(() => 5), } as const - expect(mutationOptions(object)).toStrictEqual(object) + expect(mutationOptions(object)).toBe(object) }) it('should return the getter received as a parameter without any modification (with mutationKey in mutationOptions)', () => { From 72e90c88ebae765571c7c563307c9543ad653178 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 11 Jul 2026 15:03:21 +0900 Subject: [PATCH 51/97] test(vue-query/vueQueryPlugin): assert exact booleans with 'toBe' instead of 'toBeTruthy'/'toBeFalsy' (#11049) --- .../src/__tests__/vueQueryPlugin.test.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts b/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts index cfcb18ce956..11849efedb9 100644 --- a/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts +++ b/packages/vue-query/src/__tests__/vueQueryPlugin.test.ts @@ -271,11 +271,11 @@ describe('VueQueryPlugin', () => { ], }) - expect(customClient.isRestoring?.value).toBeTruthy() + expect(customClient.isRestoring?.value).toBe(true) await vi.advanceTimersByTimeAsync(0) - expect(customClient.isRestoring?.value).toBeFalsy() + expect(customClient.isRestoring?.value).toBe(false) }) it('should delay useQuery subscription and not call fetcher if data is not stale', async () => { @@ -314,14 +314,14 @@ describe('VueQueryPlugin', () => { customClient, ) - expect(customClient.isRestoring?.value).toBeTruthy() - expect(query.isFetching.value).toBeFalsy() + expect(customClient.isRestoring?.value).toBe(true) + expect(query.isFetching.value).toBe(false) expect(query.data.value).toStrictEqual(undefined) expect(fnSpy).toHaveBeenCalledTimes(0) await vi.advanceTimersByTimeAsync(0) - expect(customClient.isRestoring?.value).toBeFalsy() + expect(customClient.isRestoring?.value).toBe(false) expect(query.data.value).toStrictEqual({ foo: 'bar' }) expect(fnSpy).toHaveBeenCalledTimes(0) }) @@ -378,18 +378,18 @@ describe('VueQueryPlugin', () => { customClient, ) - expect(customClient.isRestoring?.value).toBeTruthy() + expect(customClient.isRestoring?.value).toBe(true) - expect(query.isFetching.value).toBeFalsy() + expect(query.isFetching.value).toBe(false) expect(query.data.value).toStrictEqual(undefined) - expect(queries.value[0].isFetching).toBeFalsy() + expect(queries.value[0].isFetching).toBe(false) expect(queries.value[0].data).toStrictEqual(undefined) expect(fnSpy).toHaveBeenCalledTimes(0) await vi.advanceTimersByTimeAsync(0) - expect(customClient.isRestoring?.value).toBeFalsy() + expect(customClient.isRestoring?.value).toBe(false) expect(query.data.value).toStrictEqual({ foo1: 'bar1' }) expect(queries.value[0].data).toStrictEqual({ foo2: 'bar2' }) expect(fnSpy).toHaveBeenCalledTimes(0) From 0a852e0d747964d39aefa8e09da105dc23c0c401 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 11 Jul 2026 15:37:03 +0900 Subject: [PATCH 52/97] test({react,preact,solid}-query/useMutation): improve callback assertions with 'toHaveBeenNthCalledWith' (#11050) --- .../src/__tests__/useMutation.test.tsx | 30 +++++++++++-------- .../src/__tests__/useMutation.test.tsx | 30 +++++++++++-------- .../src/__tests__/useMutation.test.tsx | 30 +++++++++++-------- 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/packages/preact-query/src/__tests__/useMutation.test.tsx b/packages/preact-query/src/__tests__/useMutation.test.tsx index 4ed75ae8df2..8787e3cb883 100644 --- a/packages/preact-query/src/__tests__/useMutation.test.tsx +++ b/packages/preact-query/src/__tests__/useMutation.test.tsx @@ -463,15 +463,15 @@ describe('useMutation', () => { expect(getByRole('heading').textContent).toBe('3') expect(onSuccessMock).toHaveBeenCalledTimes(3) - expect(onSuccessMock).toHaveBeenCalledWith(1) - expect(onSuccessMock).toHaveBeenCalledWith(2) - expect(onSuccessMock).toHaveBeenCalledWith(3) + expect(onSuccessMock).toHaveBeenNthCalledWith(1, 1) + expect(onSuccessMock).toHaveBeenNthCalledWith(2, 2) + expect(onSuccessMock).toHaveBeenNthCalledWith(3, 3) expect(onSettledMock).toHaveBeenCalledTimes(3) - expect(onSettledMock).toHaveBeenCalledWith(1) - expect(onSettledMock).toHaveBeenCalledWith(2) - expect(onSettledMock).toHaveBeenCalledWith(3) + expect(onSettledMock).toHaveBeenNthCalledWith(1, 1) + expect(onSettledMock).toHaveBeenNthCalledWith(2, 2) + expect(onSettledMock).toHaveBeenNthCalledWith(3, 3) }) it('should set correct values for `failureReason` and `failureCount` on multiple mutate calls', async () => { @@ -568,24 +568,30 @@ describe('useMutation', () => { await vi.advanceTimersByTimeAsync(0) expect(getByRole('heading').textContent).toBe('3') expect(onErrorMock).toHaveBeenCalledTimes(3) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 1, 'Expected mock error. All is well! 1', ) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 2, 'Expected mock error. All is well! 2', ) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 3, 'Expected mock error. All is well! 3', ) expect(onSettledMock).toHaveBeenCalledTimes(3) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 1, 'Expected mock error. All is well! 1', ) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 2, 'Expected mock error. All is well! 2', ) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 3, 'Expected mock error. All is well! 3', ) }) diff --git a/packages/react-query/src/__tests__/useMutation.test.tsx b/packages/react-query/src/__tests__/useMutation.test.tsx index b5212bc27ab..dd1d737d7ca 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -462,15 +462,15 @@ describe('useMutation', () => { expect(getByRole('heading').textContent).toBe('3') expect(onSuccessMock).toHaveBeenCalledTimes(3) - expect(onSuccessMock).toHaveBeenCalledWith(1) - expect(onSuccessMock).toHaveBeenCalledWith(2) - expect(onSuccessMock).toHaveBeenCalledWith(3) + expect(onSuccessMock).toHaveBeenNthCalledWith(1, 1) + expect(onSuccessMock).toHaveBeenNthCalledWith(2, 2) + expect(onSuccessMock).toHaveBeenNthCalledWith(3, 3) expect(onSettledMock).toHaveBeenCalledTimes(3) - expect(onSettledMock).toHaveBeenCalledWith(1) - expect(onSettledMock).toHaveBeenCalledWith(2) - expect(onSettledMock).toHaveBeenCalledWith(3) + expect(onSettledMock).toHaveBeenNthCalledWith(1, 1) + expect(onSettledMock).toHaveBeenNthCalledWith(2, 2) + expect(onSettledMock).toHaveBeenNthCalledWith(3, 3) }) it('should set correct values for `failureReason` and `failureCount` on multiple mutate calls', async () => { @@ -567,24 +567,30 @@ describe('useMutation', () => { await vi.advanceTimersByTimeAsync(0) expect(getByRole('heading').textContent).toBe('3') expect(onErrorMock).toHaveBeenCalledTimes(3) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 1, 'Expected mock error. All is well! 1', ) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 2, 'Expected mock error. All is well! 2', ) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 3, 'Expected mock error. All is well! 3', ) expect(onSettledMock).toHaveBeenCalledTimes(3) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 1, 'Expected mock error. All is well! 1', ) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 2, 'Expected mock error. All is well! 2', ) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 3, 'Expected mock error. All is well! 3', ) }) diff --git a/packages/solid-query/src/__tests__/useMutation.test.tsx b/packages/solid-query/src/__tests__/useMutation.test.tsx index a9efbebe7e3..7d07509dd2e 100644 --- a/packages/solid-query/src/__tests__/useMutation.test.tsx +++ b/packages/solid-query/src/__tests__/useMutation.test.tsx @@ -472,15 +472,15 @@ describe('useMutation', () => { expect(onSuccessMock).toHaveBeenCalledTimes(3) - expect(onSuccessMock).toHaveBeenCalledWith(1) - expect(onSuccessMock).toHaveBeenCalledWith(2) - expect(onSuccessMock).toHaveBeenCalledWith(3) + expect(onSuccessMock).toHaveBeenNthCalledWith(1, 1) + expect(onSuccessMock).toHaveBeenNthCalledWith(2, 2) + expect(onSuccessMock).toHaveBeenNthCalledWith(3, 3) expect(onSettledMock).toHaveBeenCalledTimes(3) - expect(onSettledMock).toHaveBeenCalledWith(1) - expect(onSettledMock).toHaveBeenCalledWith(2) - expect(onSettledMock).toHaveBeenCalledWith(3) + expect(onSettledMock).toHaveBeenNthCalledWith(1, 1) + expect(onSettledMock).toHaveBeenNthCalledWith(2, 2) + expect(onSettledMock).toHaveBeenNthCalledWith(3, 3) }) it('should set correct values for `failureReason` and `failureCount` on multiple mutate calls', async () => { @@ -589,24 +589,30 @@ describe('useMutation', () => { expect(rendered.getByRole('heading').textContent).toBe('3') expect(onErrorMock).toHaveBeenCalledTimes(3) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 1, 'Expected mock error. All is well! 1', ) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 2, 'Expected mock error. All is well! 2', ) - expect(onErrorMock).toHaveBeenCalledWith( + expect(onErrorMock).toHaveBeenNthCalledWith( + 3, 'Expected mock error. All is well! 3', ) expect(onSettledMock).toHaveBeenCalledTimes(3) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 1, 'Expected mock error. All is well! 1', ) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 2, 'Expected mock error. All is well! 2', ) - expect(onSettledMock).toHaveBeenCalledWith( + expect(onSettledMock).toHaveBeenNthCalledWith( + 3, 'Expected mock error. All is well! 3', ) }) From aa1f9d7bf1c1d7d229ddb45ddbd897d373f5b2e5 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 12 Jul 2026 12:09:38 +0900 Subject: [PATCH 53/97] test({vue,angular}-query): pin the reactive refetch call with 'toHaveBeenNthCalledWith' (#11051) --- .../src/__tests__/inject-query.test.ts | 8 +++++--- packages/vue-query/src/__tests__/useQuery.test.ts | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/angular-query-experimental/src/__tests__/inject-query.test.ts b/packages/angular-query-experimental/src/__tests__/inject-query.test.ts index fb7fd80a7b7..1e7b81ba971 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-query.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-query.test.ts @@ -436,7 +436,7 @@ describe('injectQuery', () => { expect(spy).toHaveBeenCalledTimes(2) // should call queryFn with context containing the new queryKey - expect(spy).toHaveBeenCalledWith({ + expect(spy).toHaveBeenNthCalledWith(2, { client: queryClient, meta: undefined, queryKey: key2, @@ -528,7 +528,8 @@ describe('injectQuery', () => { void query.refetch().then(() => { expect(fetchFn).toHaveBeenCalledTimes(1) - expect(fetchFn).toHaveBeenCalledWith( + expect(fetchFn).toHaveBeenNthCalledWith( + 1, expect.objectContaining({ queryKey: [...key, 'key11'], }), @@ -541,7 +542,8 @@ describe('injectQuery', () => { void query.refetch().then(() => { expect(fetchFn).toHaveBeenCalledTimes(2) - expect(fetchFn).toHaveBeenCalledWith( + expect(fetchFn).toHaveBeenNthCalledWith( + 2, expect.objectContaining({ queryKey: [...key, 'key12'], }), diff --git a/packages/vue-query/src/__tests__/useQuery.test.ts b/packages/vue-query/src/__tests__/useQuery.test.ts index d794c97c2b1..698605e872d 100644 --- a/packages/vue-query/src/__tests__/useQuery.test.ts +++ b/packages/vue-query/src/__tests__/useQuery.test.ts @@ -332,7 +332,8 @@ describe('useQuery', () => { expect(fetchFn).not.toHaveBeenCalled() await query.refetch() expect(fetchFn).toHaveBeenCalledTimes(1) - expect(fetchFn).toHaveBeenCalledWith( + expect(fetchFn).toHaveBeenNthCalledWith( + 1, expect.objectContaining({ queryKey: [...key, 'key11'], }), @@ -341,7 +342,8 @@ describe('useQuery', () => { keyRef.value = 'key12' await query.refetch() expect(fetchFn).toHaveBeenCalledTimes(2) - expect(fetchFn).toHaveBeenCalledWith( + expect(fetchFn).toHaveBeenNthCalledWith( + 2, expect.objectContaining({ queryKey: [...key, 'key12'], }), From 8773a1501fe0c964f62460a69f4d6646d4f0ed62 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 12 Jul 2026 12:28:02 +0900 Subject: [PATCH 54/97] test(query-devtools/PiPContext): assert exact spy arguments instead of 'objectContaining'/'stringContaining' (#11052) --- .../src/__tests__/contexts/PiPContext.test.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/query-devtools/src/__tests__/contexts/PiPContext.test.tsx b/packages/query-devtools/src/__tests__/contexts/PiPContext.test.tsx index 17a53b5bf35..c277169b0ff 100644 --- a/packages/query-devtools/src/__tests__/contexts/PiPContext.test.tsx +++ b/packages/query-devtools/src/__tests__/contexts/PiPContext.test.tsx @@ -367,7 +367,7 @@ describe('PiPContext', () => { }) expect(consoleError).toHaveBeenCalledWith( - expect.stringContaining('Failed to open popup'), + 'Failed to open popup. Please allow popups for this site to view the devtools in picture-in-picture mode.', ) expect(localStorage.getItem('TanstackQueryDevtools.pip_open')).toBe( 'false', @@ -428,10 +428,11 @@ describe('PiPContext', () => { disabled: true, }) - expect(observeSpy).toHaveBeenCalledWith( - gooberStyle, - expect.objectContaining({ childList: true, subtree: true }), - ) + expect(observeSpy).toHaveBeenCalledWith(gooberStyle, { + childList: true, + subtree: true, + characterDataOldValue: true, + }) } finally { gooberStyle.remove() } From b2ce5bcecb367363e58cc814cc035ea572f09acb Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 12 Jul 2026 13:26:02 +0900 Subject: [PATCH 55/97] test(query-core): assert exact cache event payloads in subscribe callbacks (#11053) test(query-core): assert exact cache event arguments in subscribe callbacks --- .../query-core/src/__tests__/mutationCache.test.tsx | 4 +--- packages/query-core/src/__tests__/query.test.tsx | 7 ++----- packages/query-core/src/__tests__/queryCache.test.tsx | 10 ++++++---- packages/query-core/src/__tests__/queryClient.test.tsx | 10 +++++++++- .../query-core/src/__tests__/queryObserver.test.tsx | 9 ++++++--- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/packages/query-core/src/__tests__/mutationCache.test.tsx b/packages/query-core/src/__tests__/mutationCache.test.tsx index 05d4e581dfa..be46802a8e2 100644 --- a/packages/query-core/src/__tests__/mutationCache.test.tsx +++ b/packages/query-core/src/__tests__/mutationCache.test.tsx @@ -503,9 +503,7 @@ describe('mutationCache', () => { expect(testCache.getAll()).toHaveLength(0) expect(callback).toHaveBeenCalledTimes(1) - expect(callback).toHaveBeenCalledWith( - expect.objectContaining({ type: 'removed', mutation }), - ) + expect(callback).toHaveBeenCalledWith({ type: 'removed', mutation }) unsubscribe() }) diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index 00caf5704ee..ac4c10ea5b0 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -966,13 +966,10 @@ describe('query', () => { const unsubscribe = queryClient.getQueryCache().subscribe(fn) queryClient.setQueryData(key, 'data') + const query = queryClient.getQueryCache().find({ queryKey: key }) await vi.advanceTimersByTimeAsync(10) - expect(fn).toHaveBeenCalledWith( - expect.objectContaining({ - type: 'removed', - }), - ) + expect(fn).toHaveBeenLastCalledWith({ type: 'removed', query }) expect(queryClient.getQueryCache().findAll()).toHaveLength(0) diff --git a/packages/query-core/src/__tests__/queryCache.test.tsx b/packages/query-core/src/__tests__/queryCache.test.tsx index c404c1f942b..f381bcbccf1 100644 --- a/packages/query-core/src/__tests__/queryCache.test.tsx +++ b/packages/query-core/src/__tests__/queryCache.test.tsx @@ -24,7 +24,7 @@ describe('queryCache', () => { const unsubscribe = queryCache.subscribe(subscriber) queryClient.setQueryData(key, 'foo') const query = queryCache.find({ queryKey: key }) - expect(subscriber).toHaveBeenCalledWith({ query, type: 'added' }) + expect(subscriber).toHaveBeenNthCalledWith(1, { query, type: 'added' }) unsubscribe() }) @@ -37,7 +37,8 @@ describe('queryCache', () => { queryFn: () => sleep(100).then(() => 'data'), }) await vi.advanceTimersByTimeAsync(100) - expect(callback).toHaveBeenCalled() + const query = queryCache.find({ queryKey: key }) + expect(callback).toHaveBeenNthCalledWith(1, { query, type: 'added' }) }) it('should notify query cache when a query becomes stale', async () => { @@ -89,7 +90,7 @@ describe('queryCache', () => { }) await vi.advanceTimersByTimeAsync(100) const query = queryCache.find({ queryKey: key }) - expect(callback).toHaveBeenCalledWith({ query, type: 'added' }) + expect(callback).toHaveBeenNthCalledWith(1, { query, type: 'added' }) }) it('should notify subscribers when new query with initialData is added', async () => { @@ -102,7 +103,8 @@ describe('queryCache', () => { initialData: 'initial', }) await vi.advanceTimersByTimeAsync(100) - expect(callback).toHaveBeenCalled() + const query = queryCache.find({ queryKey: key }) + expect(callback).toHaveBeenNthCalledWith(1, { query, type: 'added' }) }) it('should be able to limit cache size', async () => { diff --git a/packages/query-core/src/__tests__/queryClient.test.tsx b/packages/query-core/src/__tests__/queryClient.test.tsx index a8db8d10c76..2ed4c4c193a 100644 --- a/packages/query-core/src/__tests__/queryClient.test.tsx +++ b/packages/query-core/src/__tests__/queryClient.test.tsx @@ -1614,7 +1614,15 @@ describe('queryClient', () => { queryClient.resetQueries({ queryKey: key }) - expect(callback).toHaveBeenCalled() + const query = queryCache.find({ queryKey: key }) + expect(callback).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + type: 'updated', + query, + action: expect.objectContaining({ type: 'setState' }), + }), + ) }) it('should reset query', async () => { diff --git a/packages/query-core/src/__tests__/queryObserver.test.tsx b/packages/query-core/src/__tests__/queryObserver.test.tsx index 79dc3a8e588..9ffcb3ba51b 100644 --- a/packages/query-core/src/__tests__/queryObserver.test.tsx +++ b/packages/query-core/src/__tests__/queryObserver.test.tsx @@ -1240,10 +1240,13 @@ describe('queryObserver', () => { const unsubscribe = queryClient.getQueryCache().subscribe(spy) observer.setOptions({ queryKey: key, enabled: false, refetchInterval: 10 }) + const query = queryClient.getQueryCache().find({ queryKey: key }) expect(spy).toHaveBeenCalledTimes(1) - expect(spy).toHaveBeenCalledWith( - expect.objectContaining({ type: 'observerOptionsUpdated' }), - ) + expect(spy).toHaveBeenCalledWith({ + type: 'observerOptionsUpdated', + query, + observer, + }) unsubscribe() }) From fb8f4745d7927fa787b3a5245404ea560e38df4c Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 13 Jul 2026 01:56:30 +0900 Subject: [PATCH 56/97] test(vue-query/{usePrefetchQuery,usePrefetchInfiniteQuery}): assert exact prefetch options instead of 'objectContaining' (#11056) --- .../usePrefetchInfiniteQuery.test.ts | 63 ++++++++++--------- .../src/__tests__/usePrefetchQuery.test.ts | 28 ++++----- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/packages/vue-query/src/__tests__/usePrefetchInfiniteQuery.test.ts b/packages/vue-query/src/__tests__/usePrefetchInfiniteQuery.test.ts index 477abc148be..2456fa9e62e 100644 --- a/packages/vue-query/src/__tests__/usePrefetchInfiniteQuery.test.ts +++ b/packages/vue-query/src/__tests__/usePrefetchInfiniteQuery.test.ts @@ -19,9 +19,9 @@ describe('usePrefetchInfiniteQuery', () => { queryClient, 'prefetchInfiniteQuery', ) - const queryFn = vi.fn(() => - Promise.resolve({ data: 'prefetched', currentPage: 1 }), - ) + const queryFn = () => + Promise.resolve({ data: 'prefetched', currentPage: 1 }) + const getNextPageParam = () => undefined const key = queryKey() @@ -30,7 +30,7 @@ describe('usePrefetchInfiniteQuery', () => { queryKey: key, queryFn, initialPageParam: 1, - getNextPageParam: () => undefined, + getNextPageParam, }, queryClient, ) @@ -40,7 +40,7 @@ describe('usePrefetchInfiniteQuery', () => { queryKey: key, queryFn, initialPageParam: 1, - getNextPageParam: expect.any(Function), + getNextPageParam, }) }) @@ -50,9 +50,8 @@ describe('usePrefetchInfiniteQuery', () => { queryClient, 'prefetchInfiniteQuery', ) - const queryFn = vi.fn(() => - Promise.resolve({ data: 'prefetched', currentPage: 1 }), - ) + const queryFn = () => + Promise.resolve({ data: 'prefetched', currentPage: 1 }) const key = queryKey() queryClient.setQueryData(key, { @@ -81,22 +80,26 @@ describe('usePrefetchInfiniteQuery', () => { ) const nestedRef = ref('value') const key = queryKey() + const queryFn = () => + Promise.resolve({ data: 'prefetched', currentPage: 1 }) + const getNextPageParam = () => undefined usePrefetchInfiniteQuery( { queryKey: [...key, nestedRef], - queryFn: () => Promise.resolve({ data: 'prefetched', currentPage: 1 }), + queryFn, initialPageParam: 1, - getNextPageParam: () => undefined, + getNextPageParam, }, queryClient, ) - expect(prefetchInfiniteQuerySpy).toHaveBeenCalledWith( - expect.objectContaining({ - queryKey: [...key, 'value'], - }), - ) + expect(prefetchInfiniteQuerySpy).toHaveBeenCalledWith({ + queryKey: [...key, 'value'], + queryFn, + initialPageParam: 1, + getNextPageParam, + }) }) it('should prefetch infinite query again when query key changes reactively', async () => { @@ -107,33 +110,37 @@ describe('usePrefetchInfiniteQuery', () => { ) const keyRef = ref('first') const key = queryKey() + const queryFn = () => + Promise.resolve({ data: keyRef.value, currentPage: 1 }) + const getNextPageParam = () => undefined usePrefetchInfiniteQuery( () => ({ queryKey: [...key, keyRef.value], - queryFn: () => Promise.resolve({ data: keyRef.value, currentPage: 1 }), + queryFn, initialPageParam: 1, - getNextPageParam: () => undefined, + getNextPageParam, }), queryClient, ) - expect(prefetchInfiniteQuerySpy).toHaveBeenCalledTimes(1) - expect(prefetchInfiniteQuerySpy).toHaveBeenLastCalledWith( - expect.objectContaining({ - queryKey: [...key, 'first'], - }), - ) + expect(prefetchInfiniteQuerySpy).toHaveBeenNthCalledWith(1, { + queryKey: [...key, 'first'], + queryFn, + initialPageParam: 1, + getNextPageParam, + }) keyRef.value = 'second' await nextTick() expect(prefetchInfiniteQuerySpy).toHaveBeenCalledTimes(2) - expect(prefetchInfiniteQuerySpy).toHaveBeenLastCalledWith( - expect.objectContaining({ - queryKey: [...key, 'second'], - }), - ) + expect(prefetchInfiniteQuerySpy).toHaveBeenNthCalledWith(2, { + queryKey: [...key, 'second'], + queryFn, + initialPageParam: 1, + getNextPageParam, + }) }) it('should warn when used outside of setup function in development mode', () => { diff --git a/packages/vue-query/src/__tests__/usePrefetchQuery.test.ts b/packages/vue-query/src/__tests__/usePrefetchQuery.test.ts index 88b31026289..4cfcf832c4f 100644 --- a/packages/vue-query/src/__tests__/usePrefetchQuery.test.ts +++ b/packages/vue-query/src/__tests__/usePrefetchQuery.test.ts @@ -16,7 +16,7 @@ describe('usePrefetchQuery', () => { it('should prefetch query if query state does not exist', () => { const queryClient = new QueryClient() const prefetchQuerySpy = vi.spyOn(queryClient, 'prefetchQuery') - const queryFn = vi.fn(() => Promise.resolve('prefetched')) + const queryFn = () => Promise.resolve('prefetched') const key = queryKey() usePrefetchQuery( @@ -37,7 +37,7 @@ describe('usePrefetchQuery', () => { it('should not prefetch query if query state exists', () => { const queryClient = new QueryClient() const prefetchQuerySpy = vi.spyOn(queryClient, 'prefetchQuery') - const queryFn = vi.fn(() => Promise.resolve('prefetched')) + const queryFn = () => Promise.resolve('prefetched') const key = queryKey() queryClient.setQueryData(key, 'existing') @@ -57,20 +57,20 @@ describe('usePrefetchQuery', () => { const prefetchQuerySpy = vi.spyOn(queryClient, 'prefetchQuery') const nestedRef = ref('value') const key = queryKey() + const queryFn = () => Promise.resolve('prefetched') usePrefetchQuery( { queryKey: [...key, nestedRef], - queryFn: () => Promise.resolve('prefetched'), + queryFn, }, queryClient, ) - expect(prefetchQuerySpy).toHaveBeenCalledWith( - expect.objectContaining({ - queryKey: [...key, 'value'], - }), - ) + expect(prefetchQuerySpy).toHaveBeenCalledWith({ + queryKey: [...key, 'value'], + queryFn, + }) }) it('should prefetch again when query key changes reactively', async () => { @@ -78,28 +78,28 @@ describe('usePrefetchQuery', () => { const prefetchQuerySpy = vi.spyOn(queryClient, 'prefetchQuery') const keyRef = ref('first') const key = queryKey() + const queryFn = () => Promise.resolve(keyRef.value) usePrefetchQuery( () => ({ queryKey: [...key, keyRef.value], - queryFn: () => Promise.resolve(keyRef.value), + queryFn, }), queryClient, ) - expect(prefetchQuerySpy).toHaveBeenCalledTimes(1) - expect(prefetchQuerySpy).toHaveBeenLastCalledWith({ + expect(prefetchQuerySpy).toHaveBeenNthCalledWith(1, { queryKey: [...key, 'first'], - queryFn: expect.any(Function), + queryFn, }) keyRef.value = 'second' await nextTick() expect(prefetchQuerySpy).toHaveBeenCalledTimes(2) - expect(prefetchQuerySpy).toHaveBeenLastCalledWith({ + expect(prefetchQuerySpy).toHaveBeenNthCalledWith(2, { queryKey: [...key, 'second'], - queryFn: expect.any(Function), + queryFn, }) }) From 045c947f2a45241af21f0d8c7314a00e0004adc2 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 13 Jul 2026 02:27:36 +0900 Subject: [PATCH 57/97] test(*): assert exact values instead of loose matchers (#11057) --- packages/lit-query/src/tests/infinite-and-options.test.ts | 2 +- packages/lit-query/src/tests/mutation-controller.test.ts | 6 +++--- packages/query-core/src/__tests__/timeoutManager.test.tsx | 2 +- packages/query-devtools/src/__tests__/Explorer.test.tsx | 2 +- packages/vue-query/src/__tests__/useQueryClient.test.ts | 8 ++++++-- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/lit-query/src/tests/infinite-and-options.test.ts b/packages/lit-query/src/tests/infinite-and-options.test.ts index 6ef06b6cdc1..701ea5e34c4 100644 --- a/packages/lit-query/src/tests/infinite-and-options.test.ts +++ b/packages/lit-query/src/tests/infinite-and-options.test.ts @@ -364,7 +364,7 @@ describe('createInfiniteQueryController', () => { const nextPageResult = await infinite.fetchNextPage() expect(nextPageResult.isFetchNextPageError).toBe(true) - expect(nextPageResult.error).toBeInstanceOf(Error) + expect(nextPageResult.error).toEqual(new Error('next-page-failed')) await waitFor(() => infinite().isFetchNextPageError) expect(infinite().data?.pages).toEqual([0]) }) diff --git a/packages/lit-query/src/tests/mutation-controller.test.ts b/packages/lit-query/src/tests/mutation-controller.test.ts index e205ac05018..58ad85a5bf1 100644 --- a/packages/lit-query/src/tests/mutation-controller.test.ts +++ b/packages/lit-query/src/tests/mutation-controller.test.ts @@ -164,7 +164,7 @@ describe('createMutationController', () => { await waitFor(() => mutation().isPending) await expect(errorPromise).rejects.toThrow('negative-not-allowed') await waitFor(() => mutation().isError) - expect(mutation().error).toBeInstanceOf(Error) + expect(mutation().error).toEqual(new Error('negative-not-allowed')) }) it('M10: reset clears mutation state back to idle baseline', async () => { @@ -188,7 +188,7 @@ describe('createMutationController', () => { 'reset-target', ) await waitFor(() => mutation().isError) - expect(mutation().error).toBeInstanceOf(Error) + expect(mutation().error).toEqual(new Error('reset-target')) mutation.reset() expect(mutation().isIdle).toBe(true) @@ -221,7 +221,7 @@ describe('createMutationController', () => { expect(() => mutation.mutate(-1)).not.toThrow() await waitFor(() => mutation().isError) - expect(mutation().error).toBeInstanceOf(Error) + expect(mutation().error).toEqual(new Error('negative-not-allowed')) await expect(mutation.mutateAsync(-1)).rejects.toThrow( 'negative-not-allowed', diff --git a/packages/query-core/src/__tests__/timeoutManager.test.tsx b/packages/query-core/src/__tests__/timeoutManager.test.tsx index 79ea130db85..d40101555ee 100644 --- a/packages/query-core/src/__tests__/timeoutManager.test.tsx +++ b/packages/query-core/src/__tests__/timeoutManager.test.tsx @@ -93,7 +93,7 @@ describe('timeoutManager', () => { expect.stringMatching( /\[timeoutManager\]: Switching .* might result in unexpected behavior\..*/, ), - expect.anything(), + { previous: customProvider, provider: customProvider2 }, ) // 3. Switching again with no intermediate calls should not warn diff --git a/packages/query-devtools/src/__tests__/Explorer.test.tsx b/packages/query-devtools/src/__tests__/Explorer.test.tsx index 2ffc7cd1d93..5f2c1deab49 100644 --- a/packages/query-devtools/src/__tests__/Explorer.test.tsx +++ b/packages/query-devtools/src/__tests__/Explorer.test.tsx @@ -232,7 +232,7 @@ describe('Explorer', () => { ).toBeInTheDocument() expect(consoleError).toHaveBeenCalledWith( 'Failed to copy: ', - expect.any(Error), + new Error('denied'), ) }) diff --git a/packages/vue-query/src/__tests__/useQueryClient.test.ts b/packages/vue-query/src/__tests__/useQueryClient.test.ts index 8811089184d..a3d2c1a9d23 100644 --- a/packages/vue-query/src/__tests__/useQueryClient.test.ts +++ b/packages/vue-query/src/__tests__/useQueryClient.test.ts @@ -34,7 +34,9 @@ describe('useQueryClient', () => { it('should throw an error when queryClient does not exist in the context', () => { injectSpy.mockReturnValueOnce(undefined) - expect(useQueryClient).toThrow() + expect(useQueryClient).toThrow( + "No 'queryClient' found in Vue context, use 'VueQueryPlugin' to properly initialize the library.", + ) expect(injectSpy).toHaveBeenCalledTimes(1) expect(injectSpy).toHaveBeenCalledWith(VUE_QUERY_CLIENT) }) @@ -42,7 +44,9 @@ describe('useQueryClient', () => { it('should throw an error when used outside of setup function', () => { hasInjectionContextSpy.mockReturnValueOnce(false) - expect(useQueryClient).toThrow() + expect(useQueryClient).toThrow( + 'vue-query hooks can only be used inside setup() function or functions that support injection context.', + ) expect(hasInjectionContextSpy).toHaveBeenCalledTimes(1) }) From f6cf12002abacbb6c3515cd32de0f4baa4919ced Mon Sep 17 00:00:00 2001 From: Samuel Wai Weng Yong Date: Mon, 13 Jul 2026 03:28:00 +0900 Subject: [PATCH 58/97] docs({react,solid}-query): add missing 'errorUpdateCount' to 'useQuery' return signature (#11041) * docs(react-query): add missing errorUpdateCount to useQuery return signature * docs(react-query): move errorUpdateCount after errorUpdatedAt * docs(react-query): keep 'errorUpdateCount' before 'errorUpdatedAt' to preserve alphabetical order --------- Co-authored-by: Wonsuk Choi --- docs/framework/react/reference/useQuery.md | 1 + docs/framework/solid/reference/useQuery.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/framework/react/reference/useQuery.md b/docs/framework/react/reference/useQuery.md index b02775a62cf..569e19cb8f4 100644 --- a/docs/framework/react/reference/useQuery.md +++ b/docs/framework/react/reference/useQuery.md @@ -8,6 +8,7 @@ const { data, dataUpdatedAt, error, + errorUpdateCount, errorUpdatedAt, failureCount, failureReason, diff --git a/docs/framework/solid/reference/useQuery.md b/docs/framework/solid/reference/useQuery.md index 876c5c99729..aaca4469971 100644 --- a/docs/framework/solid/reference/useQuery.md +++ b/docs/framework/solid/reference/useQuery.md @@ -8,6 +8,7 @@ const { data, dataUpdatedAt, error, + errorUpdateCount, errorUpdatedAt, failureCount, failureReason, From 79d2384db5c8776680d5bfbe9b595618c066248b Mon Sep 17 00:00:00 2001 From: max <87073104+maxtaran2010@users.noreply.github.com> Date: Mon, 13 Jul 2026 08:06:03 +0300 Subject: [PATCH 59/97] docs(*): fix 'homogenous', 'stoage', 'supressed', 'compoennts' spelling typos (#11040) * fix: correct spelling typos across docs, examples, and source comments - homogenous -> homogeneous in 7 useQueries/createQueries source files - stoage -> storage in react and vue createPersister docs - supressed -> suppressed in react and angular pagination examples - compoennts -> components in solid-start-streaming example Co-Authored-By: Claude Sonnet 4.6 * docs(react-query/useSuspenseQueries): correct 'homogenous' typo to 'homogeneous' in comment --------- Co-authored-by: maxtaran2010 Co-authored-by: Claude Sonnet 4.6 Co-authored-by: Wonsuk Choi --- docs/framework/react/plugins/createPersister.md | 2 +- docs/framework/vue/plugins/createPersister.md | 2 +- .../pagination/src/app/components/example.component.html | 2 +- examples/react/pagination/src/pages/index.tsx | 2 +- examples/solid/solid-start-streaming/src/routes/with-error.tsx | 2 +- packages/angular-query-experimental/src/inject-queries.ts | 2 +- packages/preact-query/src/useQueries.ts | 2 +- packages/preact-query/src/useSuspenseQueries.ts | 2 +- packages/react-query/src/useQueries.ts | 2 +- packages/react-query/src/useSuspenseQueries.ts | 2 +- packages/solid-query/src/useQueries.ts | 2 +- packages/svelte-query/src/createQueries.svelte.ts | 2 +- packages/vue-query/src/useQueries.ts | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/framework/react/plugins/createPersister.md b/docs/framework/react/plugins/createPersister.md index 0b59b216ce1..e98b4377064 100644 --- a/docs/framework/react/plugins/createPersister.md +++ b/docs/framework/react/plugins/createPersister.md @@ -106,7 +106,7 @@ If `query` is `expired`, `busted` or `malformed` it would be removed from the st ### `persisterGc(): Promise` -This function can be used to sporadically clean up stoage from `expired`, `busted` or `malformed` entries. +This function can be used to sporadically clean up storage from `expired`, `busted` or `malformed` entries. For this function to work, your storage must expose `entries` method that would return a `key-value tuple array`. For example `Object.entries(localStorage)` for `localStorage` or `entries` from `idb-keyval`. diff --git a/docs/framework/vue/plugins/createPersister.md b/docs/framework/vue/plugins/createPersister.md index 49e1f669ba8..abb9d4db33d 100644 --- a/docs/framework/vue/plugins/createPersister.md +++ b/docs/framework/vue/plugins/createPersister.md @@ -103,7 +103,7 @@ If `query` is `expired`, `busted` or `malformed` it would be removed from the st ### `persisterGc(): Promise` -This function can be used to sporadically clean up stoage from `expired`, `busted` or `malformed` entries. +This function can be used to sporadically clean up storage from `expired`, `busted` or `malformed` entries. For this function to work, your storage must expose `entries` method that would return a `key-value tuple array`. For example `Object.entries(localStorage)` for `localStorage` or `entries` from `idb-keyval`. diff --git a/examples/angular/pagination/src/app/components/example.component.html b/examples/angular/pagination/src/app/components/example.component.html index b6ffc8c1289..e45484a8922 100644 --- a/examples/angular/pagination/src/app/components/example.component.html +++ b/examples/angular/pagination/src/app/components/example.component.html @@ -2,7 +2,7 @@

In this example, each page of data remains visible as the next page is fetched. The buttons and capability to proceed to the next page are also - supressed until the next page cursor is known. Each page is cached as a + suppressed until the next page cursor is known. Each page is cached as a normal query too, so when going to previous pages, you'll see them instantaneously while they are also refetched invisibly in the background.

diff --git a/examples/react/pagination/src/pages/index.tsx b/examples/react/pagination/src/pages/index.tsx index 64eec265f0c..dee4d49af67 100644 --- a/examples/react/pagination/src/pages/index.tsx +++ b/examples/react/pagination/src/pages/index.tsx @@ -54,7 +54,7 @@ function Example() {

In this example, each page of data remains visible as the next page is fetched. The buttons and capability to proceed to the next page are also - supressed until the next page cursor is known. Each page is cached as a + suppressed until the next page cursor is known. Each page is cached as a normal query too, so when going to previous pages, you'll see them instantaneously while they are also refetched invisibly in the background. diff --git a/examples/solid/solid-start-streaming/src/routes/with-error.tsx b/examples/solid/solid-start-streaming/src/routes/with-error.tsx index e437d9444b5..5de6ca7046e 100644 --- a/examples/solid/solid-start-streaming/src/routes/with-error.tsx +++ b/examples/solid/solid-start-streaming/src/routes/with-error.tsx @@ -13,7 +13,7 @@ export default function Streamed() {

For more control over error handling, try leveraging the `Switch` component and watching the reactive `query.isError` property. See - `compoennts/query-boundary.tsx` for one possible approach. + `components/query-boundary.tsx` for one possible approach.

diff --git a/packages/angular-query-experimental/src/inject-queries.ts b/packages/angular-query-experimental/src/inject-queries.ts index 2f201799e74..d61a937a3c2 100644 --- a/packages/angular-query-experimental/src/inject-queries.ts +++ b/packages/angular-query-experimental/src/inject-queries.ts @@ -159,7 +159,7 @@ export type QueriesOptions< > : ReadonlyArray extends T ? T - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! + : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogeneous type! // use this to infer the param types in the case of Array.map() argument T extends Array< QueryObserverOptionsForCreateQueries< diff --git a/packages/preact-query/src/useQueries.ts b/packages/preact-query/src/useQueries.ts index be57d2aebd6..7e30658b843 100644 --- a/packages/preact-query/src/useQueries.ts +++ b/packages/preact-query/src/useQueries.ts @@ -162,7 +162,7 @@ export type QueriesOptions< > : ReadonlyArray extends T ? T - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! + : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogeneous type! // use this to infer the param types in the case of Array.map() argument T extends Array< UseQueryOptionsForUseQueries< diff --git a/packages/preact-query/src/useSuspenseQueries.ts b/packages/preact-query/src/useSuspenseQueries.ts index 017c34328c2..191c25458c3 100644 --- a/packages/preact-query/src/useSuspenseQueries.ts +++ b/packages/preact-query/src/useSuspenseQueries.ts @@ -125,7 +125,7 @@ export type SuspenseQueriesOptions< > : Array extends T ? T - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! + : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogeneous type! // use this to infer the param types in the case of Array.map() argument T extends Array< UseSuspenseQueryOptions< diff --git a/packages/react-query/src/useQueries.ts b/packages/react-query/src/useQueries.ts index de179837a5f..5f5261a870e 100644 --- a/packages/react-query/src/useQueries.ts +++ b/packages/react-query/src/useQueries.ts @@ -162,7 +162,7 @@ export type QueriesOptions< > : ReadonlyArray extends T ? T - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! + : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogeneous type! // use this to infer the param types in the case of Array.map() argument T extends Array< UseQueryOptionsForUseQueries< diff --git a/packages/react-query/src/useSuspenseQueries.ts b/packages/react-query/src/useSuspenseQueries.ts index f014095d01c..aa10abfb3d1 100644 --- a/packages/react-query/src/useSuspenseQueries.ts +++ b/packages/react-query/src/useSuspenseQueries.ts @@ -125,7 +125,7 @@ export type SuspenseQueriesOptions< > : Array extends T ? T - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! + : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogeneous type! // use this to infer the param types in the case of Array.map() argument T extends Array< UseSuspenseQueryOptions< diff --git a/packages/solid-query/src/useQueries.ts b/packages/solid-query/src/useQueries.ts index bf0a17cd6ad..51a2666982f 100644 --- a/packages/solid-query/src/useQueries.ts +++ b/packages/solid-query/src/useQueries.ts @@ -142,7 +142,7 @@ type QueriesOptions< > : ReadonlyArray extends T ? T - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! + : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogeneous type! // use this to infer the param types in the case of Array.map() argument T extends Array< UseQueryOptionsForUseQueries< diff --git a/packages/svelte-query/src/createQueries.svelte.ts b/packages/svelte-query/src/createQueries.svelte.ts index dec57561299..7f46ddf33ab 100644 --- a/packages/svelte-query/src/createQueries.svelte.ts +++ b/packages/svelte-query/src/createQueries.svelte.ts @@ -144,7 +144,7 @@ export type QueriesOptions< > : ReadonlyArray extends T ? T - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! + : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogeneous type! // use this to infer the param types in the case of Array.map() argument T extends Array< CreateQueryOptionsForCreateQueries< diff --git a/packages/vue-query/src/useQueries.ts b/packages/vue-query/src/useQueries.ts index f290976a145..43066a54846 100644 --- a/packages/vue-query/src/useQueries.ts +++ b/packages/vue-query/src/useQueries.ts @@ -185,7 +185,7 @@ export type UseQueriesOptions< > : ReadonlyArray extends T ? T - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! + : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogeneous type! // use this to infer the param types in the case of Array.map() argument T extends Array< UseQueryOptionsForUseQueries< From 1d972e78d45328dd7b019a21e81ea517a87cfbeb Mon Sep 17 00:00:00 2001 From: Kobi Hikri Date: Thu, 16 Jul 2026 03:35:35 +0300 Subject: [PATCH 60/97] docs(CONTRIBUTING): update pnpm version from 'v10' to 'v11' (#11066) docs: CONTRIBUTING says pnpm v10 but the repo uses pnpm v11 --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 46ed81cdf2b..931a591f383 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,7 +25,7 @@ If you have been assigned to fix an issue or develop a new feature, please follo pnpm install ``` - - We use [pnpm](https://pnpm.io/) v10 for package management (run in case of pnpm-related issues). + - We use [pnpm](https://pnpm.io/) v11 for package management (run in case of pnpm-related issues). ```bash corepack enable && corepack prepare From a9aa23f823e3132d64d10fd603bb5358a6d8ce76 Mon Sep 17 00:00:00 2001 From: whizzkid1452 Date: Fri, 17 Jul 2026 12:35:51 +0900 Subject: [PATCH 61/97] test(query-core/utils): add tests for 'undefined' key properties and 'isValidTimeout' validation (#11013) * test(query-core): cover query key undefined and timeout validation Clarify isValidTimeout with Number.isFinite, add regression tests for undefined query-key object properties, and fix TanStack branding in community resources. * Update docs/community-resources.md * Update packages/query-core/src/utils.ts --------- Co-authored-by: HURRAEY Co-authored-by: Wonsuk Choi --- .../query-core/src/__tests__/utils.test.tsx | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/packages/query-core/src/__tests__/utils.test.tsx b/packages/query-core/src/__tests__/utils.test.tsx index 7e72376b35c..da1b69bf468 100644 --- a/packages/query-core/src/__tests__/utils.test.tsx +++ b/packages/query-core/src/__tests__/utils.test.tsx @@ -10,6 +10,7 @@ import { hashQueryKeyByOptions, isPlainArray, isPlainObject, + isValidTimeout, keepPreviousData, matchMutation, partialMatchKey, @@ -166,6 +167,18 @@ describe('core/utils', () => { const b = [{ a: null, c: 'c', d: [{ d: 'd ' }] }] expect(partialMatchKey(a, b)).toEqual(false) }) + + it('should treat undefined object properties as matching missing properties', () => { + const queryKeyWithUndefined = ['todos', { filters: undefined }] + const queryKeyWithoutProperty = ['todos', {}] + + expect( + partialMatchKey(queryKeyWithoutProperty, queryKeyWithUndefined), + ).toEqual(true) + expect( + partialMatchKey(queryKeyWithUndefined, queryKeyWithoutProperty), + ).toEqual(true) + }) }) describe('replaceEqualDeep', () => { @@ -559,6 +572,28 @@ describe('core/utils', () => { expect(hashKey(nested1)).toEqual(hashKey(nested2)) }) + + it('should hash undefined object properties the same as missing properties', () => { + const withUndefined = ['todos', { filters: undefined }] + const withoutProperty = ['todos', {}] + + expect(hashKey(withUndefined)).toEqual(hashKey(withoutProperty)) + }) + }) + + describe('isValidTimeout', () => { + it('should accept valid timeout values', () => { + expect(isValidTimeout(0)).toEqual(true) + expect(isValidTimeout(1_000)).toEqual(true) + }) + + it('should reject invalid timeout values', () => { + expect(isValidTimeout(-1)).toEqual(false) + expect(isValidTimeout(Number.NaN)).toEqual(false) + expect(isValidTimeout(Number.POSITIVE_INFINITY)).toEqual(false) + expect(isValidTimeout('1000')).toEqual(false) + expect(isValidTimeout(undefined)).toEqual(false) + }) }) describe('ensureQueryFn', () => { From 80b833ecbdb5411212ead2078236f91ca4356411 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Fri, 17 Jul 2026 12:50:37 +0900 Subject: [PATCH 62/97] test(query-core/utils): assert exact booleans with 'toBe' instead of 'toEqual' (#11070) --- .../query-core/src/__tests__/utils.test.tsx | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/query-core/src/__tests__/utils.test.tsx b/packages/query-core/src/__tests__/utils.test.tsx index da1b69bf468..5a6a576319f 100644 --- a/packages/query-core/src/__tests__/utils.test.tsx +++ b/packages/query-core/src/__tests__/utils.test.tsx @@ -47,36 +47,36 @@ describe('core/utils', () => { describe('shallowEqualObjects', () => { it('should return `true` for shallow equal objects', () => { - expect(shallowEqualObjects({ a: 1 }, { a: 1 })).toEqual(true) + expect(shallowEqualObjects({ a: 1 }, { a: 1 })).toBe(true) }) it('should return `false` for non shallow equal objects', () => { - expect(shallowEqualObjects({ a: 1 }, { a: 2 })).toEqual(false) + expect(shallowEqualObjects({ a: 1 }, { a: 2 })).toBe(false) }) it('should return `false` if lengths are not equal', () => { - expect(shallowEqualObjects({ a: 1 }, { a: 1, b: 2 })).toEqual(false) + expect(shallowEqualObjects({ a: 1 }, { a: 1, b: 2 })).toBe(false) }) it('should return false if b is undefined', () => { - expect(shallowEqualObjects({ a: 1 }, undefined)).toEqual(false) + expect(shallowEqualObjects({ a: 1 }, undefined)).toBe(false) }) }) describe('isPlainObject', () => { it('should return `true` for a plain object', () => { - expect(isPlainObject({})).toEqual(true) + expect(isPlainObject({})).toBe(true) }) it('should return `false` for an array', () => { - expect(isPlainObject([])).toEqual(false) + expect(isPlainObject([])).toBe(false) }) it('should return `false` for null', () => { - expect(isPlainObject(null)).toEqual(false) + expect(isPlainObject(null)).toBe(false) }) it('should return `false` for undefined', () => { - expect(isPlainObject(undefined)).toEqual(false) + expect(isPlainObject(undefined)).toBe(false) }) it('should return `true` for object with an undefined constructor', () => { @@ -117,11 +117,11 @@ describe('core/utils', () => { describe('isPlainArray', () => { it('should return `true` for plain arrays', () => { - expect(isPlainArray([1, 2])).toEqual(true) + expect(isPlainArray([1, 2])).toBe(true) }) it('should return `false` for non plain arrays', () => { - expect(isPlainArray(Object.assign([1, 2], { a: 'b' }))).toEqual(false) + expect(isPlainArray(Object.assign([1, 2], { a: 'b' }))).toBe(false) }) }) @@ -129,43 +129,43 @@ describe('core/utils', () => { it('should return `true` if a includes b', () => { const a = [{ a: { b: 'b' }, c: 'c', d: [{ d: 'd ' }] }] const b = [{ a: { b: 'b' }, c: 'c', d: [] }] - expect(partialMatchKey(a, b)).toEqual(true) + expect(partialMatchKey(a, b)).toBe(true) }) it('should return `false` if a does not include b', () => { const a = [{ a: { b: 'b' }, c: 'c', d: [] }] const b = [{ a: { b: 'b' }, c: 'c', d: [{ d: 'd ' }] }] - expect(partialMatchKey(a, b)).toEqual(false) + expect(partialMatchKey(a, b)).toBe(false) }) it('should return `true` if array a includes array b', () => { const a = [1, 2, 3] const b = [1, 2] - expect(partialMatchKey(a, b)).toEqual(true) + expect(partialMatchKey(a, b)).toBe(true) }) it('should return `false` if a is null and b is not', () => { const a = [null] const b = [{ a: { b: 'b' }, c: 'c', d: [{ d: 'd ' }] }] - expect(partialMatchKey(a, b)).toEqual(false) + expect(partialMatchKey(a, b)).toBe(false) }) it('should return `false` if a contains null and b is not', () => { const a = [{ a: null, c: 'c', d: [] }] const b = [{ a: { b: 'b' }, c: 'c', d: [{ d: 'd ' }] }] - expect(partialMatchKey(a, b)).toEqual(false) + expect(partialMatchKey(a, b)).toBe(false) }) it('should return `false` if b is null and a is not', () => { const a = [{ a: { b: 'b' }, c: 'c', d: [] }] const b = [null] - expect(partialMatchKey(a, b)).toEqual(false) + expect(partialMatchKey(a, b)).toBe(false) }) it('should return `false` if b contains null and a is not', () => { const a = [{ a: { b: 'b' }, c: 'c', d: [] }] const b = [{ a: null, c: 'c', d: [{ d: 'd ' }] }] - expect(partialMatchKey(a, b)).toEqual(false) + expect(partialMatchKey(a, b)).toBe(false) }) it('should treat undefined object properties as matching missing properties', () => { @@ -174,10 +174,10 @@ describe('core/utils', () => { expect( partialMatchKey(queryKeyWithoutProperty, queryKeyWithUndefined), - ).toEqual(true) + ).toBe(true) expect( partialMatchKey(queryKeyWithUndefined, queryKeyWithoutProperty), - ).toEqual(true) + ).toBe(true) }) }) @@ -583,16 +583,16 @@ describe('core/utils', () => { describe('isValidTimeout', () => { it('should accept valid timeout values', () => { - expect(isValidTimeout(0)).toEqual(true) - expect(isValidTimeout(1_000)).toEqual(true) + expect(isValidTimeout(0)).toBe(true) + expect(isValidTimeout(1_000)).toBe(true) }) it('should reject invalid timeout values', () => { - expect(isValidTimeout(-1)).toEqual(false) - expect(isValidTimeout(Number.NaN)).toEqual(false) - expect(isValidTimeout(Number.POSITIVE_INFINITY)).toEqual(false) - expect(isValidTimeout('1000')).toEqual(false) - expect(isValidTimeout(undefined)).toEqual(false) + expect(isValidTimeout(-1)).toBe(false) + expect(isValidTimeout(Number.NaN)).toBe(false) + expect(isValidTimeout(Number.POSITIVE_INFINITY)).toBe(false) + expect(isValidTimeout('1000')).toBe(false) + expect(isValidTimeout(undefined)).toBe(false) }) }) From 97db5d244715642fb63d9ce78566aa632cdfdc07 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Fri, 17 Jul 2026 13:26:43 +0900 Subject: [PATCH 63/97] test(query-core/utils): split 'isValidTimeout' rejection cases into separate 'it' blocks (#11071) --- packages/query-core/src/__tests__/utils.test.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/query-core/src/__tests__/utils.test.tsx b/packages/query-core/src/__tests__/utils.test.tsx index 5a6a576319f..c9566ddd376 100644 --- a/packages/query-core/src/__tests__/utils.test.tsx +++ b/packages/query-core/src/__tests__/utils.test.tsx @@ -587,11 +587,23 @@ describe('core/utils', () => { expect(isValidTimeout(1_000)).toBe(true) }) - it('should reject invalid timeout values', () => { + it('should reject a negative timeout value', () => { expect(isValidTimeout(-1)).toBe(false) + }) + + it('should reject NaN', () => { expect(isValidTimeout(Number.NaN)).toBe(false) + }) + + it('should reject Infinity', () => { expect(isValidTimeout(Number.POSITIVE_INFINITY)).toBe(false) + }) + + it('should reject a string timeout value', () => { expect(isValidTimeout('1000')).toBe(false) + }) + + it('should reject undefined', () => { expect(isValidTimeout(undefined)).toBe(false) }) }) From b9c657e20b1ac1078ab265de8fc691aec192e143 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 18 Jul 2026 14:47:42 +0900 Subject: [PATCH 64/97] test({react,preact}-query/usePrefetchQuery): assert the 'Loading...' fallback is rendered before the prefetch resolves (#11075) --- packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx | 2 ++ packages/react-query/src/__tests__/usePrefetchQuery.test.tsx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx index 49fd0e682e1..979509b43f5 100644 --- a/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx @@ -72,6 +72,8 @@ describe('usePrefetchQuery', () => { const rendered = renderWithClient(queryClient, ) + expect(rendered.getByText('Loading...')).toBeInTheDocument() + await vi.advanceTimersByTimeAsync(10) expect(rendered.getByText('data: prefetchQuery')).toBeInTheDocument() expect(queryOpts.queryFn).toHaveBeenCalledTimes(1) diff --git a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx index 0c6823bb730..57b4ca5b8f5 100644 --- a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx @@ -71,6 +71,8 @@ describe('usePrefetchQuery', () => { const rendered = renderWithClient(queryClient, ) + expect(rendered.getByText('Loading...')).toBeInTheDocument() + await act(() => vi.advanceTimersByTimeAsync(10)) expect(rendered.getByText('data: prefetchQuery')).toBeInTheDocument() expect(queryOpts.queryFn).toHaveBeenCalledTimes(1) From b955f60d7965cc521df6ee8b1ce91b3d0e8c046d Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 18 Jul 2026 14:47:58 +0900 Subject: [PATCH 65/97] test({react,preact}-query/useSuspenseQuery): assert the 'loading' fallback is rendered when gcTime is 0 (#11076) --- packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx | 1 + packages/react-query/src/__tests__/useSuspenseQuery.test.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx b/packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx index d09cc6b8032..8ea07b85252 100644 --- a/packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx +++ b/packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx @@ -788,6 +788,7 @@ describe('useSuspenseQuery', () => { , ) + expect(rendered.getByText('loading')).toBeInTheDocument() await vi.advanceTimersByTimeAsync(10) expect(rendered.getByText('rendered')).toBeInTheDocument() diff --git a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx index 10583797f3d..ef593b5a222 100644 --- a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx @@ -748,6 +748,7 @@ describe('useSuspenseQuery', () => { , ) + expect(rendered.getByText('loading')).toBeInTheDocument() await act(() => vi.advanceTimersByTimeAsync(10)) expect(rendered.getByText('rendered')).toBeInTheDocument() From dbd5a86e95284387bc3f172208bc52c0053a1bb2 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 18 Jul 2026 21:10:18 +0900 Subject: [PATCH 66/97] test({react,preact}-query/usePrefetchQuery): inline the shared 'Suspended' component into each test (#11077) --- .../src/__tests__/usePrefetchQuery.test.tsx | 85 ++++++++++++------ .../src/__tests__/usePrefetchQuery.test.tsx | 86 +++++++++++++------ 2 files changed, 120 insertions(+), 51 deletions(-) diff --git a/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx index 979509b43f5..d05b24a7bc3 100644 --- a/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx @@ -11,7 +11,6 @@ import { useQueryErrorResetBoundary, useSuspenseQuery, } from '..' -import type { UseSuspenseQueryOptions } from '..' import { ErrorBoundary } from './ErrorBoundary' import { renderWithClient } from './utils' @@ -35,20 +34,6 @@ describe('usePrefetchQuery', () => { vi.useRealTimers() }) - function Suspended(props: { - queryOpts: UseSuspenseQueryOptions> - children?: VNode - }) { - const state = useSuspenseQuery(props.queryOpts) - - return ( -
-
data: {String(state.data)}
- {props.children} -
- ) - } - it('should prefetch query if query state does not exist', async () => { const queryOpts = { queryKey: queryKey(), @@ -60,12 +45,17 @@ describe('usePrefetchQuery', () => { queryFn: generateQueryFn('useSuspenseQuery'), } + function Page() { + const state = useSuspenseQuery(componentQueryOpts) + return
data: {String(state.data)}
+ } + function App() { usePrefetchQuery(queryOpts) return ( - + ) } @@ -85,12 +75,17 @@ describe('usePrefetchQuery', () => { queryFn: generateQueryFn('The usePrefetchQuery hook is smart!'), } + function Page() { + const state = useSuspenseQuery(queryOpts) + return
data: {String(state.data)}
+ } + function App() { usePrefetchQuery(queryOpts) return ( - + ) } @@ -123,13 +118,18 @@ describe('usePrefetchQuery', () => { throw new Error('Oops! Server error!') }) + function Page() { + const state = useSuspenseQuery(queryOpts) + return
data: {String(state.data)}
+ } + function App() { usePrefetchQuery(queryOpts) return (
Oops!
}> - +
) @@ -160,11 +160,16 @@ describe('usePrefetchQuery', () => { return <>{children} } + function Page() { + const state = useSuspenseQuery(queryOpts) + return
data: {String(state.data)}
+ } + function App() { return ( }> - + ) @@ -192,6 +197,11 @@ describe('usePrefetchQuery', () => { throw new Error('Oops! Server error!') }) + function Page() { + const state = useSuspenseQuery(queryOpts) + return
data: {String(state.data)}
+ } + function App() { const { reset } = useQueryErrorResetBoundary() usePrefetchQuery(queryOpts) @@ -207,7 +217,7 @@ describe('usePrefetchQuery', () => { )} > - + ) @@ -247,6 +257,31 @@ describe('usePrefetchQuery', () => { const Fallback = vi.fn().mockImplementation(() =>
Loading...
) + function FirstQuery({ children }: { children?: VNode }) { + const state = useSuspenseQuery(firstQueryOpts) + return ( +
+
data: {String(state.data)}
+ {children} +
+ ) + } + + function SecondQuery({ children }: { children?: VNode }) { + const state = useSuspenseQuery(secondQueryOpts) + return ( +
+
data: {String(state.data)}
+ {children} +
+ ) + } + + function ThirdQuery() { + const state = useSuspenseQuery(thirdQueryOpts) + return
data: {String(state.data)}
+ } + function App() { usePrefetchQuery(firstQueryOpts) usePrefetchQuery(secondQueryOpts) @@ -254,11 +289,11 @@ describe('usePrefetchQuery', () => { return ( }> - - - - - + + + + + ) } diff --git a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx index 57b4ca5b8f5..bef84167b4a 100644 --- a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx @@ -12,8 +12,6 @@ import { } from '..' import { renderWithClient } from './utils' -import type { UseSuspenseQueryOptions } from '..' - const generateQueryFn = (data: string) => vi .fn<(...args: Array) => Promise>() @@ -34,20 +32,6 @@ describe('usePrefetchQuery', () => { vi.useRealTimers() }) - function Suspended(props: { - queryOpts: UseSuspenseQueryOptions> - children?: React.ReactNode - }) { - const state = useSuspenseQuery(props.queryOpts) - - return ( -
-
data: {String(state.data)}
- {props.children} -
- ) - } - it('should prefetch query if query state does not exist', async () => { const queryOpts = { queryKey: queryKey(), @@ -59,12 +43,17 @@ describe('usePrefetchQuery', () => { queryFn: generateQueryFn('useSuspenseQuery'), } + function Page() { + const state = useSuspenseQuery(componentQueryOpts) + return
data: {String(state.data)}
+ } + function App() { usePrefetchQuery(queryOpts) return ( - + ) } @@ -84,12 +73,17 @@ describe('usePrefetchQuery', () => { queryFn: generateQueryFn('The usePrefetchQuery hook is smart!'), } + function Page() { + const state = useSuspenseQuery(queryOpts) + return
data: {String(state.data)}
+ } + function App() { usePrefetchQuery(queryOpts) return ( - + ) } @@ -122,13 +116,18 @@ describe('usePrefetchQuery', () => { throw new Error('Oops! Server error!') }) + function Page() { + const state = useSuspenseQuery(queryOpts) + return
data: {String(state.data)}
+ } + function App() { usePrefetchQuery(queryOpts) return (
Oops!
}> - +
) @@ -159,11 +158,16 @@ describe('usePrefetchQuery', () => { return <>{children} } + function Page() { + const state = useSuspenseQuery(queryOpts) + return
data: {String(state.data)}
+ } + function App() { return ( - + ) @@ -191,6 +195,11 @@ describe('usePrefetchQuery', () => { throw new Error('Oops! Server error!') }) + function Page() { + const state = useSuspenseQuery(queryOpts) + return
data: {String(state.data)}
+ } + function App() { const { reset } = useQueryErrorResetBoundary() usePrefetchQuery(queryOpts) @@ -206,7 +215,7 @@ describe('usePrefetchQuery', () => { )} > - + ) @@ -246,6 +255,31 @@ describe('usePrefetchQuery', () => { const Fallback = vi.fn().mockImplementation(() =>
Loading...
) + function FirstQuery({ children }: { children?: React.ReactNode }) { + const state = useSuspenseQuery(firstQueryOpts) + return ( +
+
data: {String(state.data)}
+ {children} +
+ ) + } + + function SecondQuery({ children }: { children?: React.ReactNode }) { + const state = useSuspenseQuery(secondQueryOpts) + return ( +
+
data: {String(state.data)}
+ {children} +
+ ) + } + + function ThirdQuery() { + const state = useSuspenseQuery(thirdQueryOpts) + return
data: {String(state.data)}
+ } + function App() { usePrefetchQuery(firstQueryOpts) usePrefetchQuery(secondQueryOpts) @@ -253,11 +287,11 @@ describe('usePrefetchQuery', () => { return ( }> - - - - - + + + + + ) } From 10770f0720dacae3a26701a747e33abd6bafbf8a Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 18 Jul 2026 21:10:27 +0900 Subject: [PATCH 67/97] test({react,preact}-query/usePrefetchInfiniteQuery): inline the shared 'Suspended' component into each test (#11078) --- .../usePrefetchInfiniteQuery.test.tsx | 77 ++++++++++--------- .../usePrefetchInfiniteQuery.test.tsx | 77 ++++++++++--------- 2 files changed, 84 insertions(+), 70 deletions(-) diff --git a/packages/preact-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx b/packages/preact-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx index f7fdc3fd73c..1f168ef8f2b 100644 --- a/packages/preact-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx +++ b/packages/preact-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx @@ -11,7 +11,6 @@ import { usePrefetchInfiniteQuery, useSuspenseInfiniteQuery, } from '..' -import type { InfiniteData, UseSuspenseInfiniteQueryOptions } from '..' import { renderWithClient } from './utils' const generateInfiniteQueryOptions = ( @@ -59,28 +58,6 @@ describe('usePrefetchInfiniteQuery', () => { const Fallback = vi.fn().mockImplementation(() =>
Loading...
) - function Suspended(props: { - queryOpts: UseSuspenseInfiniteQueryOptions< - T, - Error, - InfiniteData, - Array, - any - > - renderPage: (page: T) => VNode - }) { - const state = useSuspenseInfiniteQuery(props.queryOpts) - - return ( -
- {state.data.pages.map((page, index) => ( -
{props.renderPage(page)}
- ))} - -
- ) - } - it('should prefetch an infinite query if query state does not exist', async () => { const data = [ { data: 'Do you fetch on render?', currentPage: 1, totalPages: 3 }, @@ -97,15 +74,25 @@ describe('usePrefetchInfiniteQuery', () => { ...generateInfiniteQueryOptions(data), } + function Page() { + const state = useSuspenseInfiniteQuery(queryOpts) + + return ( +
+ {state.data.pages.map((page, index) => ( +
data: {page.data}
+ ))} + +
+ ) + } + function App() { usePrefetchInfiniteQuery({ ...queryOpts, pages: data.length }) return ( }> -
data: {page.data}
} - /> +
) } @@ -140,15 +127,25 @@ describe('usePrefetchInfiniteQuery', () => { await vi.advanceTimersByTimeAsync(30) ;(queryOpts.queryFn as Mock).mockClear() + function Page() { + const state = useSuspenseInfiniteQuery(queryOpts) + + return ( +
+ {state.data.pages.map((page, index) => ( +
data: {page.data}
+ ))} + +
+ ) + } + function App() { usePrefetchInfiniteQuery(queryOpts) return ( }> -
data: {page.data}
} - /> +
) } @@ -179,14 +176,24 @@ describe('usePrefetchInfiniteQuery', () => { return <>{children} } + function Page() { + const state = useSuspenseInfiniteQuery(queryOpts) + + return ( +
+ {state.data.pages.map((page, index) => ( +
data: {page.data}
+ ))} + +
+ ) + } + function App() { return ( }> -
data: {page.data}
} - /> +
) diff --git a/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx index a6ea6a67518..1dd2ea15256 100644 --- a/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx @@ -9,7 +9,6 @@ import { useSuspenseInfiniteQuery, } from '..' import { renderWithClient } from './utils' -import type { InfiniteData, UseSuspenseInfiniteQueryOptions } from '..' import type { Mock } from 'vitest' const createFallback = () => @@ -57,28 +56,6 @@ describe('usePrefetchInfiniteQuery', () => { vi.useRealTimers() }) - function Suspended(props: { - queryOpts: UseSuspenseInfiniteQueryOptions< - T, - Error, - InfiniteData, - Array, - any - > - renderPage: (page: T) => React.JSX.Element - }) { - const state = useSuspenseInfiniteQuery(props.queryOpts) - - return ( -
- {state.data.pages.map((page, index) => ( -
{props.renderPage(page)}
- ))} - -
- ) - } - it('should prefetch an infinite query if query state does not exist', async () => { const Fallback = createFallback() const data = [ @@ -96,15 +73,25 @@ describe('usePrefetchInfiniteQuery', () => { ...generateInfiniteQueryOptions(data), } + function Page() { + const state = useSuspenseInfiniteQuery(queryOpts) + + return ( +
+ {state.data.pages.map((page, index) => ( +
data: {page.data}
+ ))} + +
+ ) + } + function App() { usePrefetchInfiniteQuery({ ...queryOpts, pages: data.length }) return ( }> -
data: {page.data}
} - /> +
) } @@ -140,15 +127,25 @@ describe('usePrefetchInfiniteQuery', () => { await vi.advanceTimersByTimeAsync(30) ;(queryOpts.queryFn as Mock).mockClear() + function Page() { + const state = useSuspenseInfiniteQuery(queryOpts) + + return ( +
+ {state.data.pages.map((page, index) => ( +
data: {page.data}
+ ))} + +
+ ) + } + function App() { usePrefetchInfiniteQuery(queryOpts) return ( }> -
data: {page.data}
} - /> +
) } @@ -179,14 +176,24 @@ describe('usePrefetchInfiniteQuery', () => { return <>{children} } + function Page() { + const state = useSuspenseInfiniteQuery(queryOpts) + + return ( +
+ {state.data.pages.map((page, index) => ( +
data: {page.data}
+ ))} + +
+ ) + } + function App() { return ( -
data: {page.data}
} - /> +
) From 99690d18b7937f217d3744b1c2ac78cc47caeaa7 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sat, 18 Jul 2026 21:43:09 +0900 Subject: [PATCH 68/97] test({react,preact}-query/usePrefetchInfiniteQuery): inline single-use helpers and adopt the 'pageParam' mock convention (#11079) --- .../usePrefetchInfiniteQuery.test.tsx | 91 ++++++++--------- .../usePrefetchInfiniteQuery.test.tsx | 98 ++++++++----------- 2 files changed, 84 insertions(+), 105 deletions(-) diff --git a/packages/preact-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx b/packages/preact-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx index 1f168ef8f2b..8a6b781919b 100644 --- a/packages/preact-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx +++ b/packages/preact-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx @@ -3,7 +3,6 @@ import { fireEvent } from '@testing-library/preact' import type { VNode } from 'preact' import { Suspense } from 'preact/compat' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import type { Mock } from 'vitest' import { QueryCache, @@ -13,33 +12,6 @@ import { } from '..' import { renderWithClient } from './utils' -const generateInfiniteQueryOptions = ( - data: Array<{ data: string; currentPage: number; totalPages: number }>, -) => { - let currentPage = 0 - - return { - queryFn: vi - .fn<(...args: Array) => Promise<(typeof data)[number]>>() - .mockImplementation(async () => { - const currentPageData = data[currentPage] - if (!currentPageData) { - throw new Error(`No data defined for page ${currentPage}`) - } - - await sleep(10) - currentPage++ - - return currentPageData - }), - initialPageParam: 1, - getNextPageParam: (lastPage: (typeof data)[number]) => - lastPage.currentPage === lastPage.totalPages - ? undefined - : lastPage.currentPage + 1, - } -} - describe('usePrefetchInfiniteQuery', () => { let queryCache: QueryCache let queryClient: QueryClient @@ -60,18 +32,21 @@ describe('usePrefetchInfiniteQuery', () => { it('should prefetch an infinite query if query state does not exist', async () => { const data = [ - { data: 'Do you fetch on render?', currentPage: 1, totalPages: 3 }, - { data: 'Or do you render as you fetch?', currentPage: 2, totalPages: 3 }, - { - data: 'Either way, Tanstack Query helps you!', - currentPage: 3, - totalPages: 3, - }, + 'Do you fetch on render?', + 'Or do you render as you fetch?', + 'Either way, Tanstack Query helps you!', ] const queryOpts = { queryKey: queryKey(), - ...generateInfiniteQueryOptions(data), + queryFn: vi + .fn<(context: { pageParam: number }) => Promise>() + .mockImplementation(({ pageParam }) => + sleep(10).then(() => data[pageParam]!), + ), + initialPageParam: 0, + getNextPageParam: (_lastPage: string, allPages: Array) => + allPages.length < data.length ? allPages.length : undefined, } function Page() { @@ -80,7 +55,7 @@ describe('usePrefetchInfiniteQuery', () => { return (
{state.data.pages.map((page, index) => ( -
data: {page.data}
+
data: {page}
))}
@@ -114,18 +89,27 @@ describe('usePrefetchInfiniteQuery', () => { }) it('should not display fallback if the query cache is already populated', async () => { + const data = [ + 'Prefetch rocks!', + 'No waterfalls, boy!', + 'Tanstack Query #ftw', + ] + const queryOpts = { queryKey: queryKey(), - ...generateInfiniteQueryOptions([ - { data: 'Prefetch rocks!', currentPage: 1, totalPages: 3 }, - { data: 'No waterfalls, boy!', currentPage: 2, totalPages: 3 }, - { data: 'Tanstack Query #ftw', currentPage: 3, totalPages: 3 }, - ]), + queryFn: vi + .fn<(context: { pageParam: number }) => Promise>() + .mockImplementation(({ pageParam }) => + sleep(10).then(() => data[pageParam]!), + ), + initialPageParam: 0, + getNextPageParam: (_lastPage: string, allPages: Array) => + allPages.length < data.length ? allPages.length : undefined, } queryClient.prefetchInfiniteQuery({ ...queryOpts, pages: 3 }) await vi.advanceTimersByTimeAsync(30) - ;(queryOpts.queryFn as Mock).mockClear() + queryOpts.queryFn.mockClear() function Page() { const state = useSuspenseInfiniteQuery(queryOpts) @@ -133,7 +117,7 @@ describe('usePrefetchInfiniteQuery', () => { return (
{state.data.pages.map((page, index) => ( -
data: {page.data}
+
data: {page}
))}
@@ -162,13 +146,20 @@ describe('usePrefetchInfiniteQuery', () => { }) it('should not create an endless loop when using inside a suspense boundary', async () => { + const data = ['Infinite Page 1', 'Infinite Page 2', 'Infinite Page 3'] + const queryOpts = { queryKey: queryKey(), - ...generateInfiniteQueryOptions([ - { data: 'Infinite Page 1', currentPage: 1, totalPages: 3 }, - { data: 'Infinite Page 2', currentPage: 1, totalPages: 3 }, - { data: 'Infinite Page 3', currentPage: 1, totalPages: 3 }, - ]), + queryFn: vi + .fn<(context: { pageParam: number }) => Promise>() + .mockImplementation(({ pageParam }) => + sleep(10).then(() => data[pageParam]!), + ), + initialPageParam: 0, + // always reports another page available, to guard against an endless + // auto-advance loop rather than a bounded pagination sequence + getNextPageParam: (_lastPage: string, allPages: Array) => + allPages.length, } function Prefetch({ children }: { children: VNode }) { @@ -182,7 +173,7 @@ describe('usePrefetchInfiniteQuery', () => { return (
{state.data.pages.map((page, index) => ( -
data: {page.data}
+
data: {page}
))}
diff --git a/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx index 1dd2ea15256..7e3df99f010 100644 --- a/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/usePrefetchInfiniteQuery.test.tsx @@ -9,37 +9,6 @@ import { useSuspenseInfiniteQuery, } from '..' import { renderWithClient } from './utils' -import type { Mock } from 'vitest' - -const createFallback = () => - vi.fn().mockImplementation(() =>
Loading...
) - -const generateInfiniteQueryOptions = ( - data: Array<{ data: string; currentPage: number; totalPages: number }>, -) => { - let currentPage = 0 - - return { - queryFn: vi - .fn<(...args: Array) => Promise<(typeof data)[number]>>() - .mockImplementation(async () => { - const currentPageData = data[currentPage] - if (!currentPageData) { - throw new Error('No data defined for page ' + currentPage) - } - - await sleep(10) - currentPage++ - - return currentPageData - }), - initialPageParam: 1, - getNextPageParam: (lastPage: (typeof data)[number]) => - lastPage.currentPage === lastPage.totalPages - ? undefined - : lastPage.currentPage + 1, - } -} describe('usePrefetchInfiniteQuery', () => { let queryCache: QueryCache @@ -57,20 +26,23 @@ describe('usePrefetchInfiniteQuery', () => { }) it('should prefetch an infinite query if query state does not exist', async () => { - const Fallback = createFallback() + const Fallback = vi.fn().mockImplementation(() =>
Loading...
) const data = [ - { data: 'Do you fetch on render?', currentPage: 1, totalPages: 3 }, - { data: 'Or do you render as you fetch?', currentPage: 2, totalPages: 3 }, - { - data: 'Either way, Tanstack Query helps you!', - currentPage: 3, - totalPages: 3, - }, + 'Do you fetch on render?', + 'Or do you render as you fetch?', + 'Either way, Tanstack Query helps you!', ] const queryOpts = { queryKey: queryKey(), - ...generateInfiniteQueryOptions(data), + queryFn: vi + .fn<(context: { pageParam: number }) => Promise>() + .mockImplementation(({ pageParam }) => + sleep(10).then(() => data[pageParam]!), + ), + initialPageParam: 0, + getNextPageParam: (_lastPage: string, allPages: Array) => + allPages.length < data.length ? allPages.length : undefined, } function Page() { @@ -79,7 +51,7 @@ describe('usePrefetchInfiniteQuery', () => { return (
{state.data.pages.map((page, index) => ( -
data: {page.data}
+
data: {page}
))}
@@ -113,19 +85,28 @@ describe('usePrefetchInfiniteQuery', () => { }) it('should not display fallback if the query cache is already populated', async () => { - const Fallback = createFallback() + const Fallback = vi.fn().mockImplementation(() =>
Loading...
) + const data = [ + 'Prefetch rocks!', + 'No waterfalls, boy!', + 'Tanstack Query #ftw', + ] + const queryOpts = { queryKey: queryKey(), - ...generateInfiniteQueryOptions([ - { data: 'Prefetch rocks!', currentPage: 1, totalPages: 3 }, - { data: 'No waterfalls, boy!', currentPage: 2, totalPages: 3 }, - { data: 'Tanstack Query #ftw', currentPage: 3, totalPages: 3 }, - ]), + queryFn: vi + .fn<(context: { pageParam: number }) => Promise>() + .mockImplementation(({ pageParam }) => + sleep(10).then(() => data[pageParam]!), + ), + initialPageParam: 0, + getNextPageParam: (_lastPage: string, allPages: Array) => + allPages.length < data.length ? allPages.length : undefined, } queryClient.prefetchInfiniteQuery({ ...queryOpts, pages: 3 }) await vi.advanceTimersByTimeAsync(30) - ;(queryOpts.queryFn as Mock).mockClear() + queryOpts.queryFn.mockClear() function Page() { const state = useSuspenseInfiniteQuery(queryOpts) @@ -133,7 +114,7 @@ describe('usePrefetchInfiniteQuery', () => { return (
{state.data.pages.map((page, index) => ( -
data: {page.data}
+
data: {page}
))}
@@ -162,13 +143,20 @@ describe('usePrefetchInfiniteQuery', () => { }) it('should not create an endless loop when using inside a suspense boundary', async () => { + const data = ['Infinite Page 1', 'Infinite Page 2', 'Infinite Page 3'] + const queryOpts = { queryKey: queryKey(), - ...generateInfiniteQueryOptions([ - { data: 'Infinite Page 1', currentPage: 1, totalPages: 3 }, - { data: 'Infinite Page 2', currentPage: 1, totalPages: 3 }, - { data: 'Infinite Page 3', currentPage: 1, totalPages: 3 }, - ]), + queryFn: vi + .fn<(context: { pageParam: number }) => Promise>() + .mockImplementation(({ pageParam }) => + sleep(10).then(() => data[pageParam]!), + ), + initialPageParam: 0, + // always reports another page available, to guard against an endless + // auto-advance loop rather than a bounded pagination sequence + getNextPageParam: (_lastPage: string, allPages: Array) => + allPages.length, } function Prefetch({ children }: { children: React.ReactNode }) { @@ -182,7 +170,7 @@ describe('usePrefetchInfiniteQuery', () => { return (
{state.data.pages.map((page, index) => ( -
data: {page.data}
+
data: {page}
))}
From d1558c1491629b36661e0a166e1091bb4a256daa Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 19 Jul 2026 02:36:41 +0900 Subject: [PATCH 69/97] test({react,preact}-query/usePrefetchQuery): inline the 'generateQueryFn' factory into each call site (#11080) * test({react,preact}-query/usePrefetchQuery): inline the 'generateQueryFn' factory into each call site * test({react,preact}-query/usePrefetchQuery): drop the unnecessary 'vi.fn()' wrapper on the never-asserted sentinel queryFn --- .../src/__tests__/usePrefetchQuery.test.tsx | 29 ++++++++++--------- .../src/__tests__/usePrefetchQuery.test.tsx | 29 ++++++++++--------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx index d05b24a7bc3..9dd5f3949da 100644 --- a/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx @@ -14,11 +14,6 @@ import { import { ErrorBoundary } from './ErrorBoundary' import { renderWithClient } from './utils' -const generateQueryFn = (data: string) => - vi - .fn<(...args: Array) => Promise>() - .mockImplementation(() => sleep(10).then(() => data)) - describe('usePrefetchQuery', () => { let queryCache: QueryCache let queryClient: QueryClient @@ -37,12 +32,12 @@ describe('usePrefetchQuery', () => { it('should prefetch query if query state does not exist', async () => { const queryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('prefetchQuery'), + queryFn: vi.fn(() => sleep(10).then(() => 'prefetchQuery')), } const componentQueryOpts = { ...queryOpts, - queryFn: generateQueryFn('useSuspenseQuery'), + queryFn: () => sleep(10).then(() => 'useSuspenseQuery'), } function Page() { @@ -72,7 +67,9 @@ describe('usePrefetchQuery', () => { it('should not prefetch query if query state exists', async () => { const queryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('The usePrefetchQuery hook is smart!'), + queryFn: vi.fn(() => + sleep(10).then(() => 'The usePrefetchQuery hook is smart!'), + ), } function Page() { @@ -105,7 +102,7 @@ describe('usePrefetchQuery', () => { it('should let errors fall through and not refetch failed queries', async () => { const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const queryFn = generateQueryFn('Not an error') + const queryFn = vi.fn(() => sleep(10).then(() => 'Not an error')) const queryOpts = { queryKey: queryKey(), @@ -148,7 +145,7 @@ describe('usePrefetchQuery', () => { }) it('should not create an endless loop when using inside a suspense boundary', async () => { - const queryFn = generateQueryFn('prefetchedQuery') + const queryFn = vi.fn(() => sleep(10).then(() => 'prefetchedQuery')) const queryOpts = { queryKey: queryKey(), @@ -184,7 +181,9 @@ describe('usePrefetchQuery', () => { it('should be able to recover from errors and try fetching again', async () => { const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const queryFn = generateQueryFn('This is fine :dog: :fire:') + const queryFn = vi.fn(() => + sleep(10).then(() => 'This is fine :dog: :fire:'), + ) const queryOpts = { queryKey: queryKey(), @@ -242,17 +241,19 @@ describe('usePrefetchQuery', () => { it('should not create a suspense waterfall if prefetch is fired', async () => { const firstQueryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('Prefetch is nice!'), + queryFn: vi.fn(() => sleep(10).then(() => 'Prefetch is nice!')), } const secondQueryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('Prefetch is really nice!!'), + queryFn: vi.fn(() => sleep(10).then(() => 'Prefetch is really nice!!')), } const thirdQueryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('Prefetch does not create waterfalls!!'), + queryFn: vi.fn(() => + sleep(10).then(() => 'Prefetch does not create waterfalls!!'), + ), } const Fallback = vi.fn().mockImplementation(() =>
Loading...
) diff --git a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx index bef84167b4a..78dc11ad11d 100644 --- a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx @@ -12,11 +12,6 @@ import { } from '..' import { renderWithClient } from './utils' -const generateQueryFn = (data: string) => - vi - .fn<(...args: Array) => Promise>() - .mockImplementation(() => sleep(10).then(() => data)) - describe('usePrefetchQuery', () => { let queryCache: QueryCache let queryClient: QueryClient @@ -35,12 +30,12 @@ describe('usePrefetchQuery', () => { it('should prefetch query if query state does not exist', async () => { const queryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('prefetchQuery'), + queryFn: vi.fn(() => sleep(10).then(() => 'prefetchQuery')), } const componentQueryOpts = { ...queryOpts, - queryFn: generateQueryFn('useSuspenseQuery'), + queryFn: () => sleep(10).then(() => 'useSuspenseQuery'), } function Page() { @@ -70,7 +65,9 @@ describe('usePrefetchQuery', () => { it('should not prefetch query if query state exists', async () => { const queryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('The usePrefetchQuery hook is smart!'), + queryFn: vi.fn(() => + sleep(10).then(() => 'The usePrefetchQuery hook is smart!'), + ), } function Page() { @@ -103,7 +100,7 @@ describe('usePrefetchQuery', () => { it('should let errors fall through and not refetch failed queries', async () => { const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const queryFn = generateQueryFn('Not an error') + const queryFn = vi.fn(() => sleep(10).then(() => 'Not an error')) const queryOpts = { queryKey: queryKey(), @@ -146,7 +143,7 @@ describe('usePrefetchQuery', () => { }) it('should not create an endless loop when using inside a suspense boundary', async () => { - const queryFn = generateQueryFn('prefetchedQuery') + const queryFn = vi.fn(() => sleep(10).then(() => 'prefetchedQuery')) const queryOpts = { queryKey: queryKey(), @@ -182,7 +179,9 @@ describe('usePrefetchQuery', () => { it('should be able to recover from errors and try fetching again', async () => { const consoleMock = vi.spyOn(console, 'error') consoleMock.mockImplementation(() => undefined) - const queryFn = generateQueryFn('This is fine :dog: :fire:') + const queryFn = vi.fn(() => + sleep(10).then(() => 'This is fine :dog: :fire:'), + ) const queryOpts = { queryKey: queryKey(), @@ -240,17 +239,19 @@ describe('usePrefetchQuery', () => { it('should not create a suspense waterfall if prefetch is fired', async () => { const firstQueryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('Prefetch is nice!'), + queryFn: vi.fn(() => sleep(10).then(() => 'Prefetch is nice!')), } const secondQueryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('Prefetch is really nice!!'), + queryFn: vi.fn(() => sleep(10).then(() => 'Prefetch is really nice!!')), } const thirdQueryOpts = { queryKey: queryKey(), - queryFn: generateQueryFn('Prefetch does not create waterfalls!!'), + queryFn: vi.fn(() => + sleep(10).then(() => 'Prefetch does not create waterfalls!!'), + ), } const Fallback = vi.fn().mockImplementation(() =>
Loading...
) From 44f38df5deaf72d8d74bc62b620dffed43fdbc05 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Sun, 19 Jul 2026 16:55:57 +0900 Subject: [PATCH 70/97] test({react,preact,solid}-query/useInfiniteQuery): inline the shared 'fetchItems' helper into the tests that use it (#11082) --- .../src/__tests__/useInfiniteQuery.test.tsx | 34 +++++--------- .../src/__tests__/useInfiniteQuery.test.tsx | 47 ++++++++++--------- .../src/__tests__/useInfiniteQuery.test.tsx | 31 +++++------- 3 files changed, 49 insertions(+), 63 deletions(-) diff --git a/packages/preact-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/preact-query/src/__tests__/useInfiniteQuery.test.tsx index 5a96f0dbf00..445883bcf9f 100644 --- a/packages/preact-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/preact-query/src/__tests__/useInfiniteQuery.test.tsx @@ -29,21 +29,6 @@ interface Result { const pageSize = 10 -const fetchItems = async ( - page: number, - ts: number, - noNext?: boolean, - noPrev?: boolean, -): Promise => { - await sleep(10) - return { - items: [...new Array(10)].fill(null).map((_, d) => page * pageSize + d), - nextId: noNext ? undefined : page + 1, - prevId: noPrev ? undefined : page - 1, - ts, - } -} - describe('useInfiniteQuery', () => { let queryCache: QueryCache let queryClient: QueryClient @@ -1538,12 +1523,19 @@ describe('useInfiniteQuery', () => { refetch, } = useInfiniteQuery({ queryKey: key, - queryFn: ({ pageParam }) => - fetchItems( - pageParam, - fetchCountRef.current++, - pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage), - ), + queryFn: async ({ pageParam }): Promise => { + await sleep(10) + const noNext = + pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage) + return { + items: [...new Array(10)] + .fill(null) + .map((_, d) => pageParam * pageSize + d), + nextId: noNext ? undefined : pageParam + 1, + prevId: pageParam - 1, + ts: fetchCountRef.current++, + } + }, getNextPageParam: (lastPage) => lastPage.nextId, initialPageParam: 0, }) diff --git a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx index fdcb9ad38ed..517adee3321 100644 --- a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx @@ -30,21 +30,6 @@ interface Result { const pageSize = 10 -const fetchItems = async ( - page: number, - ts: number, - noNext?: boolean, - noPrev?: boolean, -): Promise => { - await sleep(10) - return { - items: [...new Array(10)].fill(null).map((_, d) => page * pageSize + d), - nextId: noNext ? undefined : page + 1, - prevId: noPrev ? undefined : page - 1, - ts, - } -} - describe('useInfiniteQuery', () => { let queryCache: QueryCache let queryClient: QueryClient @@ -1617,12 +1602,19 @@ describe('useInfiniteQuery', () => { refetch, } = useInfiniteQuery({ queryKey: key, - queryFn: ({ pageParam }) => - fetchItems( - pageParam, - fetchCountRef.current++, - pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage), - ), + queryFn: async ({ pageParam }): Promise => { + await sleep(10) + const noNext = + pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage) + return { + items: [...new Array(10)] + .fill(null) + .map((_, d) => pageParam * pageSize + d), + nextId: noNext ? undefined : pageParam + 1, + prevId: pageParam - 1, + ts: fetchCountRef.current++, + } + }, getNextPageParam: (lastPage) => lastPage.nextId, initialPageParam: 0, }) @@ -1803,8 +1795,17 @@ describe('useInfiniteQuery', () => { useTrackRenders() const fetchCountRef = React.useRef(0) const query = useInfiniteQuery({ - queryFn: ({ pageParam }) => - fetchItems(pageParam, fetchCountRef.current++), + queryFn: async ({ pageParam }): Promise => { + await sleep(10) + return { + items: [...new Array(10)] + .fill(null) + .map((_, d) => pageParam * pageSize + d), + nextId: pageParam + 1, + prevId: pageParam - 1, + ts: fetchCountRef.current++, + } + }, getNextPageParam: (lastPage) => lastPage.nextId, initialPageParam: 0, queryKey: key, diff --git a/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx index f54c32ccb6d..a863cdb3a79 100644 --- a/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx @@ -36,19 +36,6 @@ interface Result { const pageSize = 10 -const fetchItems = ( - page: number, - ts: number, - noNext?: boolean, - noPrev?: boolean, -): Promise => - sleep(10).then(() => ({ - items: [...new Array(10)].fill(null).map((_, d) => page * pageSize + d), - nextId: noNext ? undefined : page + 1, - prevId: noPrev ? undefined : page - 1, - ts, - })) - describe('useInfiniteQuery', () => { let queryCache: QueryCache let queryClient: QueryClient @@ -1752,12 +1739,18 @@ describe('useInfiniteQuery', () => { const state = useInfiniteQuery(() => ({ queryKey: key, - queryFn: ({ pageParam }) => - fetchItems( - pageParam, - fetchCountRef++, - pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage()), - ), + queryFn: ({ pageParam }): Promise => { + const noNext = + pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage()) + return sleep(10).then(() => ({ + items: [...new Array(10)] + .fill(null) + .map((_, d) => pageParam * pageSize + d), + nextId: noNext ? undefined : pageParam + 1, + prevId: pageParam - 1, + ts: fetchCountRef++, + })) + }, initialPageParam: 0, getNextPageParam: (lastPage) => lastPage.nextId, })) From a42b8a3b00718c4d98bcf704a7e1101fd8c783cf Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 20 Jul 2026 12:32:07 +0900 Subject: [PATCH 71/97] test(query-core/queryObserver): use the '.then()' convention consistently (#11086) --- .../src/__tests__/queryObserver.test.tsx | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/query-core/src/__tests__/queryObserver.test.tsx b/packages/query-core/src/__tests__/queryObserver.test.tsx index 9ffcb3ba51b..557ef79614d 100644 --- a/packages/query-core/src/__tests__/queryObserver.test.tsx +++ b/packages/query-core/src/__tests__/queryObserver.test.tsx @@ -103,11 +103,11 @@ describe('queryObserver', () => { queryKey: key, staleTime: Infinity, enabled: () => enabled, - queryFn: async () => { - await sleep(10) - count++ - return 'data' - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data' + }), }) }) @@ -267,11 +267,11 @@ describe('queryObserver', () => { const observer = new QueryObserver(queryClient, { queryKey: key, staleTime: Infinity, - queryFn: async () => { - await sleep(10) - count++ - return 'data' - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data' + }), }) let unsubscribe = observer.subscribe(vi.fn()) From 6d55b0759b4722b888fa516b1bb86c0a56ea47a2 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 20 Jul 2026 19:38:28 +0900 Subject: [PATCH 72/97] test({react,preact}-query): use the '.then()' convention consistently (#11085) * test({react,preact}-query/useInfiniteQuery): use the '.then()' convention consistently * test({react,preact}-query/useMutation): use the '.then()' convention consistently * test({react,preact}-query/useQueries): use the '.then()' convention consistently * test({react,preact}-query/useQuery): use the '.then()' convention consistently --- .../src/__tests__/useInfiniteQuery.test.tsx | 7 +- .../src/__tests__/useMutation.test.tsx | 114 +++++------ .../src/__tests__/useQueries.test.tsx | 34 ++-- .../src/__tests__/useQuery.test.tsx | 181 ++++++++---------- .../src/__tests__/useInfiniteQuery.test.tsx | 15 +- .../src/__tests__/useMutation.test.tsx | 114 +++++------ .../src/__tests__/useQueries.test.tsx | 34 ++-- .../src/__tests__/useQuery.promise.test.tsx | 30 +-- .../src/__tests__/useQuery.test.tsx | 162 +++++++--------- .../src/__tests__/useSuspenseQuery.test.tsx | 2 +- 10 files changed, 323 insertions(+), 370 deletions(-) diff --git a/packages/preact-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/preact-query/src/__tests__/useInfiniteQuery.test.tsx index 445883bcf9f..55601b5c952 100644 --- a/packages/preact-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/preact-query/src/__tests__/useInfiniteQuery.test.tsx @@ -1523,18 +1523,17 @@ describe('useInfiniteQuery', () => { refetch, } = useInfiniteQuery({ queryKey: key, - queryFn: async ({ pageParam }): Promise => { - await sleep(10) + queryFn: ({ pageParam }): Promise => { const noNext = pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage) - return { + return sleep(10).then(() => ({ items: [...new Array(10)] .fill(null) .map((_, d) => pageParam * pageSize + d), nextId: noNext ? undefined : pageParam + 1, prevId: pageParam - 1, ts: fetchCountRef.current++, - } + })) }, getNextPageParam: (lastPage) => lastPage.nextId, initialPageParam: 0, diff --git a/packages/preact-query/src/__tests__/useMutation.test.tsx b/packages/preact-query/src/__tests__/useMutation.test.tsx index 8787e3cb883..e24f79ddfba 100644 --- a/packages/preact-query/src/__tests__/useMutation.test.tsx +++ b/packages/preact-query/src/__tests__/useMutation.test.tsx @@ -210,7 +210,7 @@ describe('useMutation', () => { function Page() { const { mutateAsync } = useMutation({ - mutationFn: async (_text: string) => + mutationFn: (_text: string) => sleep(10).then(() => { throw new Error('oops') }), @@ -370,7 +370,7 @@ describe('useMutation', () => { function Page() { const { mutateAsync } = useMutation({ - mutationFn: async (_text: string) => + mutationFn: (_text: string) => sleep(10).then(() => { throw new Error('oops') }), @@ -740,7 +740,7 @@ describe('useMutation', () => { function Page() { const { mutateAsync } = useMutation({ - mutationFn: async (_text: string) => + mutationFn: (_text: string) => sleep(10).then(() => { throw new Error('oops') }), @@ -860,7 +860,7 @@ describe('useMutation', () => { function Page() { const { mutateAsync } = useMutation({ - mutationFn: async (_text: string) => Promise.reject(new Error('oops')), + mutationFn: (_text: string) => Promise.reject(new Error('oops')), onError: () => { callbacks.push('useMutation.onError') return Promise.resolve() @@ -911,7 +911,7 @@ describe('useMutation', () => { function Page() { const { mutate } = useMutation({ - mutationFn: async (_text: string) => + mutationFn: (_text: string) => sleep(10).then(() => Promise.reject(new Error('oops'))), onError: () => { callbacks.push('useMutation.onError') @@ -1238,13 +1238,13 @@ describe('useMutation', () => { function Page() { const state = useMutation({ mutationKey: key, - mutationFn: async (_text: string) => { - await sleep(10) - count++ - return count > 1 - ? Promise.resolve(`data${count}`) - : Promise.reject(new Error('oops')) - }, + mutationFn: (_text: string) => + sleep(10).then(() => { + count++ + return count > 1 + ? Promise.resolve(`data${count}`) + : Promise.reject(new Error('oops')) + }), retry: 1, retryDelay: 5, networkMode: 'offlineFirst', @@ -1808,10 +1808,10 @@ describe('useMutation', () => { function Page() { const mutation = useMutation({ - mutationFn: async (_text: string) => { - await sleep(10) - throw mutateFnError - }, + mutationFn: (_text: string) => + sleep(10).then(() => { + throw mutateFnError + }), onError: () => Promise.reject(error), }) @@ -1854,10 +1854,10 @@ describe('useMutation', () => { function Page() { const mutation = useMutation({ - mutationFn: async (_text: string) => { - await sleep(10) - throw mutateFnError - }, + mutationFn: (_text: string) => + sleep(10).then(() => { + throw mutateFnError + }), onSettled: () => Promise.reject(error), onError, }) @@ -1895,7 +1895,7 @@ describe('useMutation', () => { function Page() { const mutation = useMutation( { - mutationFn: async (text: string) => { + mutationFn: (text: string) => { return Promise.resolve(text) }, }, @@ -2017,13 +2017,13 @@ describe('useMutation', () => { const [message, setMessage] = useState('idle') const { mutate } = useMutation({ - mutationFn: async (shouldFail: boolean) => { - await sleep(10) - if (shouldFail) { - throw new Error('submission failed') - } - return 'submitted successfully' - }, + mutationFn: (shouldFail: boolean) => + sleep(10).then(() => { + if (shouldFail) { + throw new Error('submission failed') + } + return 'submitted successfully' + }), retry: false, }) @@ -2059,13 +2059,13 @@ describe('useMutation', () => { const [message, setMessage] = useState('idle') const { mutate } = useMutation({ - mutationFn: async (shouldFail: boolean) => { - await sleep(10) - if (shouldFail) { - throw new Error('submission failed') - } - return 'submitted successfully' - }, + mutationFn: (shouldFail: boolean) => + sleep(10).then(() => { + if (shouldFail) { + throw new Error('submission failed') + } + return 'submitted successfully' + }), retry: false, }) @@ -2103,14 +2103,14 @@ describe('useMutation', () => { const [message, setMessage] = useState('idle') const { mutate } = useMutation({ - mutationFn: async () => { - await sleep(10) - attempt++ - if (attempt < 2) { - throw new Error('temporary failure') - } - return 'success' - }, + mutationFn: () => + sleep(10).then(() => { + attempt++ + if (attempt < 2) { + throw new Error('temporary failure') + } + return 'success' + }), retry: false, }) @@ -2309,13 +2309,13 @@ describe('useMutation', () => { const [result, setResult] = useState('idle') const { mutateAsync } = useMutation({ - mutationFn: async (file: string) => { - await sleep(10) - if (file === 'file2') { - throw new Error('upload failed') - } - return `uploaded: ${file}` - }, + mutationFn: (file: string) => + sleep(10).then(() => { + if (file === 'file2') { + throw new Error('upload failed') + } + return `uploaded: ${file}` + }), retry: false, }) @@ -2357,13 +2357,13 @@ describe('useMutation', () => { const [result, setResult] = useState('idle') const { mutateAsync } = useMutation({ - mutationFn: async (file: string) => { - await sleep(10) - if (file === 'file2') { - throw new Error('upload failed') - } - return `uploaded: ${file}` - }, + mutationFn: (file: string) => + sleep(10).then(() => { + if (file === 'file2') { + throw new Error('upload failed') + } + return `uploaded: ${file}` + }), retry: false, }) diff --git a/packages/preact-query/src/__tests__/useQueries.test.tsx b/packages/preact-query/src/__tests__/useQueries.test.tsx index 5badd078844..ccb3b3a34f4 100644 --- a/packages/preact-query/src/__tests__/useQueries.test.tsx +++ b/packages/preact-query/src/__tests__/useQueries.test.tsx @@ -74,11 +74,11 @@ describe('useQueries', () => { queries: [ { queryKey: key1, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), }, ], }) @@ -145,7 +145,7 @@ describe('useQueries', () => { }, { queryKey: key4, - queryFn: async () => + queryFn: () => Promise.reject( new Error('this should not throw because query#2 already did'), ), @@ -213,7 +213,7 @@ describe('useQueries', () => { }, { queryKey: key4, - queryFn: async () => + queryFn: () => Promise.reject( new Error('this should not throw because query#3 already did'), ), @@ -769,19 +769,19 @@ describe('useQueries', () => { queries: [ { queryKey: [key1], - queryFn: async () => { - await sleep(10) - queryFns.push('first result') - return 'first result' - }, + queryFn: () => + sleep(10).then(() => { + queryFns.push('first result') + return 'first result' + }), }, { queryKey: [key2], - queryFn: async () => { - await sleep(20) - queryFns.push('second result') - return 'second result' - }, + queryFn: () => + sleep(20).then(() => { + queryFns.push('second result') + return 'second result' + }), }, ], combine: () => 'foo', diff --git a/packages/preact-query/src/__tests__/useQuery.test.tsx b/packages/preact-query/src/__tests__/useQuery.test.tsx index e99de4e3336..3a36725ff09 100644 --- a/packages/preact-query/src/__tests__/useQuery.test.tsx +++ b/packages/preact-query/src/__tests__/useQuery.test.tsx @@ -758,11 +758,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return `test${count}` - }, + queryFn: () => + sleep(10).then(() => { + count++ + return `test${count}` + }), }) states.push(state) @@ -877,10 +877,7 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return ++count - }, + queryFn: () => sleep(10).then(() => ++count), notifyOnChangeProps: 'all', }) @@ -939,11 +936,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count === 1 ? result1 : result2 - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count === 1 ? result1 : result2 + }), notifyOnChangeProps: 'all', }) @@ -1027,11 +1024,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, }) @@ -1073,11 +1070,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), enabled: false, }) @@ -1113,11 +1110,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), enabled: false, }) @@ -1272,12 +1269,7 @@ describe('useQuery', () => { const state = useQuery({ queryKey: [key, count], - queryFn: async () => { - await sleep(10) - return { - count, - } - }, + queryFn: () => sleep(10).then(() => ({ count })), select(data) { return data.count }, @@ -1344,12 +1336,7 @@ describe('useQuery', () => { const state = useQuery({ queryKey: [key, count], - queryFn: async () => { - await sleep(10) - return { - count, - } - }, + queryFn: () => sleep(10).then(() => ({ count })), select(data) { return data.count }, @@ -1399,12 +1386,7 @@ describe('useQuery', () => { const state = useQuery({ queryKey: [key, count], - queryFn: async () => { - await sleep(10) - return { - count, - } - }, + queryFn: () => sleep(10).then(() => ({ count })), select(data) { return data.count }, @@ -1483,13 +1465,13 @@ describe('useQuery', () => { function Page({ count }: { count: number }) { const state = useQuery({ queryKey: [key, count], - queryFn: async () => { - await sleep(10) - if (count === 2) { - throw new Error('Error test') - } - return Promise.resolve(count) - }, + queryFn: () => + sleep(10).then(() => { + if (count === 2) { + throw new Error('Error test') + } + return Promise.resolve(count) + }), retry: false, placeholderData: keepPreviousData, }) @@ -2201,11 +2183,10 @@ describe('useQuery', () => { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(5) - fetchCounterRef.current++ - return `fetch counter: ${fetchCounterRef.current}` - }, + queryFn: () => + sleep(5).then( + () => `fetch counter: ${++fetchCounterRef.current}`, + ), notifyOnChangeProps, }) @@ -2591,10 +2572,7 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return count++ - }, + queryFn: () => sleep(10).then(() => count++), staleTime: Infinity, refetchOnWindowFocus: 'always', @@ -2630,10 +2608,7 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return count++ - }, + queryFn: () => sleep(10).then(() => count++), staleTime: 0, retry: 0, @@ -3996,16 +3971,15 @@ describe('useQuery', () => { function Page() { const result = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return ( - queryFn() || { - data: { - nested: true, + queryFn: () => + sleep(10).then( + () => + queryFn() || { + data: { + nested: true, + }, }, - } - ) - }, + ), }) useMemo(() => { @@ -4077,10 +4051,7 @@ describe('useQuery', () => { function Page() { const queryInfo = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return count++ - }, + queryFn: () => sleep(10).then(() => count++), refetchInterval: ({ state: { data = 0 } }) => (data < 2 ? 10 : false), }) @@ -4715,11 +4686,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, }) @@ -4786,11 +4757,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, enabled: false, notifyOnChangeProps: 'all', @@ -4971,13 +4942,13 @@ describe('useQuery', () => { function Page({ id }: { id: number }) { const { error, isPending } = useQuery({ queryKey: [id], - queryFn: async () => { - await sleep(10) - if (id % 2 === 1) { - return Promise.reject(new Error('Error')) - } - return 'data' - }, + queryFn: () => + sleep(10).then(() => { + if (id % 2 === 1) { + return Promise.reject(new Error('Error')) + } + return 'data' + }), retry: false, retryOnMount: () => false, refetchOnMount: false, @@ -5092,14 +5063,14 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - if (count === 0) { - count++ - throw error - } - return 5 - }, + queryFn: () => + sleep(10).then(() => { + if (count === 0) { + count++ + throw error + } + return 5 + }), retry: false, }) diff --git a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx index 517adee3321..fdbd401028c 100644 --- a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx @@ -1602,18 +1602,17 @@ describe('useInfiniteQuery', () => { refetch, } = useInfiniteQuery({ queryKey: key, - queryFn: async ({ pageParam }): Promise => { - await sleep(10) + queryFn: ({ pageParam }): Promise => { const noNext = pageParam === MAX || (pageParam === MAX - 1 && isRemovedLastPage) - return { + return sleep(10).then(() => ({ items: [...new Array(10)] .fill(null) .map((_, d) => pageParam * pageSize + d), nextId: noNext ? undefined : pageParam + 1, prevId: pageParam - 1, ts: fetchCountRef.current++, - } + })) }, getNextPageParam: (lastPage) => lastPage.nextId, initialPageParam: 0, @@ -1795,17 +1794,15 @@ describe('useInfiniteQuery', () => { useTrackRenders() const fetchCountRef = React.useRef(0) const query = useInfiniteQuery({ - queryFn: async ({ pageParam }): Promise => { - await sleep(10) - return { + queryFn: ({ pageParam }): Promise => + sleep(10).then(() => ({ items: [...new Array(10)] .fill(null) .map((_, d) => pageParam * pageSize + d), nextId: pageParam + 1, prevId: pageParam - 1, ts: fetchCountRef.current++, - } - }, + })), getNextPageParam: (lastPage) => lastPage.nextId, initialPageParam: 0, queryKey: key, diff --git a/packages/react-query/src/__tests__/useMutation.test.tsx b/packages/react-query/src/__tests__/useMutation.test.tsx index dd1d737d7ca..c23b75bf3a4 100644 --- a/packages/react-query/src/__tests__/useMutation.test.tsx +++ b/packages/react-query/src/__tests__/useMutation.test.tsx @@ -209,7 +209,7 @@ describe('useMutation', () => { function Page() { const { mutateAsync } = useMutation({ - mutationFn: async (_text: string) => + mutationFn: (_text: string) => sleep(10).then(() => { throw new Error('oops') }), @@ -369,7 +369,7 @@ describe('useMutation', () => { function Page() { const { mutateAsync } = useMutation({ - mutationFn: async (_text: string) => + mutationFn: (_text: string) => sleep(10).then(() => { throw new Error('oops') }), @@ -739,7 +739,7 @@ describe('useMutation', () => { function Page() { const { mutateAsync } = useMutation({ - mutationFn: async (_text: string) => + mutationFn: (_text: string) => sleep(10).then(() => { throw new Error('oops') }), @@ -859,7 +859,7 @@ describe('useMutation', () => { function Page() { const { mutateAsync } = useMutation({ - mutationFn: async (_text: string) => Promise.reject(new Error('oops')), + mutationFn: (_text: string) => Promise.reject(new Error('oops')), onError: () => { callbacks.push('useMutation.onError') return Promise.resolve() @@ -910,7 +910,7 @@ describe('useMutation', () => { function Page() { const { mutate } = useMutation({ - mutationFn: async (_text: string) => + mutationFn: (_text: string) => sleep(10).then(() => Promise.reject(new Error('oops'))), onError: () => { callbacks.push('useMutation.onError') @@ -1237,13 +1237,13 @@ describe('useMutation', () => { function Page() { const state = useMutation({ mutationKey: key, - mutationFn: async (_text: string) => { - await sleep(10) - count++ - return count > 1 - ? Promise.resolve(`data${count}`) - : Promise.reject(new Error('oops')) - }, + mutationFn: (_text: string) => + sleep(10).then(() => { + count++ + return count > 1 + ? Promise.resolve(`data${count}`) + : Promise.reject(new Error('oops')) + }), retry: 1, retryDelay: 5, networkMode: 'offlineFirst', @@ -1807,10 +1807,10 @@ describe('useMutation', () => { function Page() { const mutation = useMutation({ - mutationFn: async (_text: string) => { - await sleep(10) - throw mutateFnError - }, + mutationFn: (_text: string) => + sleep(10).then(() => { + throw mutateFnError + }), onError: () => Promise.reject(error), }) @@ -1853,10 +1853,10 @@ describe('useMutation', () => { function Page() { const mutation = useMutation({ - mutationFn: async (_text: string) => { - await sleep(10) - throw mutateFnError - }, + mutationFn: (_text: string) => + sleep(10).then(() => { + throw mutateFnError + }), onSettled: () => Promise.reject(error), onError, }) @@ -1894,7 +1894,7 @@ describe('useMutation', () => { function Page() { const mutation = useMutation( { - mutationFn: async (text: string) => { + mutationFn: (text: string) => { return Promise.resolve(text) }, }, @@ -2016,13 +2016,13 @@ describe('useMutation', () => { const [message, setMessage] = React.useState('idle') const { mutate } = useMutation({ - mutationFn: async (shouldFail: boolean) => { - await sleep(10) - if (shouldFail) { - throw new Error('submission failed') - } - return 'submitted successfully' - }, + mutationFn: (shouldFail: boolean) => + sleep(10).then(() => { + if (shouldFail) { + throw new Error('submission failed') + } + return 'submitted successfully' + }), retry: false, }) @@ -2058,13 +2058,13 @@ describe('useMutation', () => { const [message, setMessage] = React.useState('idle') const { mutate } = useMutation({ - mutationFn: async (shouldFail: boolean) => { - await sleep(10) - if (shouldFail) { - throw new Error('submission failed') - } - return 'submitted successfully' - }, + mutationFn: (shouldFail: boolean) => + sleep(10).then(() => { + if (shouldFail) { + throw new Error('submission failed') + } + return 'submitted successfully' + }), retry: false, }) @@ -2102,14 +2102,14 @@ describe('useMutation', () => { const [message, setMessage] = React.useState('idle') const { mutate } = useMutation({ - mutationFn: async () => { - await sleep(10) - attempt++ - if (attempt < 2) { - throw new Error('temporary failure') - } - return 'success' - }, + mutationFn: () => + sleep(10).then(() => { + attempt++ + if (attempt < 2) { + throw new Error('temporary failure') + } + return 'success' + }), retry: false, }) @@ -2308,13 +2308,13 @@ describe('useMutation', () => { const [result, setResult] = React.useState('idle') const { mutateAsync } = useMutation({ - mutationFn: async (file: string) => { - await sleep(10) - if (file === 'file2') { - throw new Error('upload failed') - } - return `uploaded: ${file}` - }, + mutationFn: (file: string) => + sleep(10).then(() => { + if (file === 'file2') { + throw new Error('upload failed') + } + return `uploaded: ${file}` + }), retry: false, }) @@ -2356,13 +2356,13 @@ describe('useMutation', () => { const [result, setResult] = React.useState('idle') const { mutateAsync } = useMutation({ - mutationFn: async (file: string) => { - await sleep(10) - if (file === 'file2') { - throw new Error('upload failed') - } - return `uploaded: ${file}` - }, + mutationFn: (file: string) => + sleep(10).then(() => { + if (file === 'file2') { + throw new Error('upload failed') + } + return `uploaded: ${file}` + }), retry: false, }) diff --git a/packages/react-query/src/__tests__/useQueries.test.tsx b/packages/react-query/src/__tests__/useQueries.test.tsx index bee70698fc7..c7a9283d07c 100644 --- a/packages/react-query/src/__tests__/useQueries.test.tsx +++ b/packages/react-query/src/__tests__/useQueries.test.tsx @@ -73,11 +73,11 @@ describe('useQueries', () => { queries: [ { queryKey: key1, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), }, ], }) @@ -144,7 +144,7 @@ describe('useQueries', () => { }, { queryKey: key4, - queryFn: async () => + queryFn: () => Promise.reject( new Error('this should not throw because query#2 already did'), ), @@ -212,7 +212,7 @@ describe('useQueries', () => { }, { queryKey: key4, - queryFn: async () => + queryFn: () => Promise.reject( new Error('this should not throw because query#3 already did'), ), @@ -768,19 +768,19 @@ describe('useQueries', () => { queries: [ { queryKey: [key1], - queryFn: async () => { - await sleep(10) - queryFns.push('first result') - return 'first result' - }, + queryFn: () => + sleep(10).then(() => { + queryFns.push('first result') + return 'first result' + }), }, { queryKey: [key2], - queryFn: async () => { - await sleep(20) - queryFns.push('second result') - return 'second result' - }, + queryFn: () => + sleep(20).then(() => { + queryFns.push('second result') + return 'second result' + }), }, ], combine: () => 'foo', diff --git a/packages/react-query/src/__tests__/useQuery.promise.test.tsx b/packages/react-query/src/__tests__/useQuery.promise.test.tsx index 8707b439d90..9847823892f 100644 --- a/packages/react-query/src/__tests__/useQuery.promise.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.promise.test.tsx @@ -499,14 +499,14 @@ describe('useQuery().promise', { timeout: 10_000 }, () => { function Page() { const query = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - if (++queryCount > 1) { - // second time this query mounts, it should not throw - return 'data' - } - throw new Error('Error test') - }, + queryFn: () => + sleep(10).then(() => { + if (++queryCount > 1) { + // second time this query mounts, it should not throw + return 'data' + } + throw new Error('Error test') + }), retry: false, }) @@ -1393,13 +1393,13 @@ describe('useQuery().promise', { timeout: 10_000 }, () => { function Page() { const query = useInfiniteQuery({ queryKey: key, - queryFn: async ({ pageParam = 0 }) => { - await sleep(10) - if (pageParam === 0) { - return { nextCursor: 1, data: 'page-1' } - } - throw new Error('page error') - }, + queryFn: ({ pageParam = 0 }) => + sleep(10).then(() => { + if (pageParam === 0) { + return { nextCursor: 1, data: 'page-1' } + } + throw new Error('page error') + }), initialPageParam: 0, getNextPageParam: (lastPage) => lastPage.nextCursor, retry: false, diff --git a/packages/react-query/src/__tests__/useQuery.test.tsx b/packages/react-query/src/__tests__/useQuery.test.tsx index 1698f91af32..05984e66ce5 100644 --- a/packages/react-query/src/__tests__/useQuery.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.test.tsx @@ -750,11 +750,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return 'test' + count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'test' + count + }), }) states.push(state) @@ -869,10 +869,7 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return ++count - }, + queryFn: () => sleep(10).then(() => ++count), notifyOnChangeProps: 'all', }) @@ -931,11 +928,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count === 1 ? result1 : result2 - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count === 1 ? result1 : result2 + }), notifyOnChangeProps: 'all', }) @@ -1019,11 +1016,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, }) @@ -1065,11 +1062,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), enabled: false, }) @@ -1105,11 +1102,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), enabled: false, }) @@ -1460,13 +1457,13 @@ describe('useQuery', () => { function Page({ count }: { count: number }) { const state = useQuery({ queryKey: [key, count], - queryFn: async () => { - await sleep(10) - if (count === 2) { - throw new Error('Error test') - } - return Promise.resolve(count) - }, + queryFn: () => + sleep(10).then(() => { + if (count === 2) { + throw new Error('Error test') + } + return Promise.resolve(count) + }), retry: false, placeholderData: keepPreviousData, }) @@ -2178,11 +2175,10 @@ describe('useQuery', () => { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(5) - fetchCounterRef.current++ - return `fetch counter: ${fetchCounterRef.current}` - }, + queryFn: () => + sleep(5).then( + () => `fetch counter: ${++fetchCounterRef.current}`, + ), notifyOnChangeProps, }) @@ -2568,10 +2564,7 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return count++ - }, + queryFn: () => sleep(10).then(() => count++), staleTime: Infinity, refetchOnWindowFocus: 'always', @@ -2607,10 +2600,7 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return count++ - }, + queryFn: () => sleep(10).then(() => count++), staleTime: 0, retry: 0, @@ -3974,16 +3964,15 @@ describe('useQuery', () => { function Page() { const result = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return ( - queryFn() || { - data: { - nested: true, + queryFn: () => + sleep(10).then( + () => + queryFn() || { + data: { + nested: true, + }, }, - } - ) - }, + ), }) React.useMemo(() => { @@ -4055,10 +4044,7 @@ describe('useQuery', () => { function Page() { const queryInfo = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - return count++ - }, + queryFn: () => sleep(10).then(() => count++), refetchInterval: ({ state: { data = 0 } }) => (data < 2 ? 10 : false), }) @@ -4694,11 +4680,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, }) @@ -4765,11 +4751,11 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, enabled: false, notifyOnChangeProps: 'all', @@ -4950,14 +4936,14 @@ describe('useQuery', () => { function Page({ id }: { id: number }) { const { error, isPending } = useQuery({ queryKey: [id], - queryFn: async () => { - await sleep(10) - if (id % 2 === 1) { - return Promise.reject(new Error('Error')) - } else { - return 'data' - } - }, + queryFn: () => + sleep(10).then(() => { + if (id % 2 === 1) { + return Promise.reject(new Error('Error')) + } else { + return 'data' + } + }), retry: false, retryOnMount: () => false, refetchOnMount: false, @@ -5072,14 +5058,14 @@ describe('useQuery', () => { function Page() { const state = useQuery({ queryKey: key, - queryFn: async () => { - await sleep(10) - if (count === 0) { - count++ - throw error - } - return 5 - }, + queryFn: () => + sleep(10).then(() => { + if (count === 0) { + count++ + throw error + } + return 5 + }), retry: false, }) diff --git a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx index ef593b5a222..bb83983bef3 100644 --- a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx @@ -839,7 +839,7 @@ describe('useSuspenseQuery', () => { const state = useSuspenseQuery({ queryKey: stateKey, - queryFn: async () => sleep(10).then(() => ++count), + queryFn: () => sleep(10).then(() => ++count), }) states.push(state) From ff24bf7b31600c735918b625cac7efbabf59d291 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 20 Jul 2026 19:39:14 +0900 Subject: [PATCH 73/97] test(solid-query): use the '.then()' convention consistently (#11087) * test(solid-query/useMutation): use the '.then()' convention consistently * test(solid-query/useQuery): use the '.then()' convention consistently * test(solid-query-persist-client): use the '.then()' convention consistently --- .../PersistQueryClientProvider.test.tsx | 10 +- .../src/__tests__/useMutation.test.tsx | 32 +- .../src/__tests__/useQuery.test.tsx | 280 +++++++++--------- 3 files changed, 161 insertions(+), 161 deletions(-) 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 def88d6df5d..1ecdde8b6bf 100644 --- a/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx +++ b/packages/solid-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -328,11 +328,11 @@ describe('PersistQueryClientProvider', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - fetched = true - return 'fetched' - }, + queryFn: () => + sleep(10).then(() => { + fetched = true + return 'fetched' + }), staleTime: Infinity, })) diff --git a/packages/solid-query/src/__tests__/useMutation.test.tsx b/packages/solid-query/src/__tests__/useMutation.test.tsx index 7d07509dd2e..1a2c19e4655 100644 --- a/packages/solid-query/src/__tests__/useMutation.test.tsx +++ b/packages/solid-query/src/__tests__/useMutation.test.tsx @@ -956,13 +956,13 @@ describe('useMutation', () => { function Page() { const mutation = useMutation(() => ({ - mutationFn: async (_text: string) => { - await sleep(1) - count++ - return count > 1 - ? Promise.resolve('data') - : Promise.reject(new Error('oops')) - }, + mutationFn: (_text: string) => + sleep(1).then(() => { + count++ + return count > 1 + ? Promise.resolve('data') + : Promise.reject(new Error('oops')) + }), retry: 1, retryDelay: 5, networkMode: 'offlineFirst', @@ -1413,10 +1413,10 @@ describe('useMutation', () => { function Page() { const mutation = useMutation(() => ({ - mutationFn: async (_text: string) => { - await sleep(10) - throw mutateFnError - }, + mutationFn: (_text: string) => + sleep(10).then(() => { + throw mutateFnError + }), onError: () => Promise.reject(error), })) @@ -1459,10 +1459,10 @@ describe('useMutation', () => { function Page() { const mutation = useMutation(() => ({ - mutationFn: async (_text: string) => { - await sleep(10) - throw mutateFnError - }, + mutationFn: (_text: string) => + sleep(10).then(() => { + throw mutateFnError + }), onSettled: () => Promise.reject(error), onError, })) @@ -1500,7 +1500,7 @@ describe('useMutation', () => { function Page() { const mutation = useMutation( () => ({ - mutationFn: async (text: string) => { + mutationFn: (text: string) => { return Promise.resolve(text) }, }), diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 6c999d10b6d..1574767b703 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -348,11 +348,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - fetchCount++ - return 'data' - }, + queryFn: () => + sleep(10).then(() => { + fetchCount++ + return 'data' + }), enabled: false, initialData: 'initialData', })) @@ -383,11 +383,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - fetchCount++ - return 'data' - }, + queryFn: () => + sleep(10).then(() => { + fetchCount++ + return 'data' + }), enabled: false, initialData: 'initialData', })) @@ -418,11 +418,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - fetchCount++ - return 'data' - }, + queryFn: () => + sleep(10).then(() => { + fetchCount++ + return 'data' + }), enabled: false, })) @@ -829,14 +829,14 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return [ - { id: '1', done: false }, - { id: '2', done: count > 1 }, - ] - }, + queryFn: () => + sleep(10).then(() => { + count++ + return [ + { id: '1', done: false }, + { id: '2', done: count > 1 }, + ] + }), reconcile: 'id', })) @@ -898,11 +898,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count === 1 ? result1 : result2 - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count === 1 ? result1 : result2 + }), reconcile: (oldData, newData) => { return reconcile(newData)(oldData) }, @@ -1002,11 +1002,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, })) @@ -1075,11 +1075,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), enabled: false, })) @@ -1117,11 +1117,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), enabled: false, })) @@ -2358,11 +2358,11 @@ describe('useQuery', () => { function Page() { const result = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - throw new Error('some error') - }, + queryFn: () => + sleep(10).then(() => { + count++ + throw new Error('some error') + }), retry: 2, retryDelay: 100, @@ -2422,11 +2422,11 @@ describe('useQuery', () => { function Page() { const result = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - throw new Error('some error') - }, + queryFn: () => + sleep(10).then(() => { + count++ + throw new Error('some error') + }), retry: 2, retryDelay: 100, })) @@ -2868,11 +2868,11 @@ describe('useQuery', () => { function Page() { const query = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - throw `fetching error ${count}` - }, + queryFn: () => + sleep(10).then(() => { + count++ + throw `fetching error ${count}` + }), retry: 3, retryDelay: 1, })) @@ -3112,15 +3112,15 @@ describe('useQuery', () => { const query = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - if (counter < 2) { - counter++ - throw new Error('error') - } else { - return 'data' - } - }, + queryFn: () => + sleep(10).then(() => { + if (counter < 2) { + counter++ + throw new Error('error') + } else { + return 'data' + } + }), retryDelay: 10, })) @@ -3162,11 +3162,11 @@ describe('useQuery', () => { const query = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), enabled: enabled(), })) @@ -4322,11 +4322,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, })) @@ -4393,11 +4393,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return count + }), staleTime: Infinity, enabled: false, notifyOnChangeProps: 'all', @@ -4681,14 +4681,14 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - if (count === 0) { - count++ - throw error - } - return 5 - }, + queryFn: () => + sleep(10).then(() => { + if (count === 0) { + count++ + throw error + } + return 5 + }), retry: false, })) @@ -4802,11 +4802,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return 'data' + count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data' + count + }), })) return ( @@ -4874,11 +4874,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return 'data' + count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data' + count + }), })) return ( @@ -4925,11 +4925,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return 'data' + count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data' + count + }), })) return ( @@ -4971,11 +4971,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return 'data' + count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data' + count + }), initialData: 'initial', })) @@ -5020,11 +5020,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return 'data' + count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data' + count + }), initialData: 'initial', })) @@ -5085,11 +5085,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - throw new Error('failed' + count) - }, + queryFn: () => + sleep(10).then(() => { + count++ + throw new Error('failed' + count) + }), retry: 2, retryDelay: 10, })) @@ -5273,11 +5273,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return 'data' + count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data' + count + }), refetchOnReconnect: false, })) @@ -5400,11 +5400,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - return 'data ' + count - }, + queryFn: () => + sleep(10).then(() => { + count++ + return 'data ' + count + }), networkMode: 'always', })) @@ -5438,11 +5438,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - throw new Error('error ' + count) - }, + queryFn: () => + sleep(10).then(() => { + count++ + throw new Error('error ' + count) + }), networkMode: 'always', retry: 1, retryDelay: 5, @@ -5488,11 +5488,11 @@ describe('useQuery', () => { function Page() { const state = useQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - count++ - throw new Error('failed' + count) - }, + queryFn: () => + sleep(10).then(() => { + count++ + throw new Error('failed' + count) + }), retry: 2, retryDelay: 1, networkMode: 'offlineFirst', From 0a612ec66280c69f0c00427fba3d179289ca6036 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 20 Jul 2026 19:39:36 +0900 Subject: [PATCH 74/97] test(angular-query-persist-client): use the '.then()' convention consistently (#11088) --- .../src/__tests__/with-persist-query-client.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts b/packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts index 1f9bd61419a..dd8e52ce137 100644 --- a/packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts +++ b/packages/angular-query-persist-client/src/__tests__/with-persist-query-client.test.ts @@ -279,11 +279,11 @@ describe('withPersistQueryClient', () => { class Page { state = injectQuery(() => ({ queryKey: key, - queryFn: async () => { - await sleep(10) - fetched = true - return 'fetched' - }, + queryFn: () => + sleep(10).then(() => { + fetched = true + return 'fetched' + }), staleTime: Infinity, })) From 7e3c822a10896f41a8f1031c16b85096277af677 Mon Sep 17 00:00:00 2001 From: James Garbutt <43081j@users.noreply.github.com> Date: Mon, 20 Jul 2026 12:36:12 +0100 Subject: [PATCH 75/97] perf: special case arrays in partialMatchKey (#11084) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This does 2 things: 1. If the values being compared are both arrays, iterate through them directly 2. Use a `for...of` instead of allocating an arrow function per recursive call The results: | Task name | Latency avg (ns) | Latency med (ns) | Throughput avg (ops/s) | Throughput med (ops/s) | Samples | | -- | -- | -- | -- | -- | -- | | 'partialMatchKey dev' | '38.21 ± 0.16%' | '42.00 ± 0.00' | '24035274 ± 0.00%' | '23809524 ± 1' | 13086480 | | 'partialMatchKey prod' | '102.05 ± 0.52%' | '84.00 ± 1.00' | '10289814 ± 0.02%' | '11904762 ± 143431' | 4899508 | Co-authored-by: Dominik Dorfmeister 🔮 --- .changeset/humble-tips-try.md | 5 +++++ packages/query-core/src/utils.ts | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .changeset/humble-tips-try.md diff --git a/.changeset/humble-tips-try.md b/.changeset/humble-tips-try.md new file mode 100644 index 00000000000..ecc28ea0aaa --- /dev/null +++ b/.changeset/humble-tips-try.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-core': patch +--- + +Improve `partialMatchKey` performance in query-core. diff --git a/packages/query-core/src/utils.ts b/packages/query-core/src/utils.ts index b97b2cc5a33..f442ab86fdc 100644 --- a/packages/query-core/src/utils.ts +++ b/packages/query-core/src/utils.ts @@ -256,7 +256,22 @@ export function partialMatchKey(a: any, b: any): boolean { } if (a && b && typeof a === 'object' && typeof b === 'object') { - return Object.keys(b).every((key) => partialMatchKey(a[key], b[key])) + if (Array.isArray(a) && Array.isArray(b)) { + for (let i = 0; i < b.length; i++) { + if (!partialMatchKey(a[i], b[i])) { + return false + } + } + return true + } + + const bKeys = Object.keys(b) + for (const key of bKeys) { + if (!partialMatchKey(a[key], b[key])) { + return false + } + } + return true } return false From 181ea826cb5b5f722a774525046d8f4e105dd6bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2026 14:01:04 +0200 Subject: [PATCH 76/97] ci: Version Packages (#11089) ci: changeset release Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/humble-tips-try.md | 5 - examples/angular/auto-refetching/package.json | 2 +- examples/angular/basic-persister/package.json | 6 +- examples/angular/basic/package.json | 2 +- examples/angular/devtools-panel/package.json | 2 +- .../package.json | 2 +- .../angular/optimistic-updates/package.json | 2 +- examples/angular/pagination/package.json | 2 +- .../query-options-from-a-service/package.json | 2 +- examples/angular/router/package.json | 2 +- examples/angular/rxjs/package.json | 2 +- examples/angular/simple/package.json | 2 +- examples/lit/basic/package.json | 4 +- examples/lit/pagination/package.json | 4 +- examples/lit/ssr/package.json | 4 +- examples/preact/simple/package.json | 2 +- examples/react/algolia/package.json | 6 +- examples/react/auto-refetching/package.json | 4 +- .../react/basic-graphql-request/package.json | 4 +- examples/react/basic/package.json | 10 +- examples/react/chat/package.json | 4 +- .../react/default-query-function/package.json | 4 +- examples/react/devtools-panel/package.json | 4 +- examples/react/eslint-legacy/package.json | 10 +- .../react/eslint-plugin-demo/package.json | 4 +- .../package.json | 4 +- .../load-more-infinite-scroll/package.json | 4 +- .../react/nextjs-app-prefetching/package.json | 4 +- .../nextjs-suspense-streaming/package.json | 6 +- examples/react/nextjs/package.json | 4 +- examples/react/offline/package.json | 8 +- .../optimistic-updates-cache/package.json | 4 +- .../react/optimistic-updates-ui/package.json | 4 +- examples/react/pagination/package.json | 4 +- examples/react/playground/package.json | 4 +- examples/react/prefetching/package.json | 4 +- examples/react/react-native/package.json | 4 +- examples/react/react-router/package.json | 4 +- examples/react/rick-morty/package.json | 4 +- examples/react/shadow-dom/package.json | 4 +- examples/react/simple/package.json | 4 +- examples/react/star-wars/package.json | 4 +- examples/react/suspense/package.json | 4 +- examples/solid/astro/package.json | 4 +- .../solid/basic-graphql-request/package.json | 4 +- examples/solid/basic/package.json | 4 +- .../solid/default-query-function/package.json | 4 +- examples/solid/offline/package.json | 8 +- examples/solid/simple/package.json | 6 +- .../solid/solid-start-streaming/package.json | 4 +- examples/svelte/auto-refetching/package.json | 4 +- examples/svelte/basic/package.json | 8 +- .../load-more-infinite-scroll/package.json | 4 +- .../svelte/optimistic-updates/package.json | 4 +- examples/svelte/playground/package.json | 4 +- examples/svelte/simple/package.json | 4 +- examples/svelte/ssr/package.json | 4 +- examples/svelte/star-wars/package.json | 4 +- examples/vue/basic/package.json | 4 +- examples/vue/dependent-queries/package.json | 2 +- examples/vue/persister/package.json | 8 +- examples/vue/simple/package.json | 4 +- integrations/angular-cli-20/package.json | 2 +- .../angular-query-experimental/CHANGELOG.md | 7 + .../angular-query-experimental/package.json | 2 +- .../angular-query-persist-client/CHANGELOG.md | 8 + .../angular-query-persist-client/package.json | 2 +- packages/eslint-plugin-query/CHANGELOG.md | 2 + packages/eslint-plugin-query/package.json | 2 +- packages/lit-query/CHANGELOG.md | 7 + packages/lit-query/package.json | 2 +- packages/preact-query-devtools/CHANGELOG.md | 8 + packages/preact-query-devtools/package.json | 2 +- .../preact-query-persist-client/CHANGELOG.md | 8 + .../preact-query-persist-client/package.json | 2 +- packages/preact-query/CHANGELOG.md | 7 + packages/preact-query/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- packages/query-core/CHANGELOG.md | 6 + packages/query-core/package.json | 2 +- packages/query-devtools/CHANGELOG.md | 2 + packages/query-devtools/package.json | 2 +- .../query-persist-client-core/CHANGELOG.md | 7 + .../query-persist-client-core/package.json | 2 +- .../query-sync-storage-persister/CHANGELOG.md | 8 + .../query-sync-storage-persister/package.json | 2 +- packages/react-query-devtools/CHANGELOG.md | 8 + packages/react-query-devtools/package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- .../react-query-persist-client/CHANGELOG.md | 8 + .../react-query-persist-client/package.json | 2 +- packages/react-query/CHANGELOG.md | 7 + packages/react-query/package.json | 2 +- packages/solid-query-devtools/CHANGELOG.md | 8 + packages/solid-query-devtools/package.json | 2 +- .../solid-query-persist-client/CHANGELOG.md | 8 + .../solid-query-persist-client/package.json | 2 +- packages/solid-query/CHANGELOG.md | 7 + packages/solid-query/package.json | 2 +- packages/svelte-query-devtools/CHANGELOG.md | 8 + packages/svelte-query-devtools/package.json | 2 +- .../svelte-query-persist-client/CHANGELOG.md | 8 + .../svelte-query-persist-client/package.json | 2 +- packages/svelte-query/CHANGELOG.md | 7 + packages/svelte-query/package.json | 2 +- packages/vue-query-devtools/CHANGELOG.md | 8 + packages/vue-query-devtools/package.json | 2 +- packages/vue-query/CHANGELOG.md | 7 + packages/vue-query/package.json | 2 +- pnpm-lock.yaml | 258 +++++++++--------- 114 files changed, 459 insertions(+), 288 deletions(-) delete mode 100644 .changeset/humble-tips-try.md diff --git a/.changeset/humble-tips-try.md b/.changeset/humble-tips-try.md deleted file mode 100644 index ecc28ea0aaa..00000000000 --- a/.changeset/humble-tips-try.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@tanstack/query-core': patch ---- - -Improve `partialMatchKey` performance in query-core. diff --git a/examples/angular/auto-refetching/package.json b/examples/angular/auto-refetching/package.json index 85e5d27b4f1..ed276030884 100644 --- a/examples/angular/auto-refetching/package.json +++ b/examples/angular/auto-refetching/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/basic-persister/package.json b/examples/angular/basic-persister/package.json index 373be6269ed..2d2b692c0d0 100644 --- a/examples/angular/basic-persister/package.json +++ b/examples/angular/basic-persister/package.json @@ -13,9 +13,9 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", - "@tanstack/angular-query-persist-client": "^5.101.2", - "@tanstack/query-async-storage-persister": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-persist-client": "^5.101.3", + "@tanstack/query-async-storage-persister": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/basic/package.json b/examples/angular/basic/package.json index 479bc2131fe..98d432129f3 100644 --- a/examples/angular/basic/package.json +++ b/examples/angular/basic/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/devtools-panel/package.json b/examples/angular/devtools-panel/package.json index 1fdadcaa718..0252c8a5b12 100644 --- a/examples/angular/devtools-panel/package.json +++ b/examples/angular/devtools-panel/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/infinite-query-with-max-pages/package.json b/examples/angular/infinite-query-with-max-pages/package.json index 9ca2130d3c4..a87f1be4f60 100644 --- a/examples/angular/infinite-query-with-max-pages/package.json +++ b/examples/angular/infinite-query-with-max-pages/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/optimistic-updates/package.json b/examples/angular/optimistic-updates/package.json index 4d5f8705818..7f6e14db6bb 100644 --- a/examples/angular/optimistic-updates/package.json +++ b/examples/angular/optimistic-updates/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/pagination/package.json b/examples/angular/pagination/package.json index b4a73e1a067..087db15110e 100644 --- a/examples/angular/pagination/package.json +++ b/examples/angular/pagination/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/query-options-from-a-service/package.json b/examples/angular/query-options-from-a-service/package.json index 838f25eb77f..0839956666c 100644 --- a/examples/angular/query-options-from-a-service/package.json +++ b/examples/angular/query-options-from-a-service/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/router/package.json b/examples/angular/router/package.json index ca1a96961fc..48666bda121 100644 --- a/examples/angular/router/package.json +++ b/examples/angular/router/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/rxjs/package.json b/examples/angular/rxjs/package.json index 7d33216d42b..7c47a4f3efe 100644 --- a/examples/angular/rxjs/package.json +++ b/examples/angular/rxjs/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/simple/package.json b/examples/angular/simple/package.json index 1c42afd6a51..93a9fbb6f35 100644 --- a/examples/angular/simple/package.json +++ b/examples/angular/simple/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/lit/basic/package.json b/examples/lit/basic/package.json index adab899194c..7f122ed10c9 100644 --- a/examples/lit/basic/package.json +++ b/examples/lit/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/lit-query": "^0.2.9", - "@tanstack/query-core": "^5.101.2", + "@tanstack/lit-query": "^0.2.10", + "@tanstack/query-core": "^5.101.3", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/lit/pagination/package.json b/examples/lit/pagination/package.json index 6ffd899679d..64b67e0b98e 100644 --- a/examples/lit/pagination/package.json +++ b/examples/lit/pagination/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/lit-query": "^0.2.9", - "@tanstack/query-core": "^5.101.2", + "@tanstack/lit-query": "^0.2.10", + "@tanstack/query-core": "^5.101.3", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/lit/ssr/package.json b/examples/lit/ssr/package.json index 95c243e5a06..877206d5406 100644 --- a/examples/lit/ssr/package.json +++ b/examples/lit/ssr/package.json @@ -8,8 +8,8 @@ }, "dependencies": { "@lit-labs/ssr": "^3.3.0", - "@tanstack/lit-query": "^0.2.9", - "@tanstack/query-core": "^5.101.2", + "@tanstack/lit-query": "^0.2.10", + "@tanstack/query-core": "^5.101.3", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/preact/simple/package.json b/examples/preact/simple/package.json index 38212cfcb31..c54d1423e61 100644 --- a/examples/preact/simple/package.json +++ b/examples/preact/simple/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/preact-query": "^5.101.2", + "@tanstack/preact-query": "^5.101.3", "preact": "^10.28.0" }, "devDependencies": { diff --git a/examples/react/algolia/package.json b/examples/react/algolia/package.json index 40775483a47..3eb57d14b0b 100644 --- a/examples/react/algolia/package.json +++ b/examples/react/algolia/package.json @@ -9,13 +9,13 @@ }, "dependencies": { "@algolia/client-search": "5.2.1", - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.2", + "@tanstack/eslint-plugin-query": "^5.101.3", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/auto-refetching/package.json b/examples/react/auto-refetching/package.json index 44b10e61ec0..f0098999ee8 100644 --- a/examples/react/auto-refetching/package.json +++ b/examples/react/auto-refetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/basic-graphql-request/package.json b/examples/react/basic-graphql-request/package.json index e690cbcd55c..e98fb776d00 100644 --- a/examples/react/basic-graphql-request/package.json +++ b/examples/react/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "graphql": "^16.9.0", "graphql-request": "^7.1.2", "react": "^19.0.0", diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index c770923d4fb..9c3e9d5aa8e 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -9,15 +9,15 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.2", - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", - "@tanstack/react-query-persist-client": "^5.101.2", + "@tanstack/query-async-storage-persister": "^5.101.3", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query-persist-client": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.2", + "@tanstack/eslint-plugin-query": "^5.101.3", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/chat/package.json b/examples/react/chat/package.json index efce271877d..5db3f66bbb6 100644 --- a/examples/react/chat/package.json +++ b/examples/react/chat/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/default-query-function/package.json b/examples/react/default-query-function/package.json index 44c48713b9a..ac19496b26a 100644 --- a/examples/react/default-query-function/package.json +++ b/examples/react/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/devtools-panel/package.json b/examples/react/devtools-panel/package.json index 88282ca7685..161d362842a 100644 --- a/examples/react/devtools-panel/package.json +++ b/examples/react/devtools-panel/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "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 a7aa065f523..fa6c30ea003 100644 --- a/examples/react/eslint-legacy/package.json +++ b/examples/react/eslint-legacy/package.json @@ -9,15 +9,15 @@ "test:eslint": "ESLINT_USE_FLAT_CONFIG=false eslint ./src/**/*.tsx" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.2", - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", - "@tanstack/react-query-persist-client": "^5.101.2", + "@tanstack/query-async-storage-persister": "^5.101.3", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query-persist-client": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.2", + "@tanstack/eslint-plugin-query": "^5.101.3", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/eslint-plugin-demo/package.json b/examples/react/eslint-plugin-demo/package.json index 5f49708a92b..f8b744a5397 100644 --- a/examples/react/eslint-plugin-demo/package.json +++ b/examples/react/eslint-plugin-demo/package.json @@ -6,11 +6,11 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", + "@tanstack/react-query": "^5.101.3", "react": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.2", + "@tanstack/eslint-plugin-query": "^5.101.3", "eslint": "^9.39.0", "typescript": "5.8.3", "typescript-eslint": "^8.48.0" diff --git a/examples/react/infinite-query-with-max-pages/package.json b/examples/react/infinite-query-with-max-pages/package.json index cef50087ea0..b9b0012584d 100644 --- a/examples/react/infinite-query-with-max-pages/package.json +++ b/examples/react/infinite-query-with-max-pages/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/load-more-infinite-scroll/package.json b/examples/react/load-more-infinite-scroll/package.json index 1be7838c2b6..1aca51df8c2 100644 --- a/examples/react/load-more-infinite-scroll/package.json +++ b/examples/react/load-more-infinite-scroll/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1", diff --git a/examples/react/nextjs-app-prefetching/package.json b/examples/react/nextjs-app-prefetching/package.json index bb9d965ae20..25402f0c840 100644 --- a/examples/react/nextjs-app-prefetching/package.json +++ b/examples/react/nextjs-app-prefetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/nextjs-suspense-streaming/package.json b/examples/react/nextjs-suspense-streaming/package.json index 127cc2039cc..186bfe02a3d 100644 --- a/examples/react/nextjs-suspense-streaming/package.json +++ b/examples/react/nextjs-suspense-streaming/package.json @@ -8,9 +8,9 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", - "@tanstack/react-query-next-experimental": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query-next-experimental": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/nextjs/package.json b/examples/react/nextjs/package.json index e277a26e473..09f92d4be4c 100644 --- a/examples/react/nextjs/package.json +++ b/examples/react/nextjs/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/offline/package.json b/examples/react/offline/package.json index 50935e8592d..179635f25df 100644 --- a/examples/react/offline/package.json +++ b/examples/react/offline/package.json @@ -8,11 +8,11 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.2", + "@tanstack/query-async-storage-persister": "^5.101.3", "@tanstack/react-location": "^3.7.4", - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", - "@tanstack/react-query-persist-client": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query-persist-client": "^5.101.3", "msw": "^2.6.6", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/optimistic-updates-cache/package.json b/examples/react/optimistic-updates-cache/package.json index f8e47de1d0d..7293c8bf168 100755 --- a/examples/react/optimistic-updates-cache/package.json +++ b/examples/react/optimistic-updates-cache/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/optimistic-updates-ui/package.json b/examples/react/optimistic-updates-ui/package.json index 7e6fc46e50d..eccadc18392 100755 --- a/examples/react/optimistic-updates-ui/package.json +++ b/examples/react/optimistic-updates-ui/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/pagination/package.json b/examples/react/pagination/package.json index 50bbee6a3b6..586b445efbc 100644 --- a/examples/react/pagination/package.json +++ b/examples/react/pagination/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/playground/package.json b/examples/react/playground/package.json index 7f6246eee98..9155066b1ae 100644 --- a/examples/react/playground/package.json +++ b/examples/react/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/prefetching/package.json b/examples/react/prefetching/package.json index 693c41b8637..6449a67c06a 100644 --- a/examples/react/prefetching/package.json +++ b/examples/react/prefetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/react-native/package.json b/examples/react/react-native/package.json index 6c9b2ece29d..24225227e1d 100644 --- a/examples/react/react-native/package.json +++ b/examples/react/react-native/package.json @@ -14,8 +14,8 @@ "@react-native-community/netinfo": "^11.4.1", "@react-navigation/native": "^6.1.18", "@react-navigation/stack": "^6.4.1", - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "expo": "^52.0.11", "expo-constants": "^17.0.3", "expo-status-bar": "^2.0.0", diff --git a/examples/react/react-router/package.json b/examples/react/react-router/package.json index 28a39b48bc6..3b6c41b0343 100644 --- a/examples/react/react-router/package.json +++ b/examples/react/react-router/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "localforage": "^1.10.0", "match-sorter": "^6.3.4", "react": "^19.0.0", diff --git a/examples/react/rick-morty/package.json b/examples/react/rick-morty/package.json index 948ff6efa63..eff5594d1fc 100644 --- a/examples/react/rick-morty/package.json +++ b/examples/react/rick-morty/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^6.25.1", diff --git a/examples/react/shadow-dom/package.json b/examples/react/shadow-dom/package.json index d35e6fd4027..fd36b407675 100644 --- a/examples/react/shadow-dom/package.json +++ b/examples/react/shadow-dom/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/simple/package.json b/examples/react/simple/package.json index 9eab98678aa..3bdc6e31a86 100644 --- a/examples/react/simple/package.json +++ b/examples/react/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/star-wars/package.json b/examples/react/star-wars/package.json index 60a2fea5eef..38e9e5fae20 100644 --- a/examples/react/star-wars/package.json +++ b/examples/react/star-wars/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^6.25.1", diff --git a/examples/react/suspense/package.json b/examples/react/suspense/package.json index a22fccbab75..1c1eba7d2b1 100644 --- a/examples/react/suspense/package.json +++ b/examples/react/suspense/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.2", - "@tanstack/react-query-devtools": "^5.101.2", + "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query-devtools": "^5.101.3", "font-awesome": "^4.7.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/solid/astro/package.json b/examples/solid/astro/package.json index 6b89c2d774f..b72c4b08954 100644 --- a/examples/solid/astro/package.json +++ b/examples/solid/astro/package.json @@ -15,8 +15,8 @@ "@astrojs/solid-js": "^5.0.7", "@astrojs/tailwind": "^6.0.2", "@astrojs/vercel": "^8.1.3", - "@tanstack/solid-query": "^5.101.2", - "@tanstack/solid-query-devtools": "^5.101.2", + "@tanstack/solid-query": "^5.101.3", + "@tanstack/solid-query-devtools": "^5.101.3", "astro": "^5.5.6", "solid-js": "^1.9.7", "tailwindcss": "^3.4.7", diff --git a/examples/solid/basic-graphql-request/package.json b/examples/solid/basic-graphql-request/package.json index e207a0d5530..1f99b468ec2 100644 --- a/examples/solid/basic-graphql-request/package.json +++ b/examples/solid/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.2", - "@tanstack/solid-query-devtools": "^5.101.2", + "@tanstack/solid-query": "^5.101.3", + "@tanstack/solid-query-devtools": "^5.101.3", "graphql": "^16.9.0", "graphql-request": "^7.1.2", "solid-js": "^1.9.7" diff --git a/examples/solid/basic/package.json b/examples/solid/basic/package.json index df3017b9b6b..f6b9e5aa725 100644 --- a/examples/solid/basic/package.json +++ b/examples/solid/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.2", - "@tanstack/solid-query-devtools": "^5.101.2", + "@tanstack/solid-query": "^5.101.3", + "@tanstack/solid-query-devtools": "^5.101.3", "solid-js": "^1.9.7" }, "devDependencies": { diff --git a/examples/solid/default-query-function/package.json b/examples/solid/default-query-function/package.json index 247496adaa5..b464eecea60 100644 --- a/examples/solid/default-query-function/package.json +++ b/examples/solid/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.2", - "@tanstack/solid-query-devtools": "^5.101.2", + "@tanstack/solid-query": "^5.101.3", + "@tanstack/solid-query-devtools": "^5.101.3", "solid-js": "^1.9.7" }, "devDependencies": { diff --git a/examples/solid/offline/package.json b/examples/solid/offline/package.json index 044044358e6..0590661f56f 100644 --- a/examples/solid/offline/package.json +++ b/examples/solid/offline/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.2", - "@tanstack/solid-query": "^5.101.2", - "@tanstack/solid-query-devtools": "^5.101.2", - "@tanstack/solid-query-persist-client": "^5.101.2", + "@tanstack/query-async-storage-persister": "^5.101.3", + "@tanstack/solid-query": "^5.101.3", + "@tanstack/solid-query-devtools": "^5.101.3", + "@tanstack/solid-query-persist-client": "^5.101.3", "msw": "^2.6.6", "solid-js": "^1.9.7" }, diff --git a/examples/solid/simple/package.json b/examples/solid/simple/package.json index 12189e40728..aad485d79c2 100644 --- a/examples/solid/simple/package.json +++ b/examples/solid/simple/package.json @@ -8,12 +8,12 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.2", - "@tanstack/solid-query-devtools": "^5.101.2", + "@tanstack/solid-query": "^5.101.3", + "@tanstack/solid-query-devtools": "^5.101.3", "solid-js": "^1.9.7" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.2", + "@tanstack/eslint-plugin-query": "^5.101.3", "typescript": "5.8.3", "vite": "^6.4.1", "vite-plugin-solid": "^2.11.6" diff --git a/examples/solid/solid-start-streaming/package.json b/examples/solid/solid-start-streaming/package.json index 49d4be45c3d..6dd8720b28b 100644 --- a/examples/solid/solid-start-streaming/package.json +++ b/examples/solid/solid-start-streaming/package.json @@ -12,8 +12,8 @@ "@solidjs/meta": "^0.29.4", "@solidjs/router": "^0.15.3", "@solidjs/start": "^1.1.3", - "@tanstack/solid-query": "^5.101.2", - "@tanstack/solid-query-devtools": "^5.101.2", + "@tanstack/solid-query": "^5.101.3", + "@tanstack/solid-query-devtools": "^5.101.3", "solid-js": "^1.9.7", "vinxi": "^0.5.3" }, diff --git a/examples/svelte/auto-refetching/package.json b/examples/svelte/auto-refetching/package.json index 07a62a721d4..86422258520 100644 --- a/examples/svelte/auto-refetching/package.json +++ b/examples/svelte/auto-refetching/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.36", - "@tanstack/svelte-query-devtools": "^6.1.36" + "@tanstack/svelte-query": "^6.1.37", + "@tanstack/svelte-query-devtools": "^6.1.37" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/basic/package.json b/examples/svelte/basic/package.json index 354ebae6910..70e8633df2a 100644 --- a/examples/svelte/basic/package.json +++ b/examples/svelte/basic/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.2", - "@tanstack/svelte-query": "^6.1.36", - "@tanstack/svelte-query-devtools": "^6.1.36", - "@tanstack/svelte-query-persist-client": "^6.1.36" + "@tanstack/query-async-storage-persister": "^5.101.3", + "@tanstack/svelte-query": "^6.1.37", + "@tanstack/svelte-query-devtools": "^6.1.37", + "@tanstack/svelte-query-persist-client": "^6.1.37" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/load-more-infinite-scroll/package.json b/examples/svelte/load-more-infinite-scroll/package.json index 60da488dfec..3c9b293f7d2 100644 --- a/examples/svelte/load-more-infinite-scroll/package.json +++ b/examples/svelte/load-more-infinite-scroll/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.36", - "@tanstack/svelte-query-devtools": "^6.1.36" + "@tanstack/svelte-query": "^6.1.37", + "@tanstack/svelte-query-devtools": "^6.1.37" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/optimistic-updates/package.json b/examples/svelte/optimistic-updates/package.json index 8f64d775093..f0a5d48270d 100644 --- a/examples/svelte/optimistic-updates/package.json +++ b/examples/svelte/optimistic-updates/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.36", - "@tanstack/svelte-query-devtools": "^6.1.36" + "@tanstack/svelte-query": "^6.1.37", + "@tanstack/svelte-query-devtools": "^6.1.37" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/playground/package.json b/examples/svelte/playground/package.json index 0cae594f43a..18601eaeb92 100644 --- a/examples/svelte/playground/package.json +++ b/examples/svelte/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.36", - "@tanstack/svelte-query-devtools": "^6.1.36" + "@tanstack/svelte-query": "^6.1.37", + "@tanstack/svelte-query-devtools": "^6.1.37" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/simple/package.json b/examples/svelte/simple/package.json index 860f6c15880..11d5c1f7ff2 100644 --- a/examples/svelte/simple/package.json +++ b/examples/svelte/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.36", - "@tanstack/svelte-query-devtools": "^6.1.36" + "@tanstack/svelte-query": "^6.1.37", + "@tanstack/svelte-query-devtools": "^6.1.37" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.1.1", diff --git a/examples/svelte/ssr/package.json b/examples/svelte/ssr/package.json index fb6e3d44a24..bcded8e0b3d 100644 --- a/examples/svelte/ssr/package.json +++ b/examples/svelte/ssr/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.36", - "@tanstack/svelte-query-devtools": "^6.1.36" + "@tanstack/svelte-query": "^6.1.37", + "@tanstack/svelte-query-devtools": "^6.1.37" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/star-wars/package.json b/examples/svelte/star-wars/package.json index 5865ce175a1..a1de688abe6 100644 --- a/examples/svelte/star-wars/package.json +++ b/examples/svelte/star-wars/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.36", - "@tanstack/svelte-query-devtools": "^6.1.36" + "@tanstack/svelte-query": "^6.1.37", + "@tanstack/svelte-query-devtools": "^6.1.37" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/vue/basic/package.json b/examples/vue/basic/package.json index 734ebe85624..a59282eb7ca 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.101.2", - "@tanstack/vue-query-devtools": "^6.1.36", + "@tanstack/vue-query": "^5.101.3", + "@tanstack/vue-query-devtools": "^6.1.37", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/dependent-queries/package.json b/examples/vue/dependent-queries/package.json index 4c868552eef..4a85d6bd2d7 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.101.2", + "@tanstack/vue-query": "^5.101.3", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/persister/package.json b/examples/vue/persister/package.json index a3eb9c2bac8..8cae6c60ab4 100644 --- a/examples/vue/persister/package.json +++ b/examples/vue/persister/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-core": "^5.101.2", - "@tanstack/query-persist-client-core": "^5.101.2", - "@tanstack/query-sync-storage-persister": "^5.101.2", - "@tanstack/vue-query": "^5.101.2", + "@tanstack/query-core": "^5.101.3", + "@tanstack/query-persist-client-core": "^5.101.3", + "@tanstack/query-sync-storage-persister": "^5.101.3", + "@tanstack/vue-query": "^5.101.3", "idb-keyval": "^6.2.1", "vue": "^3.4.27" }, diff --git a/examples/vue/simple/package.json b/examples/vue/simple/package.json index d62674b1d9f..fcceb126969 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.101.2", - "@tanstack/vue-query-devtools": "^6.1.36", + "@tanstack/vue-query": "^5.101.3", + "@tanstack/vue-query-devtools": "^6.1.37", "vue": "^3.4.27" }, "devDependencies": { diff --git a/integrations/angular-cli-20/package.json b/integrations/angular-cli-20/package.json index 02643b9f605..8bcf0976295 100644 --- a/integrations/angular-cli-20/package.json +++ b/integrations/angular-cli-20/package.json @@ -14,7 +14,7 @@ "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.2", + "@tanstack/angular-query-experimental": "^5.101.3", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" diff --git a/packages/angular-query-experimental/CHANGELOG.md b/packages/angular-query-experimental/CHANGELOG.md index cc0fcc7e6b3..b4c4196b699 100644 --- a/packages/angular-query-experimental/CHANGELOG.md +++ b/packages/angular-query-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/angular-query-experimental +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/angular-query-experimental/package.json b/packages/angular-query-experimental/package.json index 3e821d50d8e..68e7d175c5d 100644 --- a/packages/angular-query-experimental/package.json +++ b/packages/angular-query-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/angular-query-experimental", - "version": "5.101.2", + "version": "5.101.3", "description": "Signals for managing, caching and syncing asynchronous and remote data in Angular", "author": "Arnoud de Vries", "license": "MIT", diff --git a/packages/angular-query-persist-client/CHANGELOG.md b/packages/angular-query-persist-client/CHANGELOG.md index acaedcf95ab..31be0ec6d5e 100644 --- a/packages/angular-query-persist-client/CHANGELOG.md +++ b/packages/angular-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/angular-query-persist-client +## 5.101.3 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/angular-query-experimental@5.101.3 + - @tanstack/query-persist-client-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/angular-query-persist-client/package.json b/packages/angular-query-persist-client/package.json index 32a34806fc2..769b7b06d19 100644 --- a/packages/angular-query-persist-client/package.json +++ b/packages/angular-query-persist-client/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/angular-query-persist-client", "private": true, - "version": "5.101.2", + "version": "5.101.3", "description": "Angular bindings to work with persisters in TanStack/angular-query", "author": "Omer Gronich", "license": "MIT", diff --git a/packages/eslint-plugin-query/CHANGELOG.md b/packages/eslint-plugin-query/CHANGELOG.md index fe185c6295f..cb8d40cca6f 100644 --- a/packages/eslint-plugin-query/CHANGELOG.md +++ b/packages/eslint-plugin-query/CHANGELOG.md @@ -1,5 +1,7 @@ # @tanstack/eslint-plugin-query +## 5.101.3 + ## 5.101.2 ## 5.101.1 diff --git a/packages/eslint-plugin-query/package.json b/packages/eslint-plugin-query/package.json index f800b651e8e..9297f8eb372 100644 --- a/packages/eslint-plugin-query/package.json +++ b/packages/eslint-plugin-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/eslint-plugin-query", - "version": "5.101.2", + "version": "5.101.3", "description": "ESLint plugin for TanStack Query", "author": "Eliya Cohen", "license": "MIT", diff --git a/packages/lit-query/CHANGELOG.md b/packages/lit-query/CHANGELOG.md index ac8449efc4b..9c7821ee4b0 100644 --- a/packages/lit-query/CHANGELOG.md +++ b/packages/lit-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/lit-query +## 0.2.10 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 0.2.9 ### Patch Changes diff --git a/packages/lit-query/package.json b/packages/lit-query/package.json index be6d000d83f..b10b86710ea 100644 --- a/packages/lit-query/package.json +++ b/packages/lit-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/lit-query", - "version": "0.2.9", + "version": "0.2.10", "description": "Lit adapter for TanStack Query Core", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query-devtools/CHANGELOG.md b/packages/preact-query-devtools/CHANGELOG.md index 0667e40aba2..5cd0ccd26fc 100644 --- a/packages/preact-query-devtools/CHANGELOG.md +++ b/packages/preact-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/preact-query-devtools +## 5.101.3 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/preact-query@5.101.3 + - @tanstack/query-devtools@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/preact-query-devtools/package.json b/packages/preact-query-devtools/package.json index 2a5ad4b1f18..cac56f0d961 100644 --- a/packages/preact-query-devtools/package.json +++ b/packages/preact-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query-devtools", - "version": "5.101.2", + "version": "5.101.3", "description": "Developer tools to interact with and visualize the TanStack/preact-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query-persist-client/CHANGELOG.md b/packages/preact-query-persist-client/CHANGELOG.md index d46a7a9207e..2fb80cb000b 100644 --- a/packages/preact-query-persist-client/CHANGELOG.md +++ b/packages/preact-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/preact-query-persist-client +## 5.101.3 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/preact-query@5.101.3 + - @tanstack/query-persist-client-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/preact-query-persist-client/package.json b/packages/preact-query-persist-client/package.json index 8b9d3566da3..0525713a6d3 100644 --- a/packages/preact-query-persist-client/package.json +++ b/packages/preact-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query-persist-client", - "version": "5.101.2", + "version": "5.101.3", "description": "Preact bindings to work with persisters in TanStack/preact-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query/CHANGELOG.md b/packages/preact-query/CHANGELOG.md index 9bc6f9616c9..bbdc0b135f6 100644 --- a/packages/preact-query/CHANGELOG.md +++ b/packages/preact-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/preact-query +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/preact-query/package.json b/packages/preact-query/package.json index 196ba9abd63..a0a4d3e5dc2 100644 --- a/packages/preact-query/package.json +++ b/packages/preact-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query", - "version": "5.101.2", + "version": "5.101.3", "description": "Hooks for managing, caching and syncing asynchronous and remote data in preact", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-async-storage-persister/CHANGELOG.md b/packages/query-async-storage-persister/CHANGELOG.md index 7cfe2b6bc33..fbe326e00d3 100644 --- a/packages/query-async-storage-persister/CHANGELOG.md +++ b/packages/query-async-storage-persister/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/query-async-storage-persister +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + - @tanstack/query-persist-client-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/query-async-storage-persister/package.json b/packages/query-async-storage-persister/package.json index 2b3b61be821..2adbab5c853 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.101.2", + "version": "5.101.3", "description": "A persister for asynchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-broadcast-client-experimental/CHANGELOG.md b/packages/query-broadcast-client-experimental/CHANGELOG.md index 0d026db527c..d71404fb7b6 100644 --- a/packages/query-broadcast-client-experimental/CHANGELOG.md +++ b/packages/query-broadcast-client-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-broadcast-client-experimental +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/query-broadcast-client-experimental/package.json b/packages/query-broadcast-client-experimental/package.json index 7a16c3a60f4..591ca50e287 100644 --- a/packages/query-broadcast-client-experimental/package.json +++ b/packages/query-broadcast-client-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-broadcast-client-experimental", - "version": "5.101.2", + "version": "5.101.3", "description": "An experimental plugin to for broadcasting the state of your queryClient between browser tabs/windows", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-core/CHANGELOG.md b/packages/query-core/CHANGELOG.md index 0c68f25507d..0fe32ccfc63 100644 --- a/packages/query-core/CHANGELOG.md +++ b/packages/query-core/CHANGELOG.md @@ -1,5 +1,11 @@ # @tanstack/query-core +## 5.101.3 + +### Patch Changes + +- [#11084](https://github.com/TanStack/query/pull/11084) [`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677) - Improve `partialMatchKey` performance in query-core. + ## 5.101.2 ## 5.101.1 diff --git a/packages/query-core/package.json b/packages/query-core/package.json index 1caa2e7109b..bfc460a1142 100644 --- a/packages/query-core/package.json +++ b/packages/query-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-core", - "version": "5.101.2", + "version": "5.101.3", "description": "The framework agnostic core that powers TanStack Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-devtools/CHANGELOG.md b/packages/query-devtools/CHANGELOG.md index 228a4d21cee..f2d9f9f84f5 100644 --- a/packages/query-devtools/CHANGELOG.md +++ b/packages/query-devtools/CHANGELOG.md @@ -1,5 +1,7 @@ # @tanstack/query-devtools +## 5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/query-devtools/package.json b/packages/query-devtools/package.json index 11d797c4c4a..e7267f1ea41 100644 --- a/packages/query-devtools/package.json +++ b/packages/query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-devtools", - "version": "5.101.2", + "version": "5.101.3", "description": "Developer tools to interact with and visualize the TanStack Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-persist-client-core/CHANGELOG.md b/packages/query-persist-client-core/CHANGELOG.md index 7e903a90f58..15f4246ccef 100644 --- a/packages/query-persist-client-core/CHANGELOG.md +++ b/packages/query-persist-client-core/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-persist-client-core +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/query-persist-client-core/package.json b/packages/query-persist-client-core/package.json index 21cfd562cf5..cab19031cdd 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.101.2", + "version": "5.101.3", "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-sync-storage-persister/CHANGELOG.md b/packages/query-sync-storage-persister/CHANGELOG.md index 9c395606756..bb454d00841 100644 --- a/packages/query-sync-storage-persister/CHANGELOG.md +++ b/packages/query-sync-storage-persister/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/query-sync-storage-persister +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + - @tanstack/query-persist-client-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/query-sync-storage-persister/package.json b/packages/query-sync-storage-persister/package.json index 67611996553..068e46ef287 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.101.2", + "version": "5.101.3", "description": "A persister for synchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-devtools/CHANGELOG.md b/packages/react-query-devtools/CHANGELOG.md index 32d2fe2f940..86325eb3fb5 100644 --- a/packages/react-query-devtools/CHANGELOG.md +++ b/packages/react-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/react-query-devtools +## 5.101.3 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.3 + - @tanstack/react-query@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/react-query-devtools/package.json b/packages/react-query-devtools/package.json index 236ce6f68dd..cc5c55ef4a6 100644 --- a/packages/react-query-devtools/package.json +++ b/packages/react-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-devtools", - "version": "5.101.2", + "version": "5.101.3", "description": "Developer tools to interact with and visualize the TanStack/react-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-next-experimental/CHANGELOG.md b/packages/react-query-next-experimental/CHANGELOG.md index e1f28ee00d5..5f9abf819d5 100644 --- a/packages/react-query-next-experimental/CHANGELOG.md +++ b/packages/react-query-next-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-query-next-experimental +## 5.101.3 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/react-query@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/react-query-next-experimental/package.json b/packages/react-query-next-experimental/package.json index 3313aea2543..a9a43aec1de 100644 --- a/packages/react-query-next-experimental/package.json +++ b/packages/react-query-next-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-next-experimental", - "version": "5.101.2", + "version": "5.101.3", "description": "Hydration utils for React Query in the NextJs app directory", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-persist-client/CHANGELOG.md b/packages/react-query-persist-client/CHANGELOG.md index d3be6460512..a53ca926642 100644 --- a/packages/react-query-persist-client/CHANGELOG.md +++ b/packages/react-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/react-query-persist-client +## 5.101.3 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.3 + - @tanstack/react-query@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/react-query-persist-client/package.json b/packages/react-query-persist-client/package.json index c4161d9964a..3c577a2242c 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.101.2", + "version": "5.101.3", "description": "React bindings to work with persisters in TanStack/react-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query/CHANGELOG.md b/packages/react-query/CHANGELOG.md index c6018cf7e50..ce4e80c2bde 100644 --- a/packages/react-query/CHANGELOG.md +++ b/packages/react-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-query +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/react-query/package.json b/packages/react-query/package.json index b658013fd4f..1ca69cd22b8 100644 --- a/packages/react-query/package.json +++ b/packages/react-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query", - "version": "5.101.2", + "version": "5.101.3", "description": "Hooks for managing, caching and syncing asynchronous and remote data in React", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-devtools/CHANGELOG.md b/packages/solid-query-devtools/CHANGELOG.md index 2832067d8b8..692272e9adb 100644 --- a/packages/solid-query-devtools/CHANGELOG.md +++ b/packages/solid-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/solid-query-devtools +## 5.101.3 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.3 + - @tanstack/solid-query@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/solid-query-devtools/package.json b/packages/solid-query-devtools/package.json index 32ab1e98c1f..fa5eff6fef9 100644 --- a/packages/solid-query-devtools/package.json +++ b/packages/solid-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query-devtools", - "version": "5.101.2", + "version": "5.101.3", "description": "Developer tools to interact with and visualize the TanStack/solid-query Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-persist-client/CHANGELOG.md b/packages/solid-query-persist-client/CHANGELOG.md index 5cdb939e784..800aa5e566e 100644 --- a/packages/solid-query-persist-client/CHANGELOG.md +++ b/packages/solid-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/solid-query-persist-client +## 5.101.3 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.3 + - @tanstack/solid-query@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/solid-query-persist-client/package.json b/packages/solid-query-persist-client/package.json index a070313dc4a..a9354fe4ea7 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.101.2", + "version": "5.101.3", "description": "Solid.js bindings to work with persisters in TanStack/solid-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query/CHANGELOG.md b/packages/solid-query/CHANGELOG.md index 4b2185513f5..b18ec755ce4 100644 --- a/packages/solid-query/CHANGELOG.md +++ b/packages/solid-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/solid-query +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/solid-query/package.json b/packages/solid-query/package.json index 1353fad46de..95f1c258094 100644 --- a/packages/solid-query/package.json +++ b/packages/solid-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query", - "version": "5.101.2", + "version": "5.101.3", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/svelte-query-devtools/CHANGELOG.md b/packages/svelte-query-devtools/CHANGELOG.md index c79d8ad3d17..cbe2a7bc378 100644 --- a/packages/svelte-query-devtools/CHANGELOG.md +++ b/packages/svelte-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/svelte-query-devtools +## 6.1.37 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.3 + - @tanstack/svelte-query@6.1.37 + ## 6.1.36 ### Patch Changes diff --git a/packages/svelte-query-devtools/package.json b/packages/svelte-query-devtools/package.json index c5a80fe21f8..e10470cd940 100644 --- a/packages/svelte-query-devtools/package.json +++ b/packages/svelte-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query-devtools", - "version": "6.1.36", + "version": "6.1.37", "description": "Developer tools to interact with and visualize the TanStack/svelte-query cache", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query-persist-client/CHANGELOG.md b/packages/svelte-query-persist-client/CHANGELOG.md index 7da360e9ded..06ac7c1d2dc 100644 --- a/packages/svelte-query-persist-client/CHANGELOG.md +++ b/packages/svelte-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/svelte-query-persist-client +## 6.1.37 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.3 + - @tanstack/svelte-query@6.1.37 + ## 6.1.36 ### Patch Changes diff --git a/packages/svelte-query-persist-client/package.json b/packages/svelte-query-persist-client/package.json index c6e635978bc..ca3568ccf2d 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": "6.1.36", + "version": "6.1.37", "description": "Svelte bindings to work with persisters in TanStack/svelte-query", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query/CHANGELOG.md b/packages/svelte-query/CHANGELOG.md index cb677a322c1..df317e88cb5 100644 --- a/packages/svelte-query/CHANGELOG.md +++ b/packages/svelte-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/svelte-query +## 6.1.37 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 6.1.36 ### Patch Changes diff --git a/packages/svelte-query/package.json b/packages/svelte-query/package.json index ea8ff898676..2850929c428 100644 --- a/packages/svelte-query/package.json +++ b/packages/svelte-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query", - "version": "6.1.36", + "version": "6.1.37", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/vue-query-devtools/CHANGELOG.md b/packages/vue-query-devtools/CHANGELOG.md index c80e8d9e95e..6e24148f194 100644 --- a/packages/vue-query-devtools/CHANGELOG.md +++ b/packages/vue-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/vue-query-devtools +## 6.1.37 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.3 + - @tanstack/vue-query@5.101.3 + ## 6.1.36 ### Patch Changes diff --git a/packages/vue-query-devtools/package.json b/packages/vue-query-devtools/package.json index 925238437d5..eeee320e949 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": "6.1.36", + "version": "6.1.37", "description": "Developer tools to interact with and visualize the TanStack/vue-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/vue-query/CHANGELOG.md b/packages/vue-query/CHANGELOG.md index d1da46bb785..a92e1446db3 100644 --- a/packages/vue-query/CHANGELOG.md +++ b/packages/vue-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/vue-query +## 5.101.3 + +### Patch Changes + +- Updated dependencies [[`7e3c822`](https://github.com/TanStack/query/commit/7e3c822a10896f41a8f1031c16b85096277af677)]: + - @tanstack/query-core@5.101.3 + ## 5.101.2 ### Patch Changes diff --git a/packages/vue-query/package.json b/packages/vue-query/package.json index 41fdc082c8e..dc320bd8fc9 100644 --- a/packages/vue-query/package.json +++ b/packages/vue-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-query", - "version": "5.101.2", + "version": "5.101.3", "description": "Hooks for managing, caching and syncing asynchronous and remote data in Vue", "author": "Damian Osipiuk", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24698d4fd93..fe228fef162 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,7 +170,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -210,7 +210,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -250,13 +250,13 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental '@tanstack/angular-query-persist-client': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-persist-client '@tanstack/query-async-storage-persister': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-async-storage-persister rxjs: specifier: ^7.8.2 @@ -299,7 +299,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -339,7 +339,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -382,7 +382,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -422,7 +422,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -465,7 +465,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -508,7 +508,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -551,7 +551,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -591,7 +591,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -619,10 +619,10 @@ importers: examples/lit/basic: dependencies: '@tanstack/lit-query': - specifier: ^0.2.9 + specifier: ^0.2.10 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -638,10 +638,10 @@ importers: examples/lit/pagination: dependencies: '@tanstack/lit-query': - specifier: ^0.2.9 + specifier: ^0.2.10 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -660,10 +660,10 @@ importers: specifier: ^3.3.0 version: 3.3.1 '@tanstack/lit-query': - specifier: ^0.2.9 + specifier: ^0.2.10 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -685,7 +685,7 @@ importers: examples/preact/simple: dependencies: '@tanstack/preact-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/preact-query preact: specifier: ^10.28.0 @@ -713,10 +713,10 @@ importers: specifier: 5.2.1 version: 5.2.1 '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -726,7 +726,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -747,10 +747,10 @@ importers: examples/react/auto-refetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -775,16 +775,16 @@ importers: examples/react/basic: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-async-storage-persister '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-persist-client react: specifier: ^19.0.0 @@ -794,7 +794,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -815,10 +815,10 @@ importers: examples/react/basic-graphql-request: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools graphql: specifier: ^16.9.0 @@ -843,10 +843,10 @@ importers: examples/react/chat: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -874,10 +874,10 @@ importers: examples/react/default-query-function: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -899,10 +899,10 @@ importers: examples/react/devtools-panel: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -924,16 +924,16 @@ importers: examples/react/eslint-legacy: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-async-storage-persister '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-persist-client react: specifier: ^19.0.0 @@ -943,7 +943,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -964,14 +964,14 @@ importers: examples/react/eslint-plugin-demo: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query react: specifier: ^19.0.0 version: 19.2.4 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/eslint-plugin-query eslint: specifier: ^9.39.0 @@ -986,10 +986,10 @@ importers: examples/react/infinite-query-with-max-pages: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1014,10 +1014,10 @@ importers: examples/react/load-more-infinite-scroll: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1045,10 +1045,10 @@ importers: examples/react/nextjs: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1073,10 +1073,10 @@ importers: examples/react/nextjs-app-prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1101,13 +1101,13 @@ importers: examples/react/nextjs-suspense-streaming: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools '@tanstack/react-query-next-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-next-experimental next: specifier: ^16.0.7 @@ -1132,19 +1132,19 @@ importers: examples/react/offline: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-async-storage-persister '@tanstack/react-location': specifier: ^3.7.4 version: 3.7.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-persist-client msw: specifier: ^2.6.6 @@ -1172,10 +1172,10 @@ importers: examples/react/optimistic-updates-cache: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1200,10 +1200,10 @@ importers: examples/react/optimistic-updates-ui: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1228,10 +1228,10 @@ importers: examples/react/pagination: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1256,10 +1256,10 @@ importers: examples/react/playground: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1281,10 +1281,10 @@ importers: examples/react/prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1318,10 +1318,10 @@ importers: specifier: ^6.4.1 version: 6.4.1(@react-navigation/native@6.1.18(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-gesture-handler@2.30.1(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@4.14.1(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools expo: specifier: ^52.0.11 @@ -1370,10 +1370,10 @@ importers: examples/react/react-router: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools localforage: specifier: ^1.10.0 @@ -1422,10 +1422,10 @@ importers: examples/react/rick-morty: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1459,10 +1459,10 @@ importers: examples/react/shadow-dom: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1490,10 +1490,10 @@ importers: examples/react/simple: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1515,10 +1515,10 @@ importers: examples/react/star-wars: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1552,10 +1552,10 @@ importers: examples/react/suspense: dependencies: '@tanstack/react-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/react-query-devtools font-awesome: specifier: ^4.7.0 @@ -1598,10 +1598,10 @@ importers: specifier: ^8.1.3 version: 8.2.11(@sveltejs/kit@2.57.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.1)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.55.1)(typescript@5.8.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(astro@5.18.1(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@1.21.7)(lightningcss@1.32.0)(rollup@4.60.1)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.8.3)(yaml@2.8.3))(next@16.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.90.0))(react@19.2.4)(rollup@4.60.1)(svelte@5.55.1)(vue@3.5.31(typescript@5.8.3)) '@tanstack/solid-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query-devtools astro: specifier: ^5.5.6 @@ -1619,10 +1619,10 @@ importers: examples/solid/basic: dependencies: '@tanstack/solid-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1641,10 +1641,10 @@ importers: examples/solid/basic-graphql-request: dependencies: '@tanstack/solid-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query-devtools graphql: specifier: ^16.9.0 @@ -1669,10 +1669,10 @@ importers: examples/solid/default-query-function: dependencies: '@tanstack/solid-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1691,16 +1691,16 @@ importers: examples/solid/offline: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-async-storage-persister '@tanstack/solid-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query-devtools '@tanstack/solid-query-persist-client': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query-persist-client msw: specifier: ^2.6.6 @@ -1722,17 +1722,17 @@ importers: examples/solid/simple: dependencies: '@tanstack/solid-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 version: 1.9.12 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/eslint-plugin-query typescript: specifier: 5.8.3 @@ -1756,10 +1756,10 @@ importers: specifier: ^1.1.3 version: 1.3.2(@testing-library/jest-dom@6.9.1)(solid-js@1.9.12)(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/solid-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1771,10 +1771,10 @@ importers: examples/svelte/auto-refetching: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1802,16 +1802,16 @@ importers: examples/svelte/basic: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-async-storage-persister '@tanstack/svelte-query': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-devtools '@tanstack/svelte-query-persist-client': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-persist-client devDependencies: '@sveltejs/adapter-auto': @@ -1839,10 +1839,10 @@ importers: examples/svelte/load-more-infinite-scroll: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1870,10 +1870,10 @@ importers: examples/svelte/optimistic-updates: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1901,10 +1901,10 @@ importers: examples/svelte/playground: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1932,10 +1932,10 @@ importers: examples/svelte/simple: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/vite-plugin-svelte': @@ -1960,10 +1960,10 @@ importers: examples/svelte/ssr: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1991,10 +1991,10 @@ importers: examples/svelte/star-wars: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -2028,10 +2028,10 @@ importers: examples/vue/basic: dependencies: '@tanstack/vue-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.4.27 @@ -2050,7 +2050,7 @@ importers: examples/vue/dependent-queries: dependencies: '@tanstack/vue-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/vue-query vue: specifier: ^3.4.27 @@ -2069,16 +2069,16 @@ importers: examples/vue/persister: dependencies: '@tanstack/query-core': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-core '@tanstack/query-persist-client-core': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-persist-client-core '@tanstack/query-sync-storage-persister': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/query-sync-storage-persister '@tanstack/vue-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/vue-query idb-keyval: specifier: ^6.2.1 @@ -2100,10 +2100,10 @@ importers: examples/vue/simple: dependencies: '@tanstack/vue-query': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^6.1.36 + specifier: ^6.1.37 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.4.27 @@ -2140,7 +2140,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.2 + specifier: ^5.101.3 version: link:../../packages/angular-query-experimental rxjs: specifier: ~7.8.0 From 7ac45ed45cbc28a54ac2fcfb1faccfcd87fb7b75 Mon Sep 17 00:00:00 2001 From: Eliya Cohen Date: Tue, 21 Jul 2026 15:50:23 +0300 Subject: [PATCH 77/97] fix(eslint-plugin-query): ignore call targets in exhaustive-deps (#11067) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(query-eslint): ignore call targets in exhaustive deps * fix(query-eslint): guard AST parent access * fix(query-eslint): accept JSX scope references --------- Co-authored-by: Dominik Dorfmeister 🔮 --- .changeset/soft-pianos-sip.md | 5 + docs/eslint/exhaustive-deps.md | 28 +- .../src/__tests__/ast-utils.test.ts | 53 +++ .../src/__tests__/exhaustive-deps.test.ts | 322 ++++++++---------- .../exhaustive-deps/exhaustive-deps.utils.ts | 19 +- .../src/utils/ast-utils.ts | 35 +- 6 files changed, 245 insertions(+), 217 deletions(-) create mode 100644 .changeset/soft-pianos-sip.md create mode 100644 packages/eslint-plugin-query/src/__tests__/ast-utils.test.ts diff --git a/.changeset/soft-pianos-sip.md b/.changeset/soft-pianos-sip.md new file mode 100644 index 00000000000..9bf92af6af6 --- /dev/null +++ b/.changeset/soft-pianos-sip.md @@ -0,0 +1,5 @@ +--- +'@tanstack/eslint-plugin-query': patch +--- + +Relax `exhaustive-deps` so function call targets are not required in query keys while values referenced in nested callbacks are still checked. diff --git a/docs/eslint/exhaustive-deps.md b/docs/eslint/exhaustive-deps.md index 3fa56f1a54f..6f6e8725bea 100644 --- a/docs/eslint/exhaustive-deps.md +++ b/docs/eslint/exhaustive-deps.md @@ -3,8 +3,10 @@ id: exhaustive-deps title: Exhaustive dependencies for query keys --- -Query keys should be seen like a dependency array to your query function: Every variable that is used inside the queryFn should be added to the query key. -This makes sure that queries are cached independently and that queries are refetched automatically when the variables changes. +Query keys should contain the serializable values that identify the data returned by your queryFn. +This makes sure that queries are cached independently and that queries are refetched automatically when those values change. + +Function call targets are not query key dependencies. For example, `fetchTodoById(todoId)` needs `todoId` in the query key, but not `fetchTodoById`. Values referenced inside nested callbacks are still dependencies, so `promise.then(() => todoId)` also needs `todoId` in the query key. ## Rule Details @@ -29,7 +31,7 @@ Examples of **correct** code for this rule: const Component = ({ todoId }) => { const todos = useTodos() useQuery({ - queryKey: ['todo', todos, todoId], + queryKey: ['todo', todoId], queryFn: () => todos.getTodo(todoId), }) } @@ -46,24 +48,12 @@ const todoQueries = { ``` ```tsx -// with { allowlist: { variables: ["todos"] }} -const Component = ({ todoId }) => { - const todos = useTodos() - useQuery({ - queryKey: ['todo', todoId], - queryFn: () => todos.getTodo(todoId), - }) -} -``` - -```tsx -// with { allowlist: { types: ["TodosClient"] }} -class TodosClient { ... } -const Component = ({ todoId }) => { - const todos: TodosClient = new TodosClient() +// with { allowlist: { types: ["Config"] }} +class Config { ... } +const Component = ({ todoId, config }: { todoId: string, config: Config }) => { useQuery({ queryKey: ['todo', todoId], - queryFn: () => todos.getTodo(todoId), + queryFn: () => fetchTodo(todoId, config.baseUrl), }) } ``` diff --git a/packages/eslint-plugin-query/src/__tests__/ast-utils.test.ts b/packages/eslint-plugin-query/src/__tests__/ast-utils.test.ts new file mode 100644 index 00000000000..63f4fdbd47e --- /dev/null +++ b/packages/eslint-plugin-query/src/__tests__/ast-utils.test.ts @@ -0,0 +1,53 @@ +import { AST_NODE_TYPES } from '@typescript-eslint/utils' +import { describe, expect, it } from 'vitest' +import { ExhaustiveDepsUtils } from '../rules/exhaustive-deps/exhaustive-deps.utils' +import { ASTUtils } from '../utils/ast-utils' +import type { TSESLint, TSESTree } from '@typescript-eslint/utils' + +function createIdentifier(name: string): TSESTree.Identifier { + return { type: AST_NODE_TYPES.Identifier, name } as TSESTree.Identifier +} + +describe('ASTUtils', () => { + it('stops member traversal when a node has no parent', () => { + const identifier = createIdentifier('value') + + expect(ASTUtils.traverseUpMemberExpression(identifier)).toBe(identifier) + }) + + it('handles an external reference without a parent', () => { + const operation = createIdentifier('operation') + const reference = { + identifier: operation, + isRead: () => true, + resolved: null, + } as TSESLint.Scope.Reference + const scope = { + childScopes: [], + references: [reference], + set: new Map(), + } as unknown as TSESLint.Scope.Scope + const scopeManager = { + acquire: () => scope, + } as unknown as TSESLint.Scope.ScopeManager + const sourceCode = { + getText: () => 'operation', + } as unknown as Readonly + + expect( + ASTUtils.getExternalRefs({ + scopeManager, + sourceCode, + node: operation, + }), + ).toEqual([reference]) + }) +}) + +describe('ExhaustiveDepsUtils', () => { + it('does not treat a detached identifier as a function call target', () => { + expect( + ExhaustiveDepsUtils.isFunctionCallTarget(createIdentifier('fetchTodos')), + ).toBe(false) + }) +}) diff --git a/packages/eslint-plugin-query/src/__tests__/exhaustive-deps.test.ts b/packages/eslint-plugin-query/src/__tests__/exhaustive-deps.test.ts index 7e67ae85404..23f3492395c 100644 --- a/packages/eslint-plugin-query/src/__tests__/exhaustive-deps.test.ts +++ b/packages/eslint-plugin-query/src/__tests__/exhaustive-deps.test.ts @@ -48,6 +48,43 @@ ruleTester.run('exhaustive-deps', rule, { } `, }, + { + name: 'should not require a component scoped function call target in queryKey', + code: normalizeIndent` + function Component({ todoId }) { + const fetchTodoById = (id) => Promise.resolve(id) + + return useQuery({ + queryKey: ['todos', todoId], + queryFn: () => fetchTodoById(todoId), + }) + } + `, + }, + { + name: 'should not require a method call receiver in queryKey', + code: normalizeIndent` + function Component({ todoId }) { + const todos = useTodos() + + return useQuery({ + queryKey: ['todo', todoId], + queryFn: () => todos.getTodo(todoId), + }) + } + `, + }, + { + name: 'should not require a data method receiver in queryKey', + code: normalizeIndent` + function Component({ items }) { + useQuery({ + queryKey: ['items'], + queryFn: () => items?.map((item) => item.id), + }) + } + `, + }, { name: 'should pass props.src', code: ` @@ -776,6 +813,28 @@ ruleTester.run('exhaustive-deps', rule, { } `, }, + { + name: 'should pass when optional chaining method call receiver is omitted', + code: normalizeIndent` + function useThing(a) { + return useQuery({ + queryKey: ['thing'], + queryFn: () => a?.foo() + }) + } + `, + }, + { + name: 'should pass when non-null assertion method call receiver is omitted', + code: normalizeIndent` + function useThing(a) { + return useQuery({ + queryKey: ['thing'], + queryFn: () => a!.foo() + }) + } + `, + }, { name: 'should pass when queryKey uses TSAsExpression with array', code: normalizeIndent` @@ -881,80 +940,47 @@ ruleTester.run('exhaustive-deps', rule, { `, }, { - name: 'should pass when queryFn is ternary with both branches having deps in queryKey', + name: 'should pass when sibling member method call receivers are omitted', code: normalizeIndent` - function useThing(condition, a, b) { + function useThing(a) { return useQuery({ - queryKey: ['thing', a, b], - queryFn: condition ? () => fetchA(a) : () => fetchB(b) + queryKey: ['thing'], + queryFn: () => { + a.b.foo() + a.c.bar() + return 1 + } }) } `, }, - ], - invalid: [ { - name: 'should fail when optional chaining method call is missing root', + name: 'should pass when nested member method call receiver is omitted', code: normalizeIndent` function useThing(a) { return useQuery({ queryKey: ['thing'], - queryFn: () => a?.foo() + queryFn: () => { + a.b.foo() + return 1 + } }) } `, - errors: [ - { - messageId: 'missingDeps', - data: { deps: 'a' }, - suggestions: [ - { - messageId: 'fixTo', - output: normalizeIndent` - function useThing(a) { - return useQuery({ - queryKey: ['thing', a], - queryFn: () => a?.foo() - }) - } - `, - }, - ], - }, - ], }, { - name: 'should fail when non-null assertion method call is missing root', + name: 'should pass when queryFn is ternary with both branches having deps in queryKey', code: normalizeIndent` - function useThing(a) { + function useThing(condition, a, b) { return useQuery({ - queryKey: ['thing'], - queryFn: () => a!.foo() + queryKey: ['thing', a, b], + queryFn: condition ? () => fetchA(a) : () => fetchB(b) }) } `, - errors: [ - { - messageId: 'missingDeps', - data: { deps: 'a' }, - suggestions: [ - { - messageId: 'fixTo', - output: normalizeIndent` - function useThing(a) { - return useQuery({ - queryKey: ['thing', a], - queryFn: () => a!.foo() - }) - } - `, - }, - ], - }, - ], }, { - name: 'should fail when alias of props used in queryFn is missing in queryKey', + name: 'should not require a nested method call receiver in queryKey', code: normalizeIndent` function Component(props) { const entities = props.entities; @@ -969,26 +995,32 @@ ruleTester.run('exhaustive-deps', rule, { }); } `, + }, + ], + invalid: [ + { + name: 'should fail when a computed method name is missing in queryKey', + code: normalizeIndent` + function Component({ client, operation }) { + useQuery({ + queryKey: ['data'], + queryFn: () => client[operation](), + }) + } + `, errors: [ { messageId: 'missingDeps', - data: { deps: 'entities' }, + data: { deps: 'operation' }, suggestions: [ { messageId: 'fixTo', - data: { result: "['get-stuff', entities]" }, output: normalizeIndent` - function Component(props) { - const entities = props.entities; - - const q = useQuery({ - queryKey: ['get-stuff', entities], - queryFn: () => { - return api.fetchStuff({ - ids: entities.map((o) => o.id) - }); - } - }); + function Component({ client, operation }) { + useQuery({ + queryKey: ['data', operation], + queryFn: () => client[operation](), + }) } `, }, @@ -1631,80 +1663,6 @@ ruleTester.run('exhaustive-deps', rule, { }, ], }, - { - name: 'should fail when sibling member method calls missing one path', - code: normalizeIndent` - function useThing(a) { - return useQuery({ - queryKey: ['thing', a.b], - queryFn: () => { - a.b.foo() - a.c.bar() - return 1 - } - }) - } - `, - errors: [ - { - messageId: 'missingDeps', - data: { deps: 'a.c' }, - suggestions: [ - { - messageId: 'fixTo', - output: normalizeIndent` - function useThing(a) { - return useQuery({ - queryKey: ['thing', a.b, a.c], - queryFn: () => { - a.b.foo() - a.c.bar() - return 1 - } - }) - } - `, - }, - ], - }, - ], - }, - { - name: 'should fail when single member method call missing path and root', - code: normalizeIndent` - function useThing(a) { - return useQuery({ - queryKey: ['thing'], - queryFn: () => { - a.b.foo() - return 1 - } - }) - } - `, - errors: [ - { - messageId: 'missingDeps', - data: { deps: 'a.b' }, - suggestions: [ - { - messageId: 'fixTo', - output: normalizeIndent` - function useThing(a) { - return useQuery({ - queryKey: ['thing', a.b], - queryFn: () => { - a.b.foo() - return 1 - } - }) - } - `, - }, - ], - }, - ], - }, { name: 'should fail when queryKey has TSAsExpression with missing dep', code: normalizeIndent` @@ -1771,27 +1729,27 @@ ruleTester.run('exhaustive-deps', rule, { name: 'should fail when type allowlist is empty', options: [{ allowlist: { types: [] } }], code: normalizeIndent` - interface Api { fetch: () => void } + interface Api { baseUrl: string } function useThing(api: Api) { return useQuery({ queryKey: ['thing'], - queryFn: () => api.fetch() + queryFn: () => api.baseUrl }) } `, errors: [ { messageId: 'missingDeps', - data: { deps: 'api' }, + data: { deps: 'api.baseUrl' }, suggestions: [ { messageId: 'fixTo', output: normalizeIndent` - interface Api { fetch: () => void } + interface Api { baseUrl: string } function useThing(api: Api) { return useQuery({ - queryKey: ['thing', api], - queryFn: () => api.fetch() + queryKey: ['thing', api.baseUrl], + queryFn: () => api.baseUrl }) } `, @@ -1929,13 +1887,12 @@ ruleTester.run('exhaustive-deps allowlist.types', rule, { name: 'should ignore missing member path when root type is in allowlist.types', options: [{ allowlist: { types: ['Svc'] } }], code: normalizeIndent` - interface Svc { part: { load: (id: string) => void } } + interface Svc { part: { baseUrl: string } } function useThing(svc: Svc, id: string) { return useQuery({ queryKey: ['thing', id], queryFn: () => { - svc.part.load(id) - return id + return { baseUrl: svc.part.baseUrl, id } } }) } @@ -2007,13 +1964,12 @@ ruleTester.run('exhaustive-deps allowlist.types', rule, { name: 'should report missing member path when root type not in allowlist.types', options: [{ allowlist: { types: ['Other'] } }], code: normalizeIndent` - interface Svc { part: { load: (id: string) => void } } + interface Svc { part: { baseUrl: string } } function useThing(svc: Svc, id: string) { return useQuery({ queryKey: ['thing', id], queryFn: () => { - svc.part.load(id) - return id + return { baseUrl: svc.part.baseUrl, id } } }) } @@ -2021,18 +1977,17 @@ ruleTester.run('exhaustive-deps allowlist.types', rule, { errors: [ { messageId: 'missingDeps', - data: { deps: 'svc.part' }, + data: { deps: 'svc.part.baseUrl' }, suggestions: [ { messageId: 'fixTo', output: normalizeIndent` - interface Svc { part: { load: (id: string) => void } } + interface Svc { part: { baseUrl: string } } function useThing(svc: Svc, id: string) { return useQuery({ - queryKey: ['thing', id, svc.part], + queryKey: ['thing', id, svc.part.baseUrl], queryFn: () => { - svc.part.load(id) - return id + return { baseUrl: svc.part.baseUrl, id } } }) } @@ -2046,13 +2001,12 @@ ruleTester.run('exhaustive-deps allowlist.types', rule, { name: 'should report missing member path when variable has type annotation but type not allowlisted', options: [{ allowlist: { types: ['AllowedService'] } }], code: normalizeIndent` - interface MyService { method: () => void } + interface MyService { baseUrl: string } function useData(service: MyService) { return useQuery({ queryKey: ['data'], queryFn: () => { - service.method() - return 'data' + return service.baseUrl } }) } @@ -2060,18 +2014,17 @@ ruleTester.run('exhaustive-deps allowlist.types', rule, { errors: [ { messageId: 'missingDeps', - data: { deps: 'service' }, + data: { deps: 'service.baseUrl' }, suggestions: [ { messageId: 'fixTo', output: normalizeIndent` - interface MyService { method: () => void } + interface MyService { baseUrl: string } function useData(service: MyService) { return useQuery({ - queryKey: ['data', service], + queryKey: ['data', service.baseUrl], queryFn: () => { - service.method() - return 'data' + return service.baseUrl } }) } @@ -2085,20 +2038,19 @@ ruleTester.run('exhaustive-deps allowlist.types', rule, { name: 'should not inherit allowlisted type from outer shadowed binding', options: [{ allowlist: { types: ['AllowedService'] } }], code: normalizeIndent` - interface AllowedService { load: () => void } - interface OtherService { load: () => void } + interface AllowedService { baseUrl: string } + interface OtherService { baseUrl: string } function useThing() { - const svc: AllowedService = { load: () => undefined } + const svc: AllowedService = { baseUrl: 'allowed' } if (true) { - const svc: OtherService = { load: () => undefined } + const svc: OtherService = { baseUrl: 'other' } return useQuery({ queryKey: ['thing'], queryFn: () => { - svc.load() - return 'data' + return svc.baseUrl } }) } @@ -2109,25 +2061,24 @@ ruleTester.run('exhaustive-deps allowlist.types', rule, { errors: [ { messageId: 'missingDeps', - data: { deps: 'svc' }, + data: { deps: 'svc.baseUrl' }, suggestions: [ { messageId: 'fixTo', output: normalizeIndent` - interface AllowedService { load: () => void } - interface OtherService { load: () => void } + interface AllowedService { baseUrl: string } + interface OtherService { baseUrl: string } function useThing() { - const svc: AllowedService = { load: () => undefined } + const svc: AllowedService = { baseUrl: 'allowed' } if (true) { - const svc: OtherService = { load: () => undefined } + const svc: OtherService = { baseUrl: 'other' } return useQuery({ - queryKey: ['thing', svc], + queryKey: ['thing', svc.baseUrl], queryFn: () => { - svc.load() - return 'data' + return svc.baseUrl } }) } @@ -2153,8 +2104,7 @@ ruleTester.run('exhaustive-deps allowlist.variables', rule, { return useQuery({ queryKey: ['thing', id], queryFn: () => { - svc.part.load(id) - return id + return { part: svc.part, id } } }) } @@ -2184,9 +2134,7 @@ ruleTester.run('exhaustive-deps allowlist.variables', rule, { return useQuery({ queryKey: ['thing'], queryFn: () => { - svc.part.load() - other.x.run() - return 1 + return { svcPart: svc.part, otherX: other.x } } }) } @@ -2203,9 +2151,7 @@ ruleTester.run('exhaustive-deps allowlist.variables', rule, { return useQuery({ queryKey: ['thing', other.x], queryFn: () => { - svc.part.load() - other.x.run() - return 1 + return { svcPart: svc.part, otherX: other.x } } }) } @@ -2222,8 +2168,7 @@ ruleTester.run('exhaustive-deps allowlist.variables', rule, { return useQuery({ queryKey: ['thing', id], queryFn: () => { - svc.part.load(id) - return id + return { part: svc.part, id } } }) } @@ -2240,8 +2185,7 @@ ruleTester.run('exhaustive-deps allowlist.variables', rule, { return useQuery({ queryKey: ['thing', id, svc.part], queryFn: () => { - svc.part.load(id) - return id + return { part: svc.part, id } } }) } diff --git a/packages/eslint-plugin-query/src/rules/exhaustive-deps/exhaustive-deps.utils.ts b/packages/eslint-plugin-query/src/rules/exhaustive-deps/exhaustive-deps.utils.ts index 135a5b620d1..4f467aa4548 100644 --- a/packages/eslint-plugin-query/src/rules/exhaustive-deps/exhaustive-deps.utils.ts +++ b/packages/eslint-plugin-query/src/rules/exhaustive-deps/exhaustive-deps.utils.ts @@ -55,11 +55,24 @@ export const ExhaustiveDepsUtils = { return ( reference.identifier.name !== 'undefined' && + !ExhaustiveDepsUtils.isFunctionCallTarget(reference.identifier) && reference.identifier.parent.type !== AST_NODE_TYPES.NewExpression && !ExhaustiveDepsUtils.isInstanceOfKind(reference.identifier.parent) ) }, + isFunctionCallTarget( + identifier: TSESTree.Identifier | TSESTree.JSXIdentifier, + ): boolean { + const callee = ASTUtils.traverseUpMemberExpression(identifier) + + return ( + callee.parent !== undefined && + callee.parent.type === AST_NODE_TYPES.CallExpression && + callee.parent.callee === callee + ) + }, + /** * Given required refs and existing queryKey entries, compute missing dependency paths * respecting allowlisted variables and types. @@ -296,11 +309,7 @@ export const ExhaustiveDepsUtils = { }): { path: string; root: string; coversRootMembers: boolean } | null { const { identifier, sourceCode } = params - const fullChainNode = ASTUtils.traverseUpOnly(identifier, [ - AST_NODE_TYPES.MemberExpression, - AST_NODE_TYPES.TSNonNullExpression, - AST_NODE_TYPES.Identifier, - ]) + const fullChainNode = ASTUtils.traverseUpMemberExpression(identifier) const fullText = ExhaustiveDepsUtils.normalizeChain( sourceCode.getText(fullChainNode), diff --git a/packages/eslint-plugin-query/src/utils/ast-utils.ts b/packages/eslint-plugin-query/src/utils/ast-utils.ts index a44ae864549..b73825432e6 100644 --- a/packages/eslint-plugin-query/src/utils/ast-utils.ts +++ b/packages/eslint-plugin-query/src/utils/ast-utils.ts @@ -143,6 +143,21 @@ export const ASTUtils = { return identifier }, + traverseUpMemberExpression(node: TSESTree.Node): TSESTree.Node { + const parent = node.parent + + if ( + parent !== undefined && + ((parent.type === AST_NODE_TYPES.MemberExpression && + parent.object === node) || + parent.type === AST_NODE_TYPES.ChainExpression || + parent.type === AST_NODE_TYPES.TSNonNullExpression) + ) { + return ASTUtils.traverseUpMemberExpression(parent) + } + + return node + }, isDeclaredInNode(params: { functionNode: TSESTree.Node reference: TSESLint.Scope.Reference @@ -184,10 +199,22 @@ export const ASTUtils = { const references = collectReferences(scope) .filter((x) => x.isRead() && !scope.set.has(x.identifier.name)) .map((x) => { - const referenceNode = ASTUtils.traverseUpOnly(x.identifier, [ - AST_NODE_TYPES.MemberExpression, - AST_NODE_TYPES.Identifier, - ]) + const memberPath = ASTUtils.traverseUpMemberExpression(x.identifier) + const memberExpression = memberPath.parent + const isComputedCallProperty = + memberExpression !== undefined && + memberExpression.type === AST_NODE_TYPES.MemberExpression && + memberExpression.computed && + memberExpression.property === memberPath && + memberExpression.parent.type === AST_NODE_TYPES.CallExpression && + memberExpression.parent.callee === memberExpression + + const referenceNode = isComputedCallProperty + ? memberPath + : ASTUtils.traverseUpOnly(x.identifier, [ + AST_NODE_TYPES.MemberExpression, + AST_NODE_TYPES.Identifier, + ]) return { variable: x, From 86bb8a6fb2c7f15c74ff50afba053d778e6edc23 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jul 2026 15:00:30 +0200 Subject: [PATCH 78/97] ci: Version Packages (#11094) ci: changeset release Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/soft-pianos-sip.md | 5 - examples/angular/auto-refetching/package.json | 2 +- examples/angular/basic-persister/package.json | 6 +- examples/angular/basic/package.json | 2 +- examples/angular/devtools-panel/package.json | 2 +- .../package.json | 2 +- .../angular/optimistic-updates/package.json | 2 +- examples/angular/pagination/package.json | 2 +- .../query-options-from-a-service/package.json | 2 +- examples/angular/router/package.json | 2 +- examples/angular/rxjs/package.json | 2 +- examples/angular/simple/package.json | 2 +- examples/lit/basic/package.json | 4 +- examples/lit/pagination/package.json | 4 +- examples/lit/ssr/package.json | 4 +- examples/preact/simple/package.json | 2 +- examples/react/algolia/package.json | 6 +- examples/react/auto-refetching/package.json | 4 +- .../react/basic-graphql-request/package.json | 4 +- examples/react/basic/package.json | 10 +- examples/react/chat/package.json | 4 +- .../react/default-query-function/package.json | 4 +- examples/react/devtools-panel/package.json | 4 +- examples/react/eslint-legacy/package.json | 10 +- .../react/eslint-plugin-demo/package.json | 4 +- .../package.json | 4 +- .../load-more-infinite-scroll/package.json | 4 +- .../react/nextjs-app-prefetching/package.json | 4 +- .../nextjs-suspense-streaming/package.json | 6 +- examples/react/nextjs/package.json | 4 +- examples/react/offline/package.json | 8 +- .../optimistic-updates-cache/package.json | 4 +- .../react/optimistic-updates-ui/package.json | 4 +- examples/react/pagination/package.json | 4 +- examples/react/playground/package.json | 4 +- examples/react/prefetching/package.json | 4 +- examples/react/react-native/package.json | 4 +- examples/react/react-router/package.json | 4 +- examples/react/rick-morty/package.json | 4 +- examples/react/shadow-dom/package.json | 4 +- examples/react/simple/package.json | 4 +- examples/react/star-wars/package.json | 4 +- examples/react/suspense/package.json | 4 +- examples/solid/astro/package.json | 4 +- .../solid/basic-graphql-request/package.json | 4 +- examples/solid/basic/package.json | 4 +- .../solid/default-query-function/package.json | 4 +- examples/solid/offline/package.json | 8 +- examples/solid/simple/package.json | 6 +- .../solid/solid-start-streaming/package.json | 4 +- examples/svelte/auto-refetching/package.json | 4 +- examples/svelte/basic/package.json | 8 +- .../load-more-infinite-scroll/package.json | 4 +- .../svelte/optimistic-updates/package.json | 4 +- examples/svelte/playground/package.json | 4 +- examples/svelte/simple/package.json | 4 +- examples/svelte/ssr/package.json | 4 +- examples/svelte/star-wars/package.json | 4 +- examples/vue/basic/package.json | 4 +- examples/vue/dependent-queries/package.json | 2 +- examples/vue/persister/package.json | 8 +- examples/vue/simple/package.json | 4 +- integrations/angular-cli-20/package.json | 2 +- .../angular-query-experimental/CHANGELOG.md | 7 + .../angular-query-experimental/package.json | 2 +- .../angular-query-persist-client/CHANGELOG.md | 8 + .../angular-query-persist-client/package.json | 2 +- packages/eslint-plugin-query/CHANGELOG.md | 6 + packages/eslint-plugin-query/package.json | 2 +- packages/lit-query/CHANGELOG.md | 7 + packages/lit-query/package.json | 2 +- packages/preact-query-devtools/CHANGELOG.md | 8 + packages/preact-query-devtools/package.json | 2 +- .../preact-query-persist-client/CHANGELOG.md | 8 + .../preact-query-persist-client/package.json | 2 +- packages/preact-query/CHANGELOG.md | 7 + packages/preact-query/package.json | 2 +- .../CHANGELOG.md | 8 + .../package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- packages/query-core/CHANGELOG.md | 2 + packages/query-core/package.json | 2 +- packages/query-devtools/CHANGELOG.md | 2 + packages/query-devtools/package.json | 2 +- .../query-persist-client-core/CHANGELOG.md | 7 + .../query-persist-client-core/package.json | 2 +- .../query-sync-storage-persister/CHANGELOG.md | 8 + .../query-sync-storage-persister/package.json | 2 +- packages/react-query-devtools/CHANGELOG.md | 8 + packages/react-query-devtools/package.json | 2 +- .../CHANGELOG.md | 7 + .../package.json | 2 +- .../react-query-persist-client/CHANGELOG.md | 8 + .../react-query-persist-client/package.json | 2 +- packages/react-query/CHANGELOG.md | 7 + packages/react-query/package.json | 2 +- packages/solid-query-devtools/CHANGELOG.md | 8 + packages/solid-query-devtools/package.json | 2 +- .../solid-query-persist-client/CHANGELOG.md | 8 + .../solid-query-persist-client/package.json | 2 +- packages/solid-query/CHANGELOG.md | 7 + packages/solid-query/package.json | 2 +- packages/svelte-query-devtools/CHANGELOG.md | 8 + packages/svelte-query-devtools/package.json | 2 +- .../svelte-query-persist-client/CHANGELOG.md | 8 + .../svelte-query-persist-client/package.json | 2 +- packages/svelte-query/CHANGELOG.md | 7 + packages/svelte-query/package.json | 2 +- packages/vue-query-devtools/CHANGELOG.md | 8 + packages/vue-query-devtools/package.json | 2 +- packages/vue-query/CHANGELOG.md | 7 + packages/vue-query/package.json | 2 +- pnpm-lock.yaml | 258 +++++++++--------- 114 files changed, 459 insertions(+), 288 deletions(-) delete mode 100644 .changeset/soft-pianos-sip.md diff --git a/.changeset/soft-pianos-sip.md b/.changeset/soft-pianos-sip.md deleted file mode 100644 index 9bf92af6af6..00000000000 --- a/.changeset/soft-pianos-sip.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@tanstack/eslint-plugin-query': patch ---- - -Relax `exhaustive-deps` so function call targets are not required in query keys while values referenced in nested callbacks are still checked. diff --git a/examples/angular/auto-refetching/package.json b/examples/angular/auto-refetching/package.json index ed276030884..9ea3e32df28 100644 --- a/examples/angular/auto-refetching/package.json +++ b/examples/angular/auto-refetching/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/basic-persister/package.json b/examples/angular/basic-persister/package.json index 2d2b692c0d0..e61e01b2d52 100644 --- a/examples/angular/basic-persister/package.json +++ b/examples/angular/basic-persister/package.json @@ -13,9 +13,9 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", - "@tanstack/angular-query-persist-client": "^5.101.3", - "@tanstack/query-async-storage-persister": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", + "@tanstack/angular-query-persist-client": "^5.101.4", + "@tanstack/query-async-storage-persister": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/basic/package.json b/examples/angular/basic/package.json index 98d432129f3..d7b4faec85e 100644 --- a/examples/angular/basic/package.json +++ b/examples/angular/basic/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/devtools-panel/package.json b/examples/angular/devtools-panel/package.json index 0252c8a5b12..a6ccaa3cd1d 100644 --- a/examples/angular/devtools-panel/package.json +++ b/examples/angular/devtools-panel/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/infinite-query-with-max-pages/package.json b/examples/angular/infinite-query-with-max-pages/package.json index a87f1be4f60..538bf951039 100644 --- a/examples/angular/infinite-query-with-max-pages/package.json +++ b/examples/angular/infinite-query-with-max-pages/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/optimistic-updates/package.json b/examples/angular/optimistic-updates/package.json index 7f6e14db6bb..02bb343a647 100644 --- a/examples/angular/optimistic-updates/package.json +++ b/examples/angular/optimistic-updates/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/pagination/package.json b/examples/angular/pagination/package.json index 087db15110e..09f5257d502 100644 --- a/examples/angular/pagination/package.json +++ b/examples/angular/pagination/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/query-options-from-a-service/package.json b/examples/angular/query-options-from-a-service/package.json index 0839956666c..f3519257ec6 100644 --- a/examples/angular/query-options-from-a-service/package.json +++ b/examples/angular/query-options-from-a-service/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/router/package.json b/examples/angular/router/package.json index 48666bda121..925255bea00 100644 --- a/examples/angular/router/package.json +++ b/examples/angular/router/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/rxjs/package.json b/examples/angular/rxjs/package.json index 7c47a4f3efe..5fefcdafddc 100644 --- a/examples/angular/rxjs/package.json +++ b/examples/angular/rxjs/package.json @@ -14,7 +14,7 @@ "@angular/core": "^20.0.0", "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/angular/simple/package.json b/examples/angular/simple/package.json index 93a9fbb6f35..674c0f51f58 100644 --- a/examples/angular/simple/package.json +++ b/examples/angular/simple/package.json @@ -13,7 +13,7 @@ "@angular/compiler": "^20.0.0", "@angular/core": "^20.0.0", "@angular/platform-browser": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.0" diff --git a/examples/lit/basic/package.json b/examples/lit/basic/package.json index 7f122ed10c9..70e3e015fa2 100644 --- a/examples/lit/basic/package.json +++ b/examples/lit/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/lit-query": "^0.2.10", - "@tanstack/query-core": "^5.101.3", + "@tanstack/lit-query": "^0.2.11", + "@tanstack/query-core": "^5.101.4", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/lit/pagination/package.json b/examples/lit/pagination/package.json index 64b67e0b98e..fe7e79ceba2 100644 --- a/examples/lit/pagination/package.json +++ b/examples/lit/pagination/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/lit-query": "^0.2.10", - "@tanstack/query-core": "^5.101.3", + "@tanstack/lit-query": "^0.2.11", + "@tanstack/query-core": "^5.101.4", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/lit/ssr/package.json b/examples/lit/ssr/package.json index 877206d5406..02c5f35fd8e 100644 --- a/examples/lit/ssr/package.json +++ b/examples/lit/ssr/package.json @@ -8,8 +8,8 @@ }, "dependencies": { "@lit-labs/ssr": "^3.3.0", - "@tanstack/lit-query": "^0.2.10", - "@tanstack/query-core": "^5.101.3", + "@tanstack/lit-query": "^0.2.11", + "@tanstack/query-core": "^5.101.4", "lit": "^3.3.1" }, "devDependencies": { diff --git a/examples/preact/simple/package.json b/examples/preact/simple/package.json index c54d1423e61..146fb2bc674 100644 --- a/examples/preact/simple/package.json +++ b/examples/preact/simple/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/preact-query": "^5.101.3", + "@tanstack/preact-query": "^5.101.4", "preact": "^10.28.0" }, "devDependencies": { diff --git a/examples/react/algolia/package.json b/examples/react/algolia/package.json index 3eb57d14b0b..750045e68f0 100644 --- a/examples/react/algolia/package.json +++ b/examples/react/algolia/package.json @@ -9,13 +9,13 @@ }, "dependencies": { "@algolia/client-search": "5.2.1", - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.3", + "@tanstack/eslint-plugin-query": "^5.101.4", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/auto-refetching/package.json b/examples/react/auto-refetching/package.json index f0098999ee8..0f850a9d061 100644 --- a/examples/react/auto-refetching/package.json +++ b/examples/react/auto-refetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/basic-graphql-request/package.json b/examples/react/basic-graphql-request/package.json index e98fb776d00..ecae417c08e 100644 --- a/examples/react/basic-graphql-request/package.json +++ b/examples/react/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "graphql": "^16.9.0", "graphql-request": "^7.1.2", "react": "^19.0.0", diff --git a/examples/react/basic/package.json b/examples/react/basic/package.json index 9c3e9d5aa8e..ec4b29bb526 100644 --- a/examples/react/basic/package.json +++ b/examples/react/basic/package.json @@ -9,15 +9,15 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.3", - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", - "@tanstack/react-query-persist-client": "^5.101.3", + "@tanstack/query-async-storage-persister": "^5.101.4", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", + "@tanstack/react-query-persist-client": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.3", + "@tanstack/eslint-plugin-query": "^5.101.4", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/chat/package.json b/examples/react/chat/package.json index 5db3f66bbb6..7576acf8c91 100644 --- a/examples/react/chat/package.json +++ b/examples/react/chat/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/default-query-function/package.json b/examples/react/default-query-function/package.json index ac19496b26a..980bcd11990 100644 --- a/examples/react/default-query-function/package.json +++ b/examples/react/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/devtools-panel/package.json b/examples/react/devtools-panel/package.json index 161d362842a..f7a41e8f9e3 100644 --- a/examples/react/devtools-panel/package.json +++ b/examples/react/devtools-panel/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "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 fa6c30ea003..a3bdc2d4cc1 100644 --- a/examples/react/eslint-legacy/package.json +++ b/examples/react/eslint-legacy/package.json @@ -9,15 +9,15 @@ "test:eslint": "ESLINT_USE_FLAT_CONFIG=false eslint ./src/**/*.tsx" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.3", - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", - "@tanstack/react-query-persist-client": "^5.101.3", + "@tanstack/query-async-storage-persister": "^5.101.4", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", + "@tanstack/react-query-persist-client": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.3", + "@tanstack/eslint-plugin-query": "^5.101.4", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", "@vitejs/plugin-react": "^4.3.4", diff --git a/examples/react/eslint-plugin-demo/package.json b/examples/react/eslint-plugin-demo/package.json index f8b744a5397..743090decab 100644 --- a/examples/react/eslint-plugin-demo/package.json +++ b/examples/react/eslint-plugin-demo/package.json @@ -6,11 +6,11 @@ "test:eslint": "eslint ./src" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", + "@tanstack/react-query": "^5.101.4", "react": "^19.0.0" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.3", + "@tanstack/eslint-plugin-query": "^5.101.4", "eslint": "^9.39.0", "typescript": "5.8.3", "typescript-eslint": "^8.48.0" diff --git a/examples/react/infinite-query-with-max-pages/package.json b/examples/react/infinite-query-with-max-pages/package.json index b9b0012584d..3dcd817efaa 100644 --- a/examples/react/infinite-query-with-max-pages/package.json +++ b/examples/react/infinite-query-with-max-pages/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/load-more-infinite-scroll/package.json b/examples/react/load-more-infinite-scroll/package.json index 1aca51df8c2..323f6923627 100644 --- a/examples/react/load-more-infinite-scroll/package.json +++ b/examples/react/load-more-infinite-scroll/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1", diff --git a/examples/react/nextjs-app-prefetching/package.json b/examples/react/nextjs-app-prefetching/package.json index 25402f0c840..7b1086cd985 100644 --- a/examples/react/nextjs-app-prefetching/package.json +++ b/examples/react/nextjs-app-prefetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/nextjs-suspense-streaming/package.json b/examples/react/nextjs-suspense-streaming/package.json index 186bfe02a3d..21016424053 100644 --- a/examples/react/nextjs-suspense-streaming/package.json +++ b/examples/react/nextjs-suspense-streaming/package.json @@ -8,9 +8,9 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", - "@tanstack/react-query-next-experimental": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", + "@tanstack/react-query-next-experimental": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/nextjs/package.json b/examples/react/nextjs/package.json index 09f92d4be4c..d1170e05fdc 100644 --- a/examples/react/nextjs/package.json +++ b/examples/react/nextjs/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/offline/package.json b/examples/react/offline/package.json index 179635f25df..73d19703532 100644 --- a/examples/react/offline/package.json +++ b/examples/react/offline/package.json @@ -8,11 +8,11 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.3", + "@tanstack/query-async-storage-persister": "^5.101.4", "@tanstack/react-location": "^3.7.4", - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", - "@tanstack/react-query-persist-client": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", + "@tanstack/react-query-persist-client": "^5.101.4", "msw": "^2.6.6", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/react/optimistic-updates-cache/package.json b/examples/react/optimistic-updates-cache/package.json index 7293c8bf168..ec228f4d294 100755 --- a/examples/react/optimistic-updates-cache/package.json +++ b/examples/react/optimistic-updates-cache/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/optimistic-updates-ui/package.json b/examples/react/optimistic-updates-ui/package.json index eccadc18392..51e9ba16a8c 100755 --- a/examples/react/optimistic-updates-ui/package.json +++ b/examples/react/optimistic-updates-ui/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/pagination/package.json b/examples/react/pagination/package.json index 586b445efbc..c44d3855a42 100644 --- a/examples/react/pagination/package.json +++ b/examples/react/pagination/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/playground/package.json b/examples/react/playground/package.json index 9155066b1ae..c40e3873578 100644 --- a/examples/react/playground/package.json +++ b/examples/react/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/prefetching/package.json b/examples/react/prefetching/package.json index 6449a67c06a..a9336403b36 100644 --- a/examples/react/prefetching/package.json +++ b/examples/react/prefetching/package.json @@ -8,8 +8,8 @@ "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "next": "^16.0.7", "react": "^19.2.1", "react-dom": "^19.2.1" diff --git a/examples/react/react-native/package.json b/examples/react/react-native/package.json index 24225227e1d..4c1e9eddecc 100644 --- a/examples/react/react-native/package.json +++ b/examples/react/react-native/package.json @@ -14,8 +14,8 @@ "@react-native-community/netinfo": "^11.4.1", "@react-navigation/native": "^6.1.18", "@react-navigation/stack": "^6.4.1", - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "expo": "^52.0.11", "expo-constants": "^17.0.3", "expo-status-bar": "^2.0.0", diff --git a/examples/react/react-router/package.json b/examples/react/react-router/package.json index 3b6c41b0343..b04f16814b2 100644 --- a/examples/react/react-router/package.json +++ b/examples/react/react-router/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "localforage": "^1.10.0", "match-sorter": "^6.3.4", "react": "^19.0.0", diff --git a/examples/react/rick-morty/package.json b/examples/react/rick-morty/package.json index eff5594d1fc..7c3eb3f4f09 100644 --- a/examples/react/rick-morty/package.json +++ b/examples/react/rick-morty/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^6.25.1", diff --git a/examples/react/shadow-dom/package.json b/examples/react/shadow-dom/package.json index fd36b407675..f5d47388ac7 100644 --- a/examples/react/shadow-dom/package.json +++ b/examples/react/shadow-dom/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/simple/package.json b/examples/react/simple/package.json index 3bdc6e31a86..6960cabdfd3 100644 --- a/examples/react/simple/package.json +++ b/examples/react/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0" }, diff --git a/examples/react/star-wars/package.json b/examples/react/star-wars/package.json index 38e9e5fae20..eb6791dac5e 100644 --- a/examples/react/star-wars/package.json +++ b/examples/react/star-wars/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^6.25.1", diff --git a/examples/react/suspense/package.json b/examples/react/suspense/package.json index 1c1eba7d2b1..1bb90e86486 100644 --- a/examples/react/suspense/package.json +++ b/examples/react/suspense/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/react-query": "^5.101.3", - "@tanstack/react-query-devtools": "^5.101.3", + "@tanstack/react-query": "^5.101.4", + "@tanstack/react-query-devtools": "^5.101.4", "font-awesome": "^4.7.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/solid/astro/package.json b/examples/solid/astro/package.json index b72c4b08954..e20e04cfc55 100644 --- a/examples/solid/astro/package.json +++ b/examples/solid/astro/package.json @@ -15,8 +15,8 @@ "@astrojs/solid-js": "^5.0.7", "@astrojs/tailwind": "^6.0.2", "@astrojs/vercel": "^8.1.3", - "@tanstack/solid-query": "^5.101.3", - "@tanstack/solid-query-devtools": "^5.101.3", + "@tanstack/solid-query": "^5.101.4", + "@tanstack/solid-query-devtools": "^5.101.4", "astro": "^5.5.6", "solid-js": "^1.9.7", "tailwindcss": "^3.4.7", diff --git a/examples/solid/basic-graphql-request/package.json b/examples/solid/basic-graphql-request/package.json index 1f99b468ec2..72a99f22bd0 100644 --- a/examples/solid/basic-graphql-request/package.json +++ b/examples/solid/basic-graphql-request/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.3", - "@tanstack/solid-query-devtools": "^5.101.3", + "@tanstack/solid-query": "^5.101.4", + "@tanstack/solid-query-devtools": "^5.101.4", "graphql": "^16.9.0", "graphql-request": "^7.1.2", "solid-js": "^1.9.7" diff --git a/examples/solid/basic/package.json b/examples/solid/basic/package.json index f6b9e5aa725..002a7418002 100644 --- a/examples/solid/basic/package.json +++ b/examples/solid/basic/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.3", - "@tanstack/solid-query-devtools": "^5.101.3", + "@tanstack/solid-query": "^5.101.4", + "@tanstack/solid-query-devtools": "^5.101.4", "solid-js": "^1.9.7" }, "devDependencies": { diff --git a/examples/solid/default-query-function/package.json b/examples/solid/default-query-function/package.json index b464eecea60..1a7c6550192 100644 --- a/examples/solid/default-query-function/package.json +++ b/examples/solid/default-query-function/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.3", - "@tanstack/solid-query-devtools": "^5.101.3", + "@tanstack/solid-query": "^5.101.4", + "@tanstack/solid-query-devtools": "^5.101.4", "solid-js": "^1.9.7" }, "devDependencies": { diff --git a/examples/solid/offline/package.json b/examples/solid/offline/package.json index 0590661f56f..aa85df7e527 100644 --- a/examples/solid/offline/package.json +++ b/examples/solid/offline/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.3", - "@tanstack/solid-query": "^5.101.3", - "@tanstack/solid-query-devtools": "^5.101.3", - "@tanstack/solid-query-persist-client": "^5.101.3", + "@tanstack/query-async-storage-persister": "^5.101.4", + "@tanstack/solid-query": "^5.101.4", + "@tanstack/solid-query-devtools": "^5.101.4", + "@tanstack/solid-query-persist-client": "^5.101.4", "msw": "^2.6.6", "solid-js": "^1.9.7" }, diff --git a/examples/solid/simple/package.json b/examples/solid/simple/package.json index aad485d79c2..f31be1604c1 100644 --- a/examples/solid/simple/package.json +++ b/examples/solid/simple/package.json @@ -8,12 +8,12 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/solid-query": "^5.101.3", - "@tanstack/solid-query-devtools": "^5.101.3", + "@tanstack/solid-query": "^5.101.4", + "@tanstack/solid-query-devtools": "^5.101.4", "solid-js": "^1.9.7" }, "devDependencies": { - "@tanstack/eslint-plugin-query": "^5.101.3", + "@tanstack/eslint-plugin-query": "^5.101.4", "typescript": "5.8.3", "vite": "^6.4.1", "vite-plugin-solid": "^2.11.6" diff --git a/examples/solid/solid-start-streaming/package.json b/examples/solid/solid-start-streaming/package.json index 6dd8720b28b..c3d101fe530 100644 --- a/examples/solid/solid-start-streaming/package.json +++ b/examples/solid/solid-start-streaming/package.json @@ -12,8 +12,8 @@ "@solidjs/meta": "^0.29.4", "@solidjs/router": "^0.15.3", "@solidjs/start": "^1.1.3", - "@tanstack/solid-query": "^5.101.3", - "@tanstack/solid-query-devtools": "^5.101.3", + "@tanstack/solid-query": "^5.101.4", + "@tanstack/solid-query-devtools": "^5.101.4", "solid-js": "^1.9.7", "vinxi": "^0.5.3" }, diff --git a/examples/svelte/auto-refetching/package.json b/examples/svelte/auto-refetching/package.json index 86422258520..3aadc715709 100644 --- a/examples/svelte/auto-refetching/package.json +++ b/examples/svelte/auto-refetching/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.37", - "@tanstack/svelte-query-devtools": "^6.1.37" + "@tanstack/svelte-query": "^6.1.38", + "@tanstack/svelte-query-devtools": "^6.1.38" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/basic/package.json b/examples/svelte/basic/package.json index 70e8633df2a..c33732f0a96 100644 --- a/examples/svelte/basic/package.json +++ b/examples/svelte/basic/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-async-storage-persister": "^5.101.3", - "@tanstack/svelte-query": "^6.1.37", - "@tanstack/svelte-query-devtools": "^6.1.37", - "@tanstack/svelte-query-persist-client": "^6.1.37" + "@tanstack/query-async-storage-persister": "^5.101.4", + "@tanstack/svelte-query": "^6.1.38", + "@tanstack/svelte-query-devtools": "^6.1.38", + "@tanstack/svelte-query-persist-client": "^6.1.38" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/load-more-infinite-scroll/package.json b/examples/svelte/load-more-infinite-scroll/package.json index 3c9b293f7d2..2b418e8ab11 100644 --- a/examples/svelte/load-more-infinite-scroll/package.json +++ b/examples/svelte/load-more-infinite-scroll/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.37", - "@tanstack/svelte-query-devtools": "^6.1.37" + "@tanstack/svelte-query": "^6.1.38", + "@tanstack/svelte-query-devtools": "^6.1.38" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/optimistic-updates/package.json b/examples/svelte/optimistic-updates/package.json index f0a5d48270d..4b14b789a8e 100644 --- a/examples/svelte/optimistic-updates/package.json +++ b/examples/svelte/optimistic-updates/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.37", - "@tanstack/svelte-query-devtools": "^6.1.37" + "@tanstack/svelte-query": "^6.1.38", + "@tanstack/svelte-query-devtools": "^6.1.38" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/playground/package.json b/examples/svelte/playground/package.json index 18601eaeb92..7bf8ae7ba4e 100644 --- a/examples/svelte/playground/package.json +++ b/examples/svelte/playground/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.37", - "@tanstack/svelte-query-devtools": "^6.1.37" + "@tanstack/svelte-query": "^6.1.38", + "@tanstack/svelte-query-devtools": "^6.1.38" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/simple/package.json b/examples/svelte/simple/package.json index 11d5c1f7ff2..a7e5302a989 100644 --- a/examples/svelte/simple/package.json +++ b/examples/svelte/simple/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.37", - "@tanstack/svelte-query-devtools": "^6.1.37" + "@tanstack/svelte-query": "^6.1.38", + "@tanstack/svelte-query-devtools": "^6.1.38" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.1.1", diff --git a/examples/svelte/ssr/package.json b/examples/svelte/ssr/package.json index bcded8e0b3d..d87efacff82 100644 --- a/examples/svelte/ssr/package.json +++ b/examples/svelte/ssr/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.37", - "@tanstack/svelte-query-devtools": "^6.1.37" + "@tanstack/svelte-query": "^6.1.38", + "@tanstack/svelte-query-devtools": "^6.1.38" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/svelte/star-wars/package.json b/examples/svelte/star-wars/package.json index a1de688abe6..87f8491d7b0 100644 --- a/examples/svelte/star-wars/package.json +++ b/examples/svelte/star-wars/package.json @@ -8,8 +8,8 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/svelte-query": "^6.1.37", - "@tanstack/svelte-query-devtools": "^6.1.37" + "@tanstack/svelte-query": "^6.1.38", + "@tanstack/svelte-query-devtools": "^6.1.38" }, "devDependencies": { "@sveltejs/adapter-auto": "^6.1.0", diff --git a/examples/vue/basic/package.json b/examples/vue/basic/package.json index a59282eb7ca..b4b88c1ba48 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.101.3", - "@tanstack/vue-query-devtools": "^6.1.37", + "@tanstack/vue-query": "^5.101.4", + "@tanstack/vue-query-devtools": "^6.1.38", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/dependent-queries/package.json b/examples/vue/dependent-queries/package.json index 4a85d6bd2d7..2bf7264a605 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.101.3", + "@tanstack/vue-query": "^5.101.4", "vue": "^3.4.27" }, "devDependencies": { diff --git a/examples/vue/persister/package.json b/examples/vue/persister/package.json index 8cae6c60ab4..865ce57eacb 100644 --- a/examples/vue/persister/package.json +++ b/examples/vue/persister/package.json @@ -8,10 +8,10 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/query-core": "^5.101.3", - "@tanstack/query-persist-client-core": "^5.101.3", - "@tanstack/query-sync-storage-persister": "^5.101.3", - "@tanstack/vue-query": "^5.101.3", + "@tanstack/query-core": "^5.101.4", + "@tanstack/query-persist-client-core": "^5.101.4", + "@tanstack/query-sync-storage-persister": "^5.101.4", + "@tanstack/vue-query": "^5.101.4", "idb-keyval": "^6.2.1", "vue": "^3.4.27" }, diff --git a/examples/vue/simple/package.json b/examples/vue/simple/package.json index fcceb126969..ac1bb536ebb 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.101.3", - "@tanstack/vue-query-devtools": "^6.1.37", + "@tanstack/vue-query": "^5.101.4", + "@tanstack/vue-query-devtools": "^6.1.38", "vue": "^3.4.27" }, "devDependencies": { diff --git a/integrations/angular-cli-20/package.json b/integrations/angular-cli-20/package.json index 8bcf0976295..6f8d497e655 100644 --- a/integrations/angular-cli-20/package.json +++ b/integrations/angular-cli-20/package.json @@ -14,7 +14,7 @@ "@angular/forms": "^20.0.0", "@angular/platform-browser": "^20.0.0", "@angular/router": "^20.0.0", - "@tanstack/angular-query-experimental": "^5.101.3", + "@tanstack/angular-query-experimental": "^5.101.4", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" diff --git a/packages/angular-query-experimental/CHANGELOG.md b/packages/angular-query-experimental/CHANGELOG.md index b4c4196b699..b1bdffa47d6 100644 --- a/packages/angular-query-experimental/CHANGELOG.md +++ b/packages/angular-query-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/angular-query-experimental +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/angular-query-experimental/package.json b/packages/angular-query-experimental/package.json index 68e7d175c5d..31b6aac7e15 100644 --- a/packages/angular-query-experimental/package.json +++ b/packages/angular-query-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/angular-query-experimental", - "version": "5.101.3", + "version": "5.101.4", "description": "Signals for managing, caching and syncing asynchronous and remote data in Angular", "author": "Arnoud de Vries", "license": "MIT", diff --git a/packages/angular-query-persist-client/CHANGELOG.md b/packages/angular-query-persist-client/CHANGELOG.md index 31be0ec6d5e..ee472d874dd 100644 --- a/packages/angular-query-persist-client/CHANGELOG.md +++ b/packages/angular-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/angular-query-persist-client +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/angular-query-experimental@5.101.4 + - @tanstack/query-persist-client-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/angular-query-persist-client/package.json b/packages/angular-query-persist-client/package.json index 769b7b06d19..ed44373b33a 100644 --- a/packages/angular-query-persist-client/package.json +++ b/packages/angular-query-persist-client/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/angular-query-persist-client", "private": true, - "version": "5.101.3", + "version": "5.101.4", "description": "Angular bindings to work with persisters in TanStack/angular-query", "author": "Omer Gronich", "license": "MIT", diff --git a/packages/eslint-plugin-query/CHANGELOG.md b/packages/eslint-plugin-query/CHANGELOG.md index cb8d40cca6f..2b387b903e1 100644 --- a/packages/eslint-plugin-query/CHANGELOG.md +++ b/packages/eslint-plugin-query/CHANGELOG.md @@ -1,5 +1,11 @@ # @tanstack/eslint-plugin-query +## 5.101.4 + +### Patch Changes + +- [#11067](https://github.com/TanStack/query/pull/11067) [`7ac45ed`](https://github.com/TanStack/query/commit/7ac45ed45cbc28a54ac2fcfb1faccfcd87fb7b75) - Relax `exhaustive-deps` so function call targets are not required in query keys while values referenced in nested callbacks are still checked. + ## 5.101.3 ## 5.101.2 diff --git a/packages/eslint-plugin-query/package.json b/packages/eslint-plugin-query/package.json index 9297f8eb372..6f67b9536f9 100644 --- a/packages/eslint-plugin-query/package.json +++ b/packages/eslint-plugin-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/eslint-plugin-query", - "version": "5.101.3", + "version": "5.101.4", "description": "ESLint plugin for TanStack Query", "author": "Eliya Cohen", "license": "MIT", diff --git a/packages/lit-query/CHANGELOG.md b/packages/lit-query/CHANGELOG.md index 9c7821ee4b0..b660fe5cb6f 100644 --- a/packages/lit-query/CHANGELOG.md +++ b/packages/lit-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/lit-query +## 0.2.11 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 0.2.10 ### Patch Changes diff --git a/packages/lit-query/package.json b/packages/lit-query/package.json index b10b86710ea..20d2329faa0 100644 --- a/packages/lit-query/package.json +++ b/packages/lit-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/lit-query", - "version": "0.2.10", + "version": "0.2.11", "description": "Lit adapter for TanStack Query Core", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query-devtools/CHANGELOG.md b/packages/preact-query-devtools/CHANGELOG.md index 5cd0ccd26fc..f7b2bb5d3eb 100644 --- a/packages/preact-query-devtools/CHANGELOG.md +++ b/packages/preact-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/preact-query-devtools +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/preact-query@5.101.4 + - @tanstack/query-devtools@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/preact-query-devtools/package.json b/packages/preact-query-devtools/package.json index cac56f0d961..584857d956b 100644 --- a/packages/preact-query-devtools/package.json +++ b/packages/preact-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query-devtools", - "version": "5.101.3", + "version": "5.101.4", "description": "Developer tools to interact with and visualize the TanStack/preact-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query-persist-client/CHANGELOG.md b/packages/preact-query-persist-client/CHANGELOG.md index 2fb80cb000b..6cdd8e44de8 100644 --- a/packages/preact-query-persist-client/CHANGELOG.md +++ b/packages/preact-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/preact-query-persist-client +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/preact-query@5.101.4 + - @tanstack/query-persist-client-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/preact-query-persist-client/package.json b/packages/preact-query-persist-client/package.json index 0525713a6d3..41bbfc6c244 100644 --- a/packages/preact-query-persist-client/package.json +++ b/packages/preact-query-persist-client/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query-persist-client", - "version": "5.101.3", + "version": "5.101.4", "description": "Preact bindings to work with persisters in TanStack/preact-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/preact-query/CHANGELOG.md b/packages/preact-query/CHANGELOG.md index bbdc0b135f6..93b3887e914 100644 --- a/packages/preact-query/CHANGELOG.md +++ b/packages/preact-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/preact-query +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/preact-query/package.json b/packages/preact-query/package.json index a0a4d3e5dc2..ee2ee4b3776 100644 --- a/packages/preact-query/package.json +++ b/packages/preact-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/preact-query", - "version": "5.101.3", + "version": "5.101.4", "description": "Hooks for managing, caching and syncing asynchronous and remote data in preact", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-async-storage-persister/CHANGELOG.md b/packages/query-async-storage-persister/CHANGELOG.md index fbe326e00d3..45e89a1c329 100644 --- a/packages/query-async-storage-persister/CHANGELOG.md +++ b/packages/query-async-storage-persister/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/query-async-storage-persister +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + - @tanstack/query-persist-client-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/query-async-storage-persister/package.json b/packages/query-async-storage-persister/package.json index 2adbab5c853..6dc6574316a 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.101.3", + "version": "5.101.4", "description": "A persister for asynchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-broadcast-client-experimental/CHANGELOG.md b/packages/query-broadcast-client-experimental/CHANGELOG.md index d71404fb7b6..79ddbca7960 100644 --- a/packages/query-broadcast-client-experimental/CHANGELOG.md +++ b/packages/query-broadcast-client-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-broadcast-client-experimental +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/query-broadcast-client-experimental/package.json b/packages/query-broadcast-client-experimental/package.json index 591ca50e287..07f48f1ed05 100644 --- a/packages/query-broadcast-client-experimental/package.json +++ b/packages/query-broadcast-client-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-broadcast-client-experimental", - "version": "5.101.3", + "version": "5.101.4", "description": "An experimental plugin to for broadcasting the state of your queryClient between browser tabs/windows", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-core/CHANGELOG.md b/packages/query-core/CHANGELOG.md index 0fe32ccfc63..211c6a2ae7a 100644 --- a/packages/query-core/CHANGELOG.md +++ b/packages/query-core/CHANGELOG.md @@ -1,5 +1,7 @@ # @tanstack/query-core +## 5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/query-core/package.json b/packages/query-core/package.json index bfc460a1142..03652df3182 100644 --- a/packages/query-core/package.json +++ b/packages/query-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-core", - "version": "5.101.3", + "version": "5.101.4", "description": "The framework agnostic core that powers TanStack Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-devtools/CHANGELOG.md b/packages/query-devtools/CHANGELOG.md index f2d9f9f84f5..e39a2309c5d 100644 --- a/packages/query-devtools/CHANGELOG.md +++ b/packages/query-devtools/CHANGELOG.md @@ -1,5 +1,7 @@ # @tanstack/query-devtools +## 5.101.4 + ## 5.101.3 ## 5.101.2 diff --git a/packages/query-devtools/package.json b/packages/query-devtools/package.json index e7267f1ea41..cca18b5a1a8 100644 --- a/packages/query-devtools/package.json +++ b/packages/query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/query-devtools", - "version": "5.101.3", + "version": "5.101.4", "description": "Developer tools to interact with and visualize the TanStack Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/query-persist-client-core/CHANGELOG.md b/packages/query-persist-client-core/CHANGELOG.md index 15f4246ccef..d4e5d55f3b2 100644 --- a/packages/query-persist-client-core/CHANGELOG.md +++ b/packages/query-persist-client-core/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/query-persist-client-core +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/query-persist-client-core/package.json b/packages/query-persist-client-core/package.json index cab19031cdd..f4fe2962af3 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.101.3", + "version": "5.101.4", "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-sync-storage-persister/CHANGELOG.md b/packages/query-sync-storage-persister/CHANGELOG.md index bb454d00841..cba244597fd 100644 --- a/packages/query-sync-storage-persister/CHANGELOG.md +++ b/packages/query-sync-storage-persister/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/query-sync-storage-persister +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + - @tanstack/query-persist-client-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/query-sync-storage-persister/package.json b/packages/query-sync-storage-persister/package.json index 068e46ef287..858f22c95d0 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.101.3", + "version": "5.101.4", "description": "A persister for synchronous storages, to be used with TanStack/Query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-devtools/CHANGELOG.md b/packages/react-query-devtools/CHANGELOG.md index 86325eb3fb5..cd56e3d2680 100644 --- a/packages/react-query-devtools/CHANGELOG.md +++ b/packages/react-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/react-query-devtools +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.4 + - @tanstack/react-query@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/react-query-devtools/package.json b/packages/react-query-devtools/package.json index cc5c55ef4a6..38da8701481 100644 --- a/packages/react-query-devtools/package.json +++ b/packages/react-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-devtools", - "version": "5.101.3", + "version": "5.101.4", "description": "Developer tools to interact with and visualize the TanStack/react-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-next-experimental/CHANGELOG.md b/packages/react-query-next-experimental/CHANGELOG.md index 5f9abf819d5..20fb237b96c 100644 --- a/packages/react-query-next-experimental/CHANGELOG.md +++ b/packages/react-query-next-experimental/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-query-next-experimental +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/react-query@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/react-query-next-experimental/package.json b/packages/react-query-next-experimental/package.json index a9a43aec1de..7f732090e16 100644 --- a/packages/react-query-next-experimental/package.json +++ b/packages/react-query-next-experimental/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query-next-experimental", - "version": "5.101.3", + "version": "5.101.4", "description": "Hydration utils for React Query in the NextJs app directory", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query-persist-client/CHANGELOG.md b/packages/react-query-persist-client/CHANGELOG.md index a53ca926642..213a7cae606 100644 --- a/packages/react-query-persist-client/CHANGELOG.md +++ b/packages/react-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/react-query-persist-client +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.4 + - @tanstack/react-query@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/react-query-persist-client/package.json b/packages/react-query-persist-client/package.json index 3c577a2242c..e2d61d88cfc 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.101.3", + "version": "5.101.4", "description": "React bindings to work with persisters in TanStack/react-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/react-query/CHANGELOG.md b/packages/react-query/CHANGELOG.md index ce4e80c2bde..4e1142d140a 100644 --- a/packages/react-query/CHANGELOG.md +++ b/packages/react-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-query +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/react-query/package.json b/packages/react-query/package.json index 1ca69cd22b8..ae8d8bea192 100644 --- a/packages/react-query/package.json +++ b/packages/react-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-query", - "version": "5.101.3", + "version": "5.101.4", "description": "Hooks for managing, caching and syncing asynchronous and remote data in React", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-devtools/CHANGELOG.md b/packages/solid-query-devtools/CHANGELOG.md index 692272e9adb..ad2e7b4151c 100644 --- a/packages/solid-query-devtools/CHANGELOG.md +++ b/packages/solid-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/solid-query-devtools +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.4 + - @tanstack/solid-query@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/solid-query-devtools/package.json b/packages/solid-query-devtools/package.json index fa5eff6fef9..1a23f37b621 100644 --- a/packages/solid-query-devtools/package.json +++ b/packages/solid-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query-devtools", - "version": "5.101.3", + "version": "5.101.4", "description": "Developer tools to interact with and visualize the TanStack/solid-query Query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query-persist-client/CHANGELOG.md b/packages/solid-query-persist-client/CHANGELOG.md index 800aa5e566e..2202442a1c5 100644 --- a/packages/solid-query-persist-client/CHANGELOG.md +++ b/packages/solid-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/solid-query-persist-client +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.4 + - @tanstack/solid-query@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/solid-query-persist-client/package.json b/packages/solid-query-persist-client/package.json index a9354fe4ea7..2de46afd0fc 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.101.3", + "version": "5.101.4", "description": "Solid.js bindings to work with persisters in TanStack/solid-query", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/solid-query/CHANGELOG.md b/packages/solid-query/CHANGELOG.md index b18ec755ce4..e4c8d2754d5 100644 --- a/packages/solid-query/CHANGELOG.md +++ b/packages/solid-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/solid-query +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/solid-query/package.json b/packages/solid-query/package.json index 95f1c258094..a4d7791f6ac 100644 --- a/packages/solid-query/package.json +++ b/packages/solid-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query", - "version": "5.101.3", + "version": "5.101.4", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/svelte-query-devtools/CHANGELOG.md b/packages/svelte-query-devtools/CHANGELOG.md index cbe2a7bc378..8c339af2c8c 100644 --- a/packages/svelte-query-devtools/CHANGELOG.md +++ b/packages/svelte-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/svelte-query-devtools +## 6.1.38 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.4 + - @tanstack/svelte-query@6.1.38 + ## 6.1.37 ### Patch Changes diff --git a/packages/svelte-query-devtools/package.json b/packages/svelte-query-devtools/package.json index e10470cd940..9c08e4acb9f 100644 --- a/packages/svelte-query-devtools/package.json +++ b/packages/svelte-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query-devtools", - "version": "6.1.37", + "version": "6.1.38", "description": "Developer tools to interact with and visualize the TanStack/svelte-query cache", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query-persist-client/CHANGELOG.md b/packages/svelte-query-persist-client/CHANGELOG.md index 06ac7c1d2dc..049ecf6dd4e 100644 --- a/packages/svelte-query-persist-client/CHANGELOG.md +++ b/packages/svelte-query-persist-client/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/svelte-query-persist-client +## 6.1.38 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-persist-client-core@5.101.4 + - @tanstack/svelte-query@6.1.38 + ## 6.1.37 ### Patch Changes diff --git a/packages/svelte-query-persist-client/package.json b/packages/svelte-query-persist-client/package.json index ca3568ccf2d..42bcc352bf3 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": "6.1.37", + "version": "6.1.38", "description": "Svelte bindings to work with persisters in TanStack/svelte-query", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/svelte-query/CHANGELOG.md b/packages/svelte-query/CHANGELOG.md index df317e88cb5..1d97eee2cb7 100644 --- a/packages/svelte-query/CHANGELOG.md +++ b/packages/svelte-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/svelte-query +## 6.1.38 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 6.1.37 ### Patch Changes diff --git a/packages/svelte-query/package.json b/packages/svelte-query/package.json index 2850929c428..9bc1718ef44 100644 --- a/packages/svelte-query/package.json +++ b/packages/svelte-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-query", - "version": "6.1.37", + "version": "6.1.38", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte", "author": "Lachlan Collins", "license": "MIT", diff --git a/packages/vue-query-devtools/CHANGELOG.md b/packages/vue-query-devtools/CHANGELOG.md index 6e24148f194..fd565c00bda 100644 --- a/packages/vue-query-devtools/CHANGELOG.md +++ b/packages/vue-query-devtools/CHANGELOG.md @@ -1,5 +1,13 @@ # @tanstack/vue-query-devtools +## 6.1.38 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-devtools@5.101.4 + - @tanstack/vue-query@5.101.4 + ## 6.1.37 ### Patch Changes diff --git a/packages/vue-query-devtools/package.json b/packages/vue-query-devtools/package.json index eeee320e949..7058f6bff41 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": "6.1.37", + "version": "6.1.38", "description": "Developer tools to interact with and visualize the TanStack/vue-query cache", "author": "tannerlinsley", "license": "MIT", diff --git a/packages/vue-query/CHANGELOG.md b/packages/vue-query/CHANGELOG.md index a92e1446db3..bd906d9691b 100644 --- a/packages/vue-query/CHANGELOG.md +++ b/packages/vue-query/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/vue-query +## 5.101.4 + +### Patch Changes + +- Updated dependencies []: + - @tanstack/query-core@5.101.4 + ## 5.101.3 ### Patch Changes diff --git a/packages/vue-query/package.json b/packages/vue-query/package.json index dc320bd8fc9..b29ef7ce4e4 100644 --- a/packages/vue-query/package.json +++ b/packages/vue-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-query", - "version": "5.101.3", + "version": "5.101.4", "description": "Hooks for managing, caching and syncing asynchronous and remote data in Vue", "author": "Damian Osipiuk", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fe228fef162..029ae0b6783 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,7 +170,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -210,7 +210,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -250,13 +250,13 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental '@tanstack/angular-query-persist-client': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-persist-client '@tanstack/query-async-storage-persister': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-async-storage-persister rxjs: specifier: ^7.8.2 @@ -299,7 +299,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -339,7 +339,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -382,7 +382,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -422,7 +422,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -465,7 +465,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -508,7 +508,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -551,7 +551,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -591,7 +591,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/angular-query-experimental rxjs: specifier: ^7.8.2 @@ -619,10 +619,10 @@ importers: examples/lit/basic: dependencies: '@tanstack/lit-query': - specifier: ^0.2.10 + specifier: ^0.2.11 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -638,10 +638,10 @@ importers: examples/lit/pagination: dependencies: '@tanstack/lit-query': - specifier: ^0.2.10 + specifier: ^0.2.11 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -660,10 +660,10 @@ importers: specifier: ^3.3.0 version: 3.3.1 '@tanstack/lit-query': - specifier: ^0.2.10 + specifier: ^0.2.11 version: link:../../../packages/lit-query '@tanstack/query-core': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-core lit: specifier: ^3.3.1 @@ -685,7 +685,7 @@ importers: examples/preact/simple: dependencies: '@tanstack/preact-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/preact-query preact: specifier: ^10.28.0 @@ -713,10 +713,10 @@ importers: specifier: 5.2.1 version: 5.2.1 '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -726,7 +726,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -747,10 +747,10 @@ importers: examples/react/auto-refetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -775,16 +775,16 @@ importers: examples/react/basic: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-async-storage-persister '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-persist-client react: specifier: ^19.0.0 @@ -794,7 +794,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -815,10 +815,10 @@ importers: examples/react/basic-graphql-request: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools graphql: specifier: ^16.9.0 @@ -843,10 +843,10 @@ importers: examples/react/chat: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -874,10 +874,10 @@ importers: examples/react/default-query-function: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -899,10 +899,10 @@ importers: examples/react/devtools-panel: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -924,16 +924,16 @@ importers: examples/react/eslint-legacy: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-async-storage-persister '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-persist-client react: specifier: ^19.0.0 @@ -943,7 +943,7 @@ importers: version: 19.2.4(react@19.2.4) devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/eslint-plugin-query '@types/react': specifier: ^19.2.7 @@ -964,14 +964,14 @@ importers: examples/react/eslint-plugin-demo: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query react: specifier: ^19.0.0 version: 19.2.4 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/eslint-plugin-query eslint: specifier: ^9.39.0 @@ -986,10 +986,10 @@ importers: examples/react/infinite-query-with-max-pages: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1014,10 +1014,10 @@ importers: examples/react/load-more-infinite-scroll: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1045,10 +1045,10 @@ importers: examples/react/nextjs: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1073,10 +1073,10 @@ importers: examples/react/nextjs-app-prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1101,13 +1101,13 @@ importers: examples/react/nextjs-suspense-streaming: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools '@tanstack/react-query-next-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-next-experimental next: specifier: ^16.0.7 @@ -1132,19 +1132,19 @@ importers: examples/react/offline: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-async-storage-persister '@tanstack/react-location': specifier: ^3.7.4 version: 3.7.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools '@tanstack/react-query-persist-client': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-persist-client msw: specifier: ^2.6.6 @@ -1172,10 +1172,10 @@ importers: examples/react/optimistic-updates-cache: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1200,10 +1200,10 @@ importers: examples/react/optimistic-updates-ui: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1228,10 +1228,10 @@ importers: examples/react/pagination: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1256,10 +1256,10 @@ importers: examples/react/playground: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1281,10 +1281,10 @@ importers: examples/react/prefetching: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools next: specifier: ^16.0.7 @@ -1318,10 +1318,10 @@ importers: specifier: ^6.4.1 version: 6.4.1(@react-navigation/native@6.1.18(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-gesture-handler@2.30.1(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-safe-area-context@4.14.1(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native-screens@4.24.0(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4))(react-native@0.76.9(@babel/core@7.29.0)(@babel/preset-env@7.29.2(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.4))(react@19.2.4) '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools expo: specifier: ^52.0.11 @@ -1370,10 +1370,10 @@ importers: examples/react/react-router: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools localforage: specifier: ^1.10.0 @@ -1422,10 +1422,10 @@ importers: examples/react/rick-morty: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1459,10 +1459,10 @@ importers: examples/react/shadow-dom: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1490,10 +1490,10 @@ importers: examples/react/simple: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1515,10 +1515,10 @@ importers: examples/react/star-wars: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools react: specifier: ^19.0.0 @@ -1552,10 +1552,10 @@ importers: examples/react/suspense: dependencies: '@tanstack/react-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query '@tanstack/react-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/react-query-devtools font-awesome: specifier: ^4.7.0 @@ -1598,10 +1598,10 @@ importers: specifier: ^8.1.3 version: 8.2.11(@sveltejs/kit@2.57.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.1)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.55.1)(typescript@5.8.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(astro@5.18.1(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@1.21.7)(lightningcss@1.32.0)(rollup@4.60.1)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.8.3)(yaml@2.8.3))(next@16.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.90.0))(react@19.2.4)(rollup@4.60.1)(svelte@5.55.1)(vue@3.5.31(typescript@5.8.3)) '@tanstack/solid-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query-devtools astro: specifier: ^5.5.6 @@ -1619,10 +1619,10 @@ importers: examples/solid/basic: dependencies: '@tanstack/solid-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1641,10 +1641,10 @@ importers: examples/solid/basic-graphql-request: dependencies: '@tanstack/solid-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query-devtools graphql: specifier: ^16.9.0 @@ -1669,10 +1669,10 @@ importers: examples/solid/default-query-function: dependencies: '@tanstack/solid-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1691,16 +1691,16 @@ importers: examples/solid/offline: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-async-storage-persister '@tanstack/solid-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query-devtools '@tanstack/solid-query-persist-client': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query-persist-client msw: specifier: ^2.6.6 @@ -1722,17 +1722,17 @@ importers: examples/solid/simple: dependencies: '@tanstack/solid-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 version: 1.9.12 devDependencies: '@tanstack/eslint-plugin-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/eslint-plugin-query typescript: specifier: 5.8.3 @@ -1756,10 +1756,10 @@ importers: specifier: ^1.1.3 version: 1.3.2(@testing-library/jest-dom@6.9.1)(solid-js@1.9.12)(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/solid-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query '@tanstack/solid-query-devtools': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/solid-query-devtools solid-js: specifier: ^1.9.7 @@ -1771,10 +1771,10 @@ importers: examples/svelte/auto-refetching: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1802,16 +1802,16 @@ importers: examples/svelte/basic: dependencies: '@tanstack/query-async-storage-persister': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-async-storage-persister '@tanstack/svelte-query': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-devtools '@tanstack/svelte-query-persist-client': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-persist-client devDependencies: '@sveltejs/adapter-auto': @@ -1839,10 +1839,10 @@ importers: examples/svelte/load-more-infinite-scroll: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1870,10 +1870,10 @@ importers: examples/svelte/optimistic-updates: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1901,10 +1901,10 @@ importers: examples/svelte/playground: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1932,10 +1932,10 @@ importers: examples/svelte/simple: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/vite-plugin-svelte': @@ -1960,10 +1960,10 @@ importers: examples/svelte/ssr: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -1991,10 +1991,10 @@ importers: examples/svelte/star-wars: dependencies: '@tanstack/svelte-query': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query '@tanstack/svelte-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/svelte-query-devtools devDependencies: '@sveltejs/adapter-auto': @@ -2028,10 +2028,10 @@ importers: examples/vue/basic: dependencies: '@tanstack/vue-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.4.27 @@ -2050,7 +2050,7 @@ importers: examples/vue/dependent-queries: dependencies: '@tanstack/vue-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/vue-query vue: specifier: ^3.4.27 @@ -2069,16 +2069,16 @@ importers: examples/vue/persister: dependencies: '@tanstack/query-core': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-core '@tanstack/query-persist-client-core': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-persist-client-core '@tanstack/query-sync-storage-persister': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/query-sync-storage-persister '@tanstack/vue-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/vue-query idb-keyval: specifier: ^6.2.1 @@ -2100,10 +2100,10 @@ importers: examples/vue/simple: dependencies: '@tanstack/vue-query': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../../packages/vue-query '@tanstack/vue-query-devtools': - specifier: ^6.1.37 + specifier: ^6.1.38 version: link:../../../packages/vue-query-devtools vue: specifier: ^3.4.27 @@ -2140,7 +2140,7 @@ importers: specifier: ^20.0.0 version: 20.3.18(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(@angular/platform-browser@20.3.18(@angular/animations@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(@angular/common@20.3.18(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0))(rxjs@7.8.2))(@angular/core@20.3.18(@angular/compiler@20.3.18)(rxjs@7.8.2)(zone.js@0.15.0)))(rxjs@7.8.2) '@tanstack/angular-query-experimental': - specifier: ^5.101.3 + specifier: ^5.101.4 version: link:../../packages/angular-query-experimental rxjs: specifier: ~7.8.0 From 98d2bfda922b94a7d7e31354478b4265d8df8add Mon Sep 17 00:00:00 2001 From: SiHyunLee Date: Fri, 24 Jul 2026 12:19:12 +0900 Subject: [PATCH 79/97] docs(CONTRIBUTING): link '.nvmrc' reference to the actual file (#11097) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 931a591f383..ed528282140 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,7 +31,7 @@ If you have been assigned to fix an issue or develop a new feature, please follo corepack enable && corepack prepare ``` - - We use [nvm](https://github.com/nvm-sh/nvm) to manage node versions - please make sure to use the version mentioned in `.nvmrc` + - We use [nvm](https://github.com/nvm-sh/nvm) to manage node versions - please make sure to use the version mentioned in [.nvmrc](./.nvmrc) ```bash nvm use From a3b06127291063333e3bf24d7dce572505312935 Mon Sep 17 00:00:00 2001 From: SiHyunLee Date: Fri, 24 Jul 2026 12:30:17 +0900 Subject: [PATCH 80/97] test({react,preact}-query/usePrefetchQuery): use the '.then()' convention consistently (#11091) Co-authored-by: Wonsuk Choi --- .../src/__tests__/usePrefetchQuery.test.tsx | 20 +++++++++---------- .../src/__tests__/usePrefetchQuery.test.tsx | 20 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx index 9dd5f3949da..ac6bec8ed1d 100644 --- a/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/preact-query/src/__tests__/usePrefetchQuery.test.tsx @@ -109,11 +109,11 @@ describe('usePrefetchQuery', () => { queryFn, } - queryFn.mockImplementationOnce(async () => { - await sleep(10) - - throw new Error('Oops! Server error!') - }) + queryFn.mockImplementationOnce(() => + sleep(10).then(() => { + throw new Error('Oops! Server error!') + }), + ) function Page() { const state = useSuspenseQuery(queryOpts) @@ -190,11 +190,11 @@ describe('usePrefetchQuery', () => { queryFn, } - queryFn.mockImplementationOnce(async () => { - await sleep(10) - - throw new Error('Oops! Server error!') - }) + queryFn.mockImplementationOnce(() => + sleep(10).then(() => { + throw new Error('Oops! Server error!') + }), + ) function Page() { const state = useSuspenseQuery(queryOpts) diff --git a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx index 78dc11ad11d..9b597d4d283 100644 --- a/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx +++ b/packages/react-query/src/__tests__/usePrefetchQuery.test.tsx @@ -107,11 +107,11 @@ describe('usePrefetchQuery', () => { queryFn, } - queryFn.mockImplementationOnce(async () => { - await sleep(10) - - throw new Error('Oops! Server error!') - }) + queryFn.mockImplementationOnce(() => + sleep(10).then(() => { + throw new Error('Oops! Server error!') + }), + ) function Page() { const state = useSuspenseQuery(queryOpts) @@ -188,11 +188,11 @@ describe('usePrefetchQuery', () => { queryFn, } - queryFn.mockImplementationOnce(async () => { - await sleep(10) - - throw new Error('Oops! Server error!') - }) + queryFn.mockImplementationOnce(() => + sleep(10).then(() => { + throw new Error('Oops! Server error!') + }), + ) function Page() { const state = useSuspenseQuery(queryOpts) From fd50fa14d283c7d6664a796f758498d1ad5bfce7 Mon Sep 17 00:00:00 2001 From: Lachlan Collins <1667261+lachlancollins@users.noreply.github.com> Date: Fri, 24 Jul 2026 22:22:47 +1000 Subject: [PATCH 81/97] ci: update renovate.json (#11114) --- .github/renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/renovate.json b/.github/renovate.json index 3c12db59658..bb444bf9c29 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -3,10 +3,11 @@ "configMigration": true, "extends": [ "config:recommended", + "helpers:pinGitHubActionDigests", "group:allNonMajor", "schedule:weekly", + "security:minimumReleaseAgeNpm", ":approveMajorUpdates", - ":automergeMinor", ":disablePeerDependencies", ":maintainLockFilesMonthly", ":semanticCommits", From f320db5a4cb8ecdd94a28dad469125410b225cb9 Mon Sep 17 00:00:00 2001 From: karl Date: Sun, 26 Jul 2026 16:56:26 +0200 Subject: [PATCH 82/97] test(solid-query): assert exact values instead of loose matchers (#11105) Co-authored-by: Wonsuk Choi --- .../src/__tests__/QueryClientProvider.test.tsx | 11 +++++------ .../src/__tests__/mutationOptions.test.tsx | 1 - packages/solid-query/src/__tests__/suspense.test.tsx | 2 +- packages/solid-query/src/__tests__/useQuery.test.tsx | 4 +++- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx b/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx index e96be03cd24..0e08288b359 100644 --- a/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx +++ b/packages/solid-query/src/__tests__/QueryClientProvider.test.tsx @@ -41,7 +41,7 @@ describe('QueryClientProvider', () => { await vi.advanceTimersByTimeAsync(10) expect(rendered.getByText('test')).toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('test') }) it('allows multiple caches to be partitioned', async () => { @@ -94,10 +94,10 @@ describe('QueryClientProvider', () => { expect(rendered.getByText('test1')).toBeInTheDocument() expect(rendered.getByText('test2')).toBeInTheDocument() - expect(queryCache1.find({ queryKey: key1 })).toBeDefined() - expect(queryCache1.find({ queryKey: key2 })).not.toBeDefined() - expect(queryCache2.find({ queryKey: key1 })).not.toBeDefined() - expect(queryCache2.find({ queryKey: key2 })).toBeDefined() + expect(queryCache1.find({ queryKey: key1 })?.state.data).toBe('test1') + expect(queryCache1.find({ queryKey: key2 })).toBeUndefined() + expect(queryCache2.find({ queryKey: key1 })).toBeUndefined() + expect(queryCache2.find({ queryKey: key2 })?.state.data).toBe('test2') }) it("uses defaultOptions for queries when they don't provide their own config", async () => { @@ -135,7 +135,6 @@ describe('QueryClientProvider', () => { await vi.advanceTimersByTimeAsync(10) expect(rendered.getByText('test')).toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeDefined() expect(queryCache.find({ queryKey: key })?.options.gcTime).toBe(Infinity) }) diff --git a/packages/solid-query/src/__tests__/mutationOptions.test.tsx b/packages/solid-query/src/__tests__/mutationOptions.test.tsx index 3906c014ea2..acd72fe7148 100644 --- a/packages/solid-query/src/__tests__/mutationOptions.test.tsx +++ b/packages/solid-query/src/__tests__/mutationOptions.test.tsx @@ -507,6 +507,5 @@ describe('mutationOptions', () => { const lastSnapshot = mutationStateArray[mutationStateArray.length - 1]! expect(lastSnapshot.length).toEqual(1) expect(lastSnapshot[0]?.data).toEqual('data1') - expect(lastSnapshot[1]).toBeFalsy() }) }) diff --git a/packages/solid-query/src/__tests__/suspense.test.tsx b/packages/solid-query/src/__tests__/suspense.test.tsx index f3ba1b5486a..b3aa93e4b78 100644 --- a/packages/solid-query/src/__tests__/suspense.test.tsx +++ b/packages/solid-query/src/__tests__/suspense.test.tsx @@ -196,7 +196,7 @@ describe("useQuery's in Suspense mode", () => { const rendered = renderWithClient(queryClient, () => ) expect(rendered.queryByText('rendered')).not.toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeFalsy() + expect(queryCache.find({ queryKey: key })).toBeUndefined() fireEvent.click(rendered.getByLabelText('toggle')) await vi.advanceTimersByTimeAsync(10) diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 1574767b703..9392af47b6a 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -5746,7 +5746,9 @@ describe('useQuery', () => { await vi.advanceTimersByTimeAsync(10) expect(rendered.getByText('status: success')).toBeInTheDocument() - expect(queryClient1.getQueryCache().find({ queryKey: key })).toBeDefined() + expect( + queryClient1.getQueryCache().find({ queryKey: key })?.state.data, + ).toBe('data') expect(queryFn).toHaveBeenCalledTimes(1) setClient(queryClient2) From 3bf3adcbb475c35e6252d66336b3033717d2921e Mon Sep 17 00:00:00 2001 From: karl Date: Sun, 26 Jul 2026 17:15:21 +0200 Subject: [PATCH 83/97] test(query-core): assert exact values instead of loose matchers in remaining tests (#11093) Co-authored-by: Wonsuk Choi --- .../src/__tests__/hydration.test.tsx | 10 +++++---- .../src/__tests__/queriesObserver.test.tsx | 4 +++- .../query-core/src/__tests__/query.test.tsx | 21 +++++++++---------- .../src/__tests__/queryCache.test.tsx | 7 ++++--- .../src/__tests__/queryClient.test.tsx | 12 +++++------ 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/packages/query-core/src/__tests__/hydration.test.tsx b/packages/query-core/src/__tests__/hydration.test.tsx index 3c61a7ba771..389226bd5b6 100644 --- a/packages/query-core/src/__tests__/hydration.test.tsx +++ b/packages/query-core/src/__tests__/hydration.test.tsx @@ -155,7 +155,7 @@ describe('dehydration and rehydration', () => { hydrate(hydrationClient, parsed) expect(hydrationCache.find({ queryKey: key })?.state.data).toBe('string') await vi.advanceTimersByTimeAsync(100) - expect(hydrationCache.find({ queryKey: key })).toBeTruthy() + expect(hydrationCache.find({ queryKey: key })?.state.data).toBe('string') queryClient.clear() hydrationClient.clear() @@ -330,9 +330,11 @@ describe('dehydration and rehydration', () => { const hydrationClient = new QueryClient({ queryCache: hydrationCache }) hydrate(hydrationClient, parsed) - expect(hydrationCache.find({ queryKey: successKey })).toBeTruthy() - expect(hydrationCache.find({ queryKey: loadingKey })).toBeFalsy() - expect(hydrationCache.find({ queryKey: errorKey })).toBeFalsy() + expect(hydrationCache.find({ queryKey: successKey })?.state.data).toBe( + 'success', + ) + expect(hydrationCache.find({ queryKey: loadingKey })).toBeUndefined() + expect(hydrationCache.find({ queryKey: errorKey })).toBeUndefined() queryClient.clear() hydrationClient.clear() diff --git a/packages/query-core/src/__tests__/queriesObserver.test.tsx b/packages/query-core/src/__tests__/queriesObserver.test.tsx index 171d1493c7e..4e940fca409 100644 --- a/packages/query-core/src/__tests__/queriesObserver.test.tsx +++ b/packages/query-core/src/__tests__/queriesObserver.test.tsx @@ -149,7 +149,9 @@ describe('queriesObserver', () => { const queryCache = queryClient.getQueryCache() expect(queryCache.find({ queryKey: key1, type: 'active' })).toBeUndefined() - expect(queryCache.find({ queryKey: key2, type: 'active' })).toBeDefined() + expect( + queryCache.find({ queryKey: key2, type: 'active' })?.queryKey, + ).toEqual(key2) unsubscribe() expect(queryCache.find({ queryKey: key1, type: 'active' })).toBeUndefined() expect(queryCache.find({ queryKey: key2, type: 'active' })).toBeUndefined() diff --git a/packages/query-core/src/__tests__/query.test.tsx b/packages/query-core/src/__tests__/query.test.tsx index ac4c10ea5b0..fdac03e3987 100644 --- a/packages/query-core/src/__tests__/query.test.tsx +++ b/packages/query-core/src/__tests__/query.test.tsx @@ -279,7 +279,6 @@ describe('query', () => { expect(queryFn).toHaveBeenCalledTimes(1) const args = queryFn.mock.calls[0]![0] - expect(args).toBeDefined() expect(args.pageParam).toBeUndefined() expect(args.queryKey).toEqual(key) expect(args.signal).toBeInstanceOf(AbortSignal) @@ -601,9 +600,9 @@ describe('query', () => { queryFn: () => 'data', gcTime: 0, }) - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.status).toBe('pending') const unsubscribe = observer.subscribe(() => undefined) - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.status).toBe('pending') unsubscribe() await vi.advanceTimersByTimeAsync(0) @@ -619,11 +618,11 @@ describe('query', () => { }) const unsubscribe = observer.subscribe(() => undefined) await vi.advanceTimersByTimeAsync(20) - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('data') observer.refetch() unsubscribe() // unsubscribe should not remove even though gcTime has elapsed b/c query is still fetching - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('data') // should be removed after an additional staleTime wait await vi.advanceTimersByTimeAsync(30) expect(queryCache.find({ queryKey: key })).toBeUndefined() @@ -636,16 +635,16 @@ describe('query', () => { queryFn: () => 'data', gcTime: 0, }) - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.status).toBe('pending') const unsubscribe = observer.subscribe(() => undefined) await vi.advanceTimersByTimeAsync(100) - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('data') unsubscribe() await vi.advanceTimersByTimeAsync(100) expect(queryCache.find({ queryKey: key })).toBeUndefined() queryClient.setQueryData(key, 'data') await vi.advanceTimersByTimeAsync(100) - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('data') }) it('should return proper count of observers', () => { @@ -1103,9 +1102,9 @@ describe('query', () => { expect(queryFn).toHaveBeenCalledTimes(1) expect(query.state.status).toBe('error') - expect( - query.state.error?.message.includes('Maximum call stack size exceeded'), - ).toBeTruthy() + expect(query.state.error?.message).toContain( + 'Maximum call stack size exceeded', + ) expect(consoleMock).toHaveBeenCalledWith( expect.stringContaining( diff --git a/packages/query-core/src/__tests__/queryCache.test.tsx b/packages/query-core/src/__tests__/queryCache.test.tsx index f381bcbccf1..307cb2d987c 100644 --- a/packages/query-core/src/__tests__/queryCache.test.tsx +++ b/packages/query-core/src/__tests__/queryCache.test.tsx @@ -72,8 +72,9 @@ describe('queryCache', () => { 'observerResultsUpdated', // 8. Observer result updated -> stale ]) + const cachedQuery = queryCache.find({ queryKey: key }) queries.forEach((query) => { - expect(query).toBeDefined() + expect(query).toBe(cachedQuery) }) unsubscribe() @@ -161,7 +162,7 @@ describe('queryCache', () => { }) await vi.advanceTimersByTimeAsync(100) const query = queryCache.find({ queryKey: key })! - expect(query).toBeDefined() + expect(query.state.data).toBe('data1') }) it('find should filter correctly with exact set to false', async () => { @@ -172,7 +173,7 @@ describe('queryCache', () => { }) await vi.advanceTimersByTimeAsync(100) const query = queryCache.find({ queryKey: key, exact: false })! - expect(query).toBeDefined() + expect(query.state.data).toBe('data1') }) }) diff --git a/packages/query-core/src/__tests__/queryClient.test.tsx b/packages/query-core/src/__tests__/queryClient.test.tsx index 2ed4c4c193a..3c2822130a8 100644 --- a/packages/query-core/src/__tests__/queryClient.test.tsx +++ b/packages/query-core/src/__tests__/queryClient.test.tsx @@ -965,9 +965,9 @@ describe('queryClient', () => { queryFn: () => 'data', gcTime: 10, }) - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('data') await vi.advanceTimersByTimeAsync(15) - expect(queryCache.find({ queryKey: key })).not.toBeDefined() + expect(queryCache.find({ queryKey: key })).toBeUndefined() }) }) @@ -979,7 +979,7 @@ describe('queryClient', () => { // check the query was added to the cache await queryClient.prefetchQuery({ queryKey: key, queryFn: fetchFn }) - expect(queryCache.find({ queryKey: key })).toBeTruthy() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('data') // check the error doesn't occur expect(() => @@ -987,7 +987,7 @@ describe('queryClient', () => { ).not.toThrow() // check query was successful removed - expect(queryCache.find({ queryKey: key })).toBeFalsy() + expect(queryCache.find({ queryKey: key })).toBeUndefined() }) }) @@ -1638,7 +1638,6 @@ describe('queryClient', () => { state = queryClient.getQueryState(key) - expect(state).toBeTruthy() expect(state?.data).toBeUndefined() expect(state?.status).toEqual('pending') expect(state?.fetchStatus).toEqual('idle') @@ -1660,7 +1659,6 @@ describe('queryClient', () => { state = queryClient.getQueryState(key) - expect(state).toBeTruthy() expect(state?.data).toEqual('initial') }) @@ -1936,7 +1934,7 @@ describe('queryClient', () => { // still paused because we are still offline expect( newQueryClient.getMutationCache().getAll()[0]?.state.isPaused, - ).toBeTruthy() + ).toBe(true) await newQueryClient.resumePausedMutations() From e330cee1068733354c8e096a7108365ae616cd1b Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 27 Jul 2026 00:56:47 +0900 Subject: [PATCH 84/97] test(angular-query): replace 'toBeDefined' with exact-value assertion (#11121) test(angular-query): assert exact values instead of loose matchers --- .../src/__tests__/inject-mutation.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts b/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts index f0c53602b1d..00d5190ce01 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts @@ -382,8 +382,7 @@ describe('injectMutation', () => { const text = debugElement.query(By.css('span')).nativeElement.textContent expect(text).toEqual('value') const mutation = mutationCache.find({ mutationKey: ['fake', 'value'] }) - expect(mutation).toBeDefined() - expect(mutation!.options.mutationKey).toStrictEqual(['fake', 'value']) + expect(mutation?.options.mutationKey).toStrictEqual(['fake', 'value']) }) it('should update options on required signal input change', async () => { From f99c105e8a3c36cf8546c45255bfe95514f478b1 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 27 Jul 2026 00:57:13 +0900 Subject: [PATCH 85/97] test(lit-query): replace 'toBeDefined'/'toBeGreaterThan' with exact-value assertions (#11122) test(lit-query): assert exact values instead of loose matchers --- packages/lit-query/src/tests/counters-and-state.test.ts | 5 +++-- packages/lit-query/src/tests/infinite-and-options.test.ts | 5 +++-- packages/lit-query/src/tests/queries-controller.test.ts | 5 +++-- packages/lit-query/src/tests/query-controller.test.ts | 8 ++++---- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/lit-query/src/tests/counters-and-state.test.ts b/packages/lit-query/src/tests/counters-and-state.test.ts index d2b14739f4a..e81baa5a751 100644 --- a/packages/lit-query/src/tests/counters-and-state.test.ts +++ b/packages/lit-query/src/tests/counters-and-state.test.ts @@ -272,8 +272,9 @@ describe('useIsFetching/useIsMutating/useMutationState', () => { await waitFor(() => consumer.isMutating() === 0) expect( - explicitClient.getQueryCache().find({ queryKey: consumer.queryKey }), - ).toBeDefined() + explicitClient.getQueryCache().find({ queryKey: consumer.queryKey }) + ?.state.data, + ).toBe('query-ok') expect( providerClient.getQueryCache().find({ queryKey: consumer.queryKey }), ).toBeUndefined() diff --git a/packages/lit-query/src/tests/infinite-and-options.test.ts b/packages/lit-query/src/tests/infinite-and-options.test.ts index 701ea5e34c4..85b7022231e 100644 --- a/packages/lit-query/src/tests/infinite-and-options.test.ts +++ b/packages/lit-query/src/tests/infinite-and-options.test.ts @@ -118,8 +118,9 @@ describe('createInfiniteQueryController', () => { await waitFor(() => consumer.infinite().isSuccess) expect(consumer.infinite().data?.pages).toEqual([0]) expect( - explicitClient.getQueryCache().find({ queryKey: consumer.queryKey }), - ).toBeDefined() + explicitClient.getQueryCache().find({ queryKey: consumer.queryKey }) + ?.state.data, + ).toEqual({ pages: [0], pageParams: [0] }) expect( providerClient.getQueryCache().find({ queryKey: consumer.queryKey }), ).toBeUndefined() diff --git a/packages/lit-query/src/tests/queries-controller.test.ts b/packages/lit-query/src/tests/queries-controller.test.ts index 67f6c5456bb..f651b2b42a8 100644 --- a/packages/lit-query/src/tests/queries-controller.test.ts +++ b/packages/lit-query/src/tests/queries-controller.test.ts @@ -179,8 +179,9 @@ describe('createQueriesController', () => { ) expect( - explicitClient.getQueryCache().find({ queryKey: consumer.queryKeys[0]! }), - ).toBeDefined() + explicitClient.getQueryCache().find({ queryKey: consumer.queryKeys[0]! }) + ?.state.data, + ).toBe('alpha') expect( providerClient.getQueryCache().find({ queryKey: consumer.queryKeys[0]! }), ).toBeUndefined() diff --git a/packages/lit-query/src/tests/query-controller.test.ts b/packages/lit-query/src/tests/query-controller.test.ts index d8261e585c9..43e0bfb4055 100644 --- a/packages/lit-query/src/tests/query-controller.test.ts +++ b/packages/lit-query/src/tests/query-controller.test.ts @@ -1154,7 +1154,7 @@ describe('createQueryController', () => { await waitFor(() => query().isSuccess) const cacheQuery = client.getQueryCache().find({ queryKey }) - expect(cacheQuery).toBeDefined() + expect(cacheQuery?.state.data).toEqual(['a', 'b']) expect(cacheQuery?.getObserversCount()).toBe(1) host.disconnect() @@ -1196,8 +1196,8 @@ describe('createQueryController', () => { await consumer.updateComplete await waitFor(() => consumer.query().isSuccess) - expect(consumer.query().data).toBeDefined() - expect(consumer.queryCalls).toBeGreaterThan(0) + expect(consumer.queryCalls).toBe(1) + expect(consumer.query().data).toBe('value-1') consumer.query.destroy() provider.remove() @@ -1232,7 +1232,7 @@ describe('createQueryController', () => { await consumer.updateComplete await waitFor(() => consumer.query().isSuccess) - expect(consumer.query().data).toBeDefined() + expect(consumer.query().data).toBe('value-1') consumer.query.destroy() provider.remove() From fbe532c4772f56d59d7947c3932bb6ccf27717f2 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 27 Jul 2026 00:57:58 +0900 Subject: [PATCH 86/97] test({react,preact}-query): replace 'toBeDefined'/'toBeFalsy' with exact-value assertions (#11123) test({react,preact}-query): assert exact values instead of loose matchers --- .../src/__tests__/QueryClientProvider.test.tsx | 11 +++++------ .../src/__tests__/mutationOptions.test.tsx | 1 - .../src/__tests__/useSuspenseQuery.test.tsx | 2 +- .../src/__tests__/QueryClientProvider.test.tsx | 11 +++++------ .../src/__tests__/mutationOptions.test.tsx | 1 - .../src/__tests__/useSuspenseQuery.test.tsx | 2 +- 6 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/preact-query/src/__tests__/QueryClientProvider.test.tsx b/packages/preact-query/src/__tests__/QueryClientProvider.test.tsx index c6ba18d989a..010d3f7e24e 100644 --- a/packages/preact-query/src/__tests__/QueryClientProvider.test.tsx +++ b/packages/preact-query/src/__tests__/QueryClientProvider.test.tsx @@ -47,7 +47,7 @@ describe('QueryClientProvider', () => { await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('test')).toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('test') }) it('allows multiple caches to be partitioned', async () => { @@ -100,10 +100,10 @@ describe('QueryClientProvider', () => { expect(rendered.getByText('test1')).toBeInTheDocument() expect(rendered.getByText('test2')).toBeInTheDocument() - expect(queryCache1.find({ queryKey: key1 })).toBeDefined() - expect(queryCache1.find({ queryKey: key2 })).not.toBeDefined() - expect(queryCache2.find({ queryKey: key1 })).not.toBeDefined() - expect(queryCache2.find({ queryKey: key2 })).toBeDefined() + expect(queryCache1.find({ queryKey: key1 })?.state.data).toBe('test1') + expect(queryCache1.find({ queryKey: key2 })).toBeUndefined() + expect(queryCache2.find({ queryKey: key1 })).toBeUndefined() + expect(queryCache2.find({ queryKey: key2 })?.state.data).toBe('test2') }) it("uses defaultOptions for queries when they don't provide their own config", async () => { @@ -141,7 +141,6 @@ describe('QueryClientProvider', () => { await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('test')).toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeDefined() expect(queryCache.find({ queryKey: key })?.options.gcTime).toBe(Infinity) }) diff --git a/packages/preact-query/src/__tests__/mutationOptions.test.tsx b/packages/preact-query/src/__tests__/mutationOptions.test.tsx index 8b3864b4688..5972fc4d357 100644 --- a/packages/preact-query/src/__tests__/mutationOptions.test.tsx +++ b/packages/preact-query/src/__tests__/mutationOptions.test.tsx @@ -532,6 +532,5 @@ describe('mutationOptions', () => { await vi.advanceTimersByTimeAsync(11) expect(mutationStateArray.length).toEqual(1) expect(mutationStateArray[0]?.data).toEqual('data1') - expect(mutationStateArray[1]).toBeFalsy() }) }) diff --git a/packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx b/packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx index 8ea07b85252..8397312bb60 100644 --- a/packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx +++ b/packages/preact-query/src/__tests__/useSuspenseQuery.test.tsx @@ -206,7 +206,7 @@ describe('useSuspenseQuery', () => { expect(rendered.queryByText('loading')).not.toBeInTheDocument() expect(rendered.queryByText('rendered')).not.toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeFalsy() + expect(queryCache.find({ queryKey: key })).toBeUndefined() fireEvent.click(rendered.getByLabelText('toggle')) expect(rendered.getByText('loading')).toBeInTheDocument() diff --git a/packages/react-query/src/__tests__/QueryClientProvider.test.tsx b/packages/react-query/src/__tests__/QueryClientProvider.test.tsx index 71f80595680..9488d356a7c 100644 --- a/packages/react-query/src/__tests__/QueryClientProvider.test.tsx +++ b/packages/react-query/src/__tests__/QueryClientProvider.test.tsx @@ -46,7 +46,7 @@ describe('QueryClientProvider', () => { await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('test')).toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeDefined() + expect(queryCache.find({ queryKey: key })?.state.data).toBe('test') }) it('allows multiple caches to be partitioned', async () => { @@ -99,10 +99,10 @@ describe('QueryClientProvider', () => { expect(rendered.getByText('test1')).toBeInTheDocument() expect(rendered.getByText('test2')).toBeInTheDocument() - expect(queryCache1.find({ queryKey: key1 })).toBeDefined() - expect(queryCache1.find({ queryKey: key2 })).not.toBeDefined() - expect(queryCache2.find({ queryKey: key1 })).not.toBeDefined() - expect(queryCache2.find({ queryKey: key2 })).toBeDefined() + expect(queryCache1.find({ queryKey: key1 })?.state.data).toBe('test1') + expect(queryCache1.find({ queryKey: key2 })).toBeUndefined() + expect(queryCache2.find({ queryKey: key1 })).toBeUndefined() + expect(queryCache2.find({ queryKey: key2 })?.state.data).toBe('test2') }) it("uses defaultOptions for queries when they don't provide their own config", async () => { @@ -140,7 +140,6 @@ describe('QueryClientProvider', () => { await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('test')).toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeDefined() expect(queryCache.find({ queryKey: key })?.options.gcTime).toBe(Infinity) }) diff --git a/packages/react-query/src/__tests__/mutationOptions.test.tsx b/packages/react-query/src/__tests__/mutationOptions.test.tsx index 45129a398d0..7d0b034812c 100644 --- a/packages/react-query/src/__tests__/mutationOptions.test.tsx +++ b/packages/react-query/src/__tests__/mutationOptions.test.tsx @@ -522,6 +522,5 @@ describe('mutationOptions', () => { await vi.advanceTimersByTimeAsync(11) expect(mutationStateArray.length).toEqual(1) expect(mutationStateArray[0]?.data).toEqual('data1') - expect(mutationStateArray[1]).toBeFalsy() }) }) diff --git a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx index bb83983bef3..4a7df3a2a62 100644 --- a/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx +++ b/packages/react-query/src/__tests__/useSuspenseQuery.test.tsx @@ -192,7 +192,7 @@ describe('useSuspenseQuery', () => { expect(rendered.queryByText('loading')).not.toBeInTheDocument() expect(rendered.queryByText('rendered')).not.toBeInTheDocument() - expect(queryCache.find({ queryKey: key })).toBeFalsy() + expect(queryCache.find({ queryKey: key })).toBeUndefined() fireEvent.click(rendered.getByLabelText('toggle')) expect(rendered.getByText('loading')).toBeInTheDocument() From 5972ae6e11530fd90704cf8ffb606e76bf46839f Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Mon, 27 Jul 2026 00:58:26 +0900 Subject: [PATCH 87/97] test(svelte-query): replace 'toBeDefined' with exact-value assertion (#11124) test(svelte-query): assert exact values instead of loose matchers --- .../QueryClientProvider/QueryClientProvider.svelte.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte-query/tests/QueryClientProvider/QueryClientProvider.svelte.test.ts b/packages/svelte-query/tests/QueryClientProvider/QueryClientProvider.svelte.test.ts index 8db232d9a3d..a8b338bbfad 100644 --- a/packages/svelte-query/tests/QueryClientProvider/QueryClientProvider.svelte.test.ts +++ b/packages/svelte-query/tests/QueryClientProvider/QueryClientProvider.svelte.test.ts @@ -28,6 +28,6 @@ describe('QueryClientProvider', () => { await vi.advanceTimersByTimeAsync(10) expect(rendered.getByText('Data: test')).toBeInTheDocument() - expect(queryCache.find({ queryKey: ['hello'] })).toBeDefined() + expect(queryCache.find({ queryKey: ['hello'] })?.state.data).toBe('test') }) }) From e396148c07437174e08e2deca703b5ca87068c26 Mon Sep 17 00:00:00 2001 From: ChangJun Park <40492343+ckdwns9121@users.noreply.github.com> Date: Mon, 27 Jul 2026 01:54:54 +0900 Subject: [PATCH 88/97] test(query-devtools/Devtools): add test for rendering a hydrated query with a custom hash function (#11055) * 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 * test(query-devtools/Devtools): use 'advanceTimersByTimeAsync' for consistency and remove redundant 'clear' * test(query-devtools/Devtools): move custom-hash hydration test to the end of 'query list' * test(query-devtools/Devtools): align custom-hash test title with the 'when X' convention --------- Co-authored-by: Wonsuk Choi --- .../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 5ed22c71816..f73024502c6 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' @@ -310,6 +316,25 @@ describe('Devtools', () => { window.removeEventListener('@tanstack/query-devtools-event', listener) } }) + + it('should render a query row when a hydrated query uses a custom hash function', async () => { + queryClient.fetchQuery({ + queryKey: ['posts'], + queryFn: () => [{ id: 1 }], + queryKeyHashFn: () => 'custom-posts-hash', + }) + await vi.advanceTimersByTimeAsync(0) + const dehydratedState = dehydrate(queryClient) + + queryClient = new QueryClient() + hydrate(queryClient, dehydratedState) + + const rendered = renderDevtools({ initialIsOpen: true }) + + expect( + rendered.getByLabelText(/Query key custom-posts-hash/), + ).toBeInTheDocument() + }) }) describe('view toggle', () => { From 75b2d101f02ffc9deefce7aedf3596d9c2cb3167 Mon Sep 17 00:00:00 2001 From: kinsk2839 Date: Tue, 28 Jul 2026 11:29:09 +0900 Subject: [PATCH 89/97] test(svelte-query/createQuery): replace 'toBeDefined' with exact-value assertion (#11126) * test(svelte-query/createQuery): assert exact queryKey instead of loose 'toBeDefined' * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../tests/createQuery/createQuery.svelte.test.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/svelte-query/tests/createQuery/createQuery.svelte.test.ts b/packages/svelte-query/tests/createQuery/createQuery.svelte.test.ts index 965eeb37c7c..3168f732962 100644 --- a/packages/svelte-query/tests/createQuery/createQuery.svelte.test.ts +++ b/packages/svelte-query/tests/createQuery/createQuery.svelte.test.ts @@ -1607,12 +1607,16 @@ describe('createQuery', () => { () => currentClient, ) - expect(queryClient1.getQueryCache().find({ queryKey: key })).toBeDefined() + expect( + queryClient1.getQueryCache().find({ queryKey: key })?.queryKey, + ).toEqual(key) currentClient = queryClient2 flushSync() - expect(queryClient2.getQueryCache().find({ queryKey: key })).toBeDefined() + expect( + queryClient2.getQueryCache().find({ queryKey: key })?.queryKey, + ).toEqual(key) }), ) From 9d24c455453b965511472a8251d68e2ae02c96e0 Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 29 Jul 2026 10:03:48 +0900 Subject: [PATCH 90/97] test(react-query/useQuery.promise): unskip 'cancelQueries' while suspending test by keeping 'queryFn' in-flight (#10910) * test(react-query/useQuery.promise): unskip 'cancelQueries' while suspending test by keeping 'queryFn' in-flight * test(react-query/useQuery.promise): clarify why 'sleep' is extended in cancel-while-suspending test --- .../src/__tests__/useQuery.promise.test.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/react-query/src/__tests__/useQuery.promise.test.tsx b/packages/react-query/src/__tests__/useQuery.promise.test.tsx index 9847823892f..e93c7df5646 100644 --- a/packages/react-query/src/__tests__/useQuery.promise.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.promise.test.tsx @@ -788,14 +788,16 @@ describe('useQuery().promise', { timeout: 10_000 }, () => { expect(queryFn).toHaveBeenCalledOnce() }) - it.skip('should stay pending when canceled with cancelQueries while suspending until refetched', async () => { + it('should stay pending when canceled with cancelQueries while suspending until refetched', async () => { const renderStream = createRenderStream({ snapshotDOM: true }) const key = queryKey() - let count = 0 - const queryFn = vi.fn().mockImplementation(async () => { - await sleep(10) - return 'test' + count++ - }) + // `sleep` is longer than usual on purpose: with `shouldAdvanceTime`, the + // real time spent rendering and awaiting `takeRender` (~40ms) is added to + // the fake clock, so a shorter fetch would resolve before `cancel` can take + // effect. A longer fetch keeps the query in-flight when it is cancelled. + const queryFn = vi + .fn() + .mockImplementation(() => sleep(50).then(() => 'test')) const options = { queryKey: key, From 6efc6191233f1c317124ff834d4f7130c58d7a72 Mon Sep 17 00:00:00 2001 From: SiHyunLee Date: Sun, 2 Aug 2026 16:07:27 +0900 Subject: [PATCH 91/97] docs(CONTRIBUTING): replace 'npm run test' and 'npx nx' commands with 'pnpm' equivalents (#11095) docs(CONTRIBUTING): replace 'npm run test' and 'npx nx' command with 'pnpm' equivalents --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ed528282140..89206bf950b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -179,7 +179,7 @@ To run tests in a local environment, you should use `nx` commands from the root To run tests for **all packages**, run: ```bash -npm run test +pnpm run test ``` ### ✅ Run tests for a specific package @@ -187,13 +187,13 @@ npm run test To run tests for a specific package, use the following command: ```bash -npx nx run @tanstack/{package-name}:test:lib +pnpm nx run @tanstack/{package-name}:test:lib ``` For example: ```bash -npx nx run @tanstack/react-query:test:lib +pnpm nx run @tanstack/react-query:test:lib ``` ### ⚠️ Caution From 96fbd7d38e862eff50930efc131b26d8cfccf039 Mon Sep 17 00:00:00 2001 From: SiHyunLee Date: Sun, 2 Aug 2026 16:17:51 +0900 Subject: [PATCH 92/97] docs(CONTRIBUTING): remove stale gitpod one-click setup section (#11096) --- CONTRIBUTING.md | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 89206bf950b..4586591e2f8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -135,26 +135,6 @@ https://github.com/fulopkovacs/form/assets/43729152/9d35a3c3-8153-4e74-9cb2-af27 If you want to run an example without installing dependencies for the whole repo, just follow the instructions from the example's README.md file. It will then be run against the latest TanStack Query release. -## Online one-click setup - -You can use Gitpod (An Online open-source VS Code-like IDE that is free for Open Source) for developing online. With a single click it will start a workspace and automatically: - -- clone the `TanStack/query` repo. -- install all the dependencies in `/` and `/docs`. -- run below in the root(`/`) to Auto-build files. - - ```bash - npm start - ``` - -- run below in `/docs`. - - ```bash - npm run dev - ``` - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/TanStack/query) - ## Changesets This repo uses [Changesets](https://github.com/changesets/changesets) to automate releases. If your PR should release a new package version (patch, minor, or major), please run `pnpm changeset` and commit the file. If needed, changeset descriptions can be more descriptive, and will be included in the changelog. If your PR affects docs, examples, styles, etc., you probably don't need to generate a changeset. From 31c7f374e28081289ea4d3fae46a0792fc56e737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Melih=20Ar=C4=B1k?= <55915116+meliharik@users.noreply.github.com> Date: Sun, 2 Aug 2026 11:34:23 +0300 Subject: [PATCH 93/97] docs(angular-query): fix invalid imports and syntax error in guide examples (#11090) * docs(angular-query): fix three broken examples in the guides * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- docs/framework/angular/guides/disabling-queries.md | 2 +- docs/framework/angular/guides/query-functions.md | 5 ++++- docs/framework/angular/guides/query-retries.md | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/framework/angular/guides/disabling-queries.md b/docs/framework/angular/guides/disabling-queries.md index 35da0225dec..80b3c0a5237 100644 --- a/docs/framework/angular/guides/disabling-queries.md +++ b/docs/framework/angular/guides/disabling-queries.md @@ -70,7 +70,7 @@ export class TodosComponent { [//]: # 'Example3' ```angular-ts -import { skipToken, injectQuery } from '@tanstack/query-angular' +import { skipToken, injectQuery } from '@tanstack/angular-query-experimental' @Component({ selector: 'todos', diff --git a/docs/framework/angular/guides/query-functions.md b/docs/framework/angular/guides/query-functions.md index ae5f9e6c99c..b151869506f 100644 --- a/docs/framework/angular/guides/query-functions.md +++ b/docs/framework/angular/guides/query-functions.md @@ -8,7 +8,10 @@ ref: docs/framework/react/guides/query-functions.md ```ts injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchAllTodos })) -injectQuery(() => ({ queryKey: ['todos', todoId], queryFn: () => fetchTodoById(todoId) }) +injectQuery(() => ({ + queryKey: ['todos', todoId], + queryFn: () => fetchTodoById(todoId), +})) injectQuery(() => ({ queryKey: ['todos', todoId], queryFn: async () => { diff --git a/docs/framework/angular/guides/query-retries.md b/docs/framework/angular/guides/query-retries.md index 45228d10bbe..74aeef9a45f 100644 --- a/docs/framework/angular/guides/query-retries.md +++ b/docs/framework/angular/guides/query-retries.md @@ -33,7 +33,7 @@ const result = injectQuery(() => ({ import { QueryCache, QueryClient, - QueryClientProvider, + provideTanStackQuery, } from '@tanstack/angular-query-experimental' const queryClient = new QueryClient({ From 46d7f02f1c7b9fcd3255082cc7103e8bfa3dab76 Mon Sep 17 00:00:00 2001 From: Alem Tuzlak Date: Mon, 3 Aug 2026 13:43:19 +0200 Subject: [PATCH 94/97] docs: use the dynamic README header endpoint (#11136) * docs: use the dynamic README header endpoint * docs: add README header banners to the framework adapter packages --- README.md | 16 +++++++++++++++- media/header_query.png | Bin 197254 -> 0 bytes packages/angular-query-experimental/README.md | 16 +++++++++++++++- packages/lit-query/README.md | 17 +++++++++++++++++ packages/preact-query/README.md | 16 +++++++++++++++- packages/react-query/README.md | 16 +++++++++++++++- packages/solid-query/README.md | 16 +++++++++++++++- packages/vue-query/README.md | 17 +++++++++++++++++ 8 files changed, 109 insertions(+), 5 deletions(-) delete mode 100644 media/header_query.png diff --git a/README.md b/README.md index f21aeb51217..3e4b0598ad8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,21 @@
- TanStack Query + + + + TanStack Query +

diff --git a/media/header_query.png b/media/header_query.png deleted file mode 100644 index 96fe6e78fae1b5b5e1c27161668898f0e9b9ea75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197254 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 diff --git a/packages/angular-query-experimental/README.md b/packages/angular-query-experimental/README.md index 6ed2dfa05a8..53fea66deba 100644 --- a/packages/angular-query-experimental/README.md +++ b/packages/angular-query-experimental/README.md @@ -1,4 +1,18 @@ -![TanStack Query Header](https://github.com/TanStack/query/raw/main/media/repo-header.png) + + + + TanStack Angular Query + [![npm version](https://img.shields.io/npm/v/@tanstack/angular-query-experimental)](https://www.npmjs.com/package/@tanstack/angular-query-experimental) [![npm license](https://img.shields.io/npm/l/@tanstack/angular-query-experimental)](https://github.com/TanStack/query/blob/main/LICENSE) diff --git a/packages/lit-query/README.md b/packages/lit-query/README.md index c439074d806..49e903ab015 100644 --- a/packages/lit-query/README.md +++ b/packages/lit-query/README.md @@ -1,3 +1,20 @@ +
+ + + + TanStack Lit Query + +
# @tanstack/lit-query Lit adapter for `@tanstack/query-core` using Lit reactive controllers. diff --git a/packages/preact-query/README.md b/packages/preact-query/README.md index e9deefa8582..8c105035a3a 100644 --- a/packages/preact-query/README.md +++ b/packages/preact-query/README.md @@ -1,6 +1,20 @@ -![TanStack Query Header](https://github.com/TanStack/query/raw/main/media/repo-header.png) + + + + TanStack Preact Query + Hooks for fetching, caching and updating asynchronous data in Preact diff --git a/packages/react-query/README.md b/packages/react-query/README.md index 96bffea2f5d..fa10577496c 100644 --- a/packages/react-query/README.md +++ b/packages/react-query/README.md @@ -1,6 +1,20 @@ -![TanStack Query Header](https://github.com/TanStack/query/raw/main/media/repo-header.png) + + + + TanStack React Query + Hooks for fetching, caching and updating asynchronous data in React diff --git a/packages/solid-query/README.md b/packages/solid-query/README.md index 085229258f2..1f4e5d4f3fe 100644 --- a/packages/solid-query/README.md +++ b/packages/solid-query/README.md @@ -1,6 +1,20 @@ -![TanStack Query Header](https://github.com/TanStack/query/raw/main/media/repo-header.png) + + + + TanStack Solid Query + Hooks for fetching, caching and updating asynchronous data in Solid diff --git a/packages/vue-query/README.md b/packages/vue-query/README.md index e2d06dbdb85..bc30409f820 100644 --- a/packages/vue-query/README.md +++ b/packages/vue-query/README.md @@ -1,3 +1,20 @@ +
+ + + + TanStack Vue Query + +
[![Vue Query logo](https://raw.githubusercontent.com/TanStack/query/main/packages/vue-query/media/vue-query.png)](https://github.com/TanStack/query/tree/main/packages/vue-query) [![npm version](https://img.shields.io/npm/v/@tanstack/vue-query)](https://www.npmjs.com/package/@tanstack/vue-query) From 159982c80b844487054155c38ffc760fe4208daf Mon Sep 17 00:00:00 2001 From: Wonsuk Choi Date: Wed, 12 Aug 2026 10:03:07 +0900 Subject: [PATCH 95/97] docs(react-query/useQuery): document 'throwOnError' default value (#11156) * docs(react-query/useQuery): document 'throwOnError' default and its absence in suspense hooks * docs(react-query/useQuery): use framework-agnostic wording for suspense throwOnError note * docs(react-query/useQuery): remove inaccurate suspense-mode throwOnError note --- docs/framework/react/reference/useQuery.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/framework/react/reference/useQuery.md b/docs/framework/react/reference/useQuery.md index 569e19cb8f4..df9f12596a5 100644 --- a/docs/framework/react/reference/useQuery.md +++ b/docs/framework/react/reference/useQuery.md @@ -172,6 +172,8 @@ const { - Defaults to `true` - If set to `false`, this instance of `useQuery` will not be subscribed to the cache. This means it won't trigger the `queryFn` on its own, and it won't receive updates if data gets into cache by other means. - `throwOnError: undefined | boolean | (error: TError, query: Query) => boolean` + - Optional + - Defaults to `false` - Set this to `true` if you want errors to be thrown in the render phase and propagate to the nearest error boundary - Set this to `false` to disable `suspense`'s default behavior of throwing errors to the error boundary. - If set to a function, it will be passed the error and the query, and it should return a boolean indicating whether to show the error in an error boundary (`true`) or return the error as state (`false`) From 19c7623fe8200948db0a524450333aee28917d4b Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Wed, 12 Aug 2026 17:45:45 -0500 Subject: [PATCH 96/97] chore: upgrade to solid v2 rc, rename vite-plugin-solid, move branch to rc - Bump solid-js, @solidjs/web, @solidjs/signals and babel-preset-solid 2.0.0-beta.33 -> ^2.0.0-rc.0 across the solid packages, the solid-vite integration and the solid examples, switching these from exact pins to carets so the rc line is picked up as it moves - Rename vite-plugin-solid -> @solidjs/vite-plugin ^3.0.0-next.27 (the version published under both names) in every manifest, vite config and the hydration test fixture; packages/query-devtools stays on vite-plugin-solid ^2.11.6 since it is still on solid 1.x - Drop the now-redundant `-i vite-plugin-solid` sherif ignore, since the dependency no longer resolves to more than one version - Raise the solid-query peer floor to >=2.0.0-rc.0 <3.0.0; the broader >=2.0.0-beta.0 floors on solid-query-devtools and solid-query-persist-client are left as they are - Switch the changesets prerelease tag from beta to rc, and set the solid package versions to the 6.0.0-rc sentinel so the next `changeset version` lands on 6.0.0-rc.0 rather than continuing the beta counter into 6.0.0-rc.9 - No source changes were needed; solid-query, solid-query-devtools and solid-query-persist-client pass unchanged (336 tests, no type errors), as do the solid-vite integration and solid example vite builds Co-Authored-By: Claude Opus 5 --- .changeset/pre.json | 2 +- .changeset/solid-rc-upgrade.md | 7 + examples/solid/astro/package.json | 4 +- .../solid/basic-graphql-request/package.json | 8 +- .../basic-graphql-request/vite.config.ts | 2 +- examples/solid/basic/package.json | 8 +- examples/solid/basic/vite.config.ts | 2 +- .../solid/default-query-function/package.json | 8 +- .../default-query-function/vite.config.ts | 2 +- examples/solid/offline/package.json | 8 +- examples/solid/offline/vite.config.ts | 2 +- examples/solid/simple/package.json | 8 +- examples/solid/simple/vite.config.ts | 2 +- .../solid/solid-start-streaming/package.json | 4 +- integrations/solid-vite/package.json | 6 +- integrations/solid-vite/vite.config.js | 2 +- package.json | 2 +- packages/solid-query-devtools/package.json | 14 +- packages/solid-query-devtools/vite.config.ts | 2 +- .../solid-query-persist-client/package.json | 12 +- .../solid-query-persist-client/vite.config.ts | 2 +- packages/solid-query/package.json | 14 +- .../fixtures/hydration/build-and-render.mjs | 2 +- packages/solid-query/vite.config.ts | 2 +- pnpm-lock.yaml | 418 +++++++++--------- 25 files changed, 275 insertions(+), 268 deletions(-) create mode 100644 .changeset/solid-rc-upgrade.md diff --git a/.changeset/pre.json b/.changeset/pre.json index 09d3ae9f68c..16063022b9d 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,6 +1,6 @@ { "mode": "pre", - "tag": "beta", + "tag": "rc", "initialVersions": { "@tanstack/angular-query-experimental": "5.90.28", "@tanstack/angular-query-persist-client": "5.62.32", diff --git a/.changeset/solid-rc-upgrade.md b/.changeset/solid-rc-upgrade.md new file mode 100644 index 00000000000..f59fe707759 --- /dev/null +++ b/.changeset/solid-rc-upgrade.md @@ -0,0 +1,7 @@ +--- +'@tanstack/solid-query': patch +'@tanstack/solid-query-devtools': patch +'@tanstack/solid-query-persist-client': patch +--- + +chore: upgrade to solid v2 rc and rename `vite-plugin-solid` to `@solidjs/vite-plugin` diff --git a/examples/solid/astro/package.json b/examples/solid/astro/package.json index b0330292c5c..4c6c6ad19b7 100644 --- a/examples/solid/astro/package.json +++ b/examples/solid/astro/package.json @@ -18,8 +18,8 @@ "@tanstack/solid-query": "^6.0.0-beta.8", "@tanstack/solid-query-devtools": "^6.0.0-beta.8", "astro": "^5.5.6", - "@solidjs/web": "2.0.0-beta.33", - "solid-js": "2.0.0-beta.33", + "@solidjs/web": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "tailwindcss": "^3.4.7", "typescript": "5.8.3" } diff --git a/examples/solid/basic-graphql-request/package.json b/examples/solid/basic-graphql-request/package.json index d47eeb6e472..06ff71d3510 100644 --- a/examples/solid/basic-graphql-request/package.json +++ b/examples/solid/basic-graphql-request/package.json @@ -12,12 +12,12 @@ "@tanstack/solid-query-devtools": "^6.0.0-beta.8", "graphql": "^16.9.0", "graphql-request": "^7.1.2", - "@solidjs/web": "2.0.0-beta.33", - "solid-js": "2.0.0-beta.33" + "@solidjs/web": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.27", "typescript": "5.8.3", - "vite": "^6.4.1", - "vite-plugin-solid": "3.0.0-next.21" + "vite": "^6.4.1" } } diff --git a/examples/solid/basic-graphql-request/vite.config.ts b/examples/solid/basic-graphql-request/vite.config.ts index 4095d9be507..6a1fe32b00f 100644 --- a/examples/solid/basic-graphql-request/vite.config.ts +++ b/examples/solid/basic-graphql-request/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' export default defineConfig({ plugins: [solid()], diff --git a/examples/solid/basic/package.json b/examples/solid/basic/package.json index bb441f8102f..59469078b62 100644 --- a/examples/solid/basic/package.json +++ b/examples/solid/basic/package.json @@ -10,12 +10,12 @@ "dependencies": { "@tanstack/solid-query": "^6.0.0-beta.8", "@tanstack/solid-query-devtools": "^6.0.0-beta.8", - "@solidjs/web": "2.0.0-beta.33", - "solid-js": "2.0.0-beta.33" + "@solidjs/web": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.27", "typescript": "5.8.3", - "vite": "^6.4.1", - "vite-plugin-solid": "3.0.0-next.21" + "vite": "^6.4.1" } } diff --git a/examples/solid/basic/vite.config.ts b/examples/solid/basic/vite.config.ts index 4095d9be507..6a1fe32b00f 100644 --- a/examples/solid/basic/vite.config.ts +++ b/examples/solid/basic/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' export default defineConfig({ plugins: [solid()], diff --git a/examples/solid/default-query-function/package.json b/examples/solid/default-query-function/package.json index 94692545059..c2dea8d6d6b 100644 --- a/examples/solid/default-query-function/package.json +++ b/examples/solid/default-query-function/package.json @@ -10,12 +10,12 @@ "dependencies": { "@tanstack/solid-query": "^6.0.0-beta.8", "@tanstack/solid-query-devtools": "^6.0.0-beta.8", - "@solidjs/web": "2.0.0-beta.33", - "solid-js": "2.0.0-beta.33" + "@solidjs/web": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.27", "typescript": "5.8.3", - "vite": "^6.4.1", - "vite-plugin-solid": "3.0.0-next.21" + "vite": "^6.4.1" } } diff --git a/examples/solid/default-query-function/vite.config.ts b/examples/solid/default-query-function/vite.config.ts index 4095d9be507..6a1fe32b00f 100644 --- a/examples/solid/default-query-function/vite.config.ts +++ b/examples/solid/default-query-function/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' export default defineConfig({ plugins: [solid()], diff --git a/examples/solid/offline/package.json b/examples/solid/offline/package.json index b01fd17f49a..11362649a45 100644 --- a/examples/solid/offline/package.json +++ b/examples/solid/offline/package.json @@ -13,13 +13,13 @@ "@tanstack/solid-query-devtools": "^6.0.0-beta.8", "@tanstack/solid-query-persist-client": "^6.0.0-beta.8", "msw": "^2.6.6", - "@solidjs/web": "2.0.0-beta.33", - "solid-js": "2.0.0-beta.33" + "@solidjs/web": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.27", "typescript": "5.8.3", - "vite": "^6.4.1", - "vite-plugin-solid": "3.0.0-next.21" + "vite": "^6.4.1" }, "msw": { "workerDirectory": [ diff --git a/examples/solid/offline/vite.config.ts b/examples/solid/offline/vite.config.ts index 4095d9be507..6a1fe32b00f 100644 --- a/examples/solid/offline/vite.config.ts +++ b/examples/solid/offline/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' export default defineConfig({ plugins: [solid()], diff --git a/examples/solid/simple/package.json b/examples/solid/simple/package.json index 9a1369d8c6f..1afc53ebb4c 100644 --- a/examples/solid/simple/package.json +++ b/examples/solid/simple/package.json @@ -10,13 +10,13 @@ "dependencies": { "@tanstack/solid-query": "^6.0.0-beta.8", "@tanstack/solid-query-devtools": "^6.0.0-beta.8", - "@solidjs/web": "2.0.0-beta.33", - "solid-js": "2.0.0-beta.33" + "@solidjs/web": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0" }, "devDependencies": { + "@solidjs/vite-plugin": "^3.0.0-next.27", "@tanstack/eslint-plugin-query": "^5.101.0", "typescript": "5.8.3", - "vite": "^6.4.1", - "vite-plugin-solid": "3.0.0-next.21" + "vite": "^6.4.1" } } diff --git a/examples/solid/simple/vite.config.ts b/examples/solid/simple/vite.config.ts index 4095d9be507..6a1fe32b00f 100644 --- a/examples/solid/simple/vite.config.ts +++ b/examples/solid/simple/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' export default defineConfig({ plugins: [solid()], diff --git a/examples/solid/solid-start-streaming/package.json b/examples/solid/solid-start-streaming/package.json index e8f61f16f7d..cfd2feda78e 100644 --- a/examples/solid/solid-start-streaming/package.json +++ b/examples/solid/solid-start-streaming/package.json @@ -14,8 +14,8 @@ "@solidjs/start": "^1.1.3", "@tanstack/solid-query": "^6.0.0-beta.8", "@tanstack/solid-query-devtools": "^6.0.0-beta.8", - "@solidjs/web": "2.0.0-beta.33", - "solid-js": "2.0.0-beta.33", + "@solidjs/web": "^2.0.0-rc.0", + "solid-js": "^2.0.0-rc.0", "vinxi": "^0.5.3" }, "engines": { diff --git a/integrations/solid-vite/package.json b/integrations/solid-vite/package.json index cf7a26d1012..d8ca0feee37 100644 --- a/integrations/solid-vite/package.json +++ b/integrations/solid-vite/package.json @@ -8,9 +8,9 @@ "dependencies": { "@tanstack/solid-query": "workspace:*", "@tanstack/solid-query-devtools": "workspace:*", - "solid-js": "2.0.0-beta.33", + "solid-js": "^2.0.0-rc.0", "vite": "^6.4.1", - "vite-plugin-solid": "3.0.0-next.21", - "@solidjs/web": "2.0.0-beta.33" + "@solidjs/web": "^2.0.0-rc.0", + "@solidjs/vite-plugin": "^3.0.0-next.27" } } diff --git a/integrations/solid-vite/vite.config.js b/integrations/solid-vite/vite.config.js index 4095d9be507..6a1fe32b00f 100644 --- a/integrations/solid-vite/vite.config.js +++ b/integrations/solid-vite/vite.config.js @@ -1,5 +1,5 @@ import { defineConfig } from 'vite' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' export default defineConfig({ plugins: [solid()], diff --git a/package.json b/package.json index eaa0cb85530..8bf58562848 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "test:pr": "nx affected --targets=test:sherif,test:knip,test:docs,test:eslint,test:lib,test:types,test:build,build", "test:ci": "nx run-many --targets=test:sherif,test:knip,test:docs,test:eslint,test:lib,test:types,test:build,build", "test:eslint": "nx affected --target=test:eslint", - "test:sherif": "sherif -i typescript -i solid-js -i vite-plugin-solid -p \"./integrations/*\" -p \"./examples/*\"", + "test:sherif": "sherif -i typescript -i solid-js -p \"./integrations/*\" -p \"./examples/*\"", "test:size": "size-limit", "test:lib": "nx affected --target=test:lib --exclude=examples/**", "test:lib:dev": "pnpm run test:lib && nx watch --all -- pnpm run test:lib", diff --git a/packages/solid-query-devtools/package.json b/packages/solid-query-devtools/package.json index 5dd4faa6b99..8c4e09efb92 100644 --- a/packages/solid-query-devtools/package.json +++ b/packages/solid-query-devtools/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query-devtools", - "version": "6.0.0-beta.8", + "version": "6.0.0-rc", "description": "Developer tools to interact with and visualize the TanStack/solid-query Query cache", "author": "tannerlinsley", "license": "MIT", @@ -67,15 +67,15 @@ "devDependencies": { "@babel/core": "^7.28.0", "@babel/preset-typescript": "^7.18.6", - "@solidjs/signals": "^2.0.0-beta.33", + "@solidjs/signals": "^2.0.0-rc.0", "@solidjs/testing-library": "^0.8.10", - "@solidjs/web": "2.0.0-beta.33", + "@solidjs/vite-plugin": "^3.0.0-next.27", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/solid-query": "workspace:*", - "babel-preset-solid": "2.0.0-beta.33", + "babel-preset-solid": "^2.0.0-rc.0", "npm-run-all2": "^5.0.0", - "solid-js": "2.0.0-beta.33", - "tsup-preset-solid": "^2.2.0", - "vite-plugin-solid": "3.0.0-next.21" + "solid-js": "^2.0.0-rc.0", + "tsup-preset-solid": "^2.2.0" }, "peerDependencies": { "@tanstack/solid-query": "workspace:^", diff --git a/packages/solid-query-devtools/vite.config.ts b/packages/solid-query-devtools/vite.config.ts index 8d67b326d76..33086244308 100644 --- a/packages/solid-query-devtools/vite.config.ts +++ b/packages/solid-query-devtools/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import packageJson from './package.json' diff --git a/packages/solid-query-persist-client/package.json b/packages/solid-query-persist-client/package.json index d7afb8f14e9..0c8aa2bd49f 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": "6.0.0-beta.8", + "version": "6.0.0-rc", "description": "Solid.js bindings to work with persisters in TanStack/solid-query", "author": "tannerlinsley", "license": "MIT", @@ -69,14 +69,14 @@ "@babel/core": "^7.28.0", "@babel/preset-typescript": "^7.18.6", "@solidjs/testing-library": "^0.8.10", - "@solidjs/web": "2.0.0-beta.33", + "@solidjs/vite-plugin": "^3.0.0-next.27", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/query-test-utils": "workspace:*", "@tanstack/solid-query": "workspace:*", - "babel-preset-solid": "2.0.0-beta.33", + "babel-preset-solid": "^2.0.0-rc.0", "npm-run-all2": "^5.0.0", - "solid-js": "2.0.0-beta.33", - "tsup-preset-solid": "^2.2.0", - "vite-plugin-solid": "3.0.0-next.21" + "solid-js": "^2.0.0-rc.0", + "tsup-preset-solid": "^2.2.0" }, "peerDependencies": { "@tanstack/solid-query": "workspace:^", diff --git a/packages/solid-query-persist-client/vite.config.ts b/packages/solid-query-persist-client/vite.config.ts index 8d67b326d76..33086244308 100644 --- a/packages/solid-query-persist-client/vite.config.ts +++ b/packages/solid-query-persist-client/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import packageJson from './package.json' diff --git a/packages/solid-query/package.json b/packages/solid-query/package.json index 7be2840e5af..184e0dd34dd 100644 --- a/packages/solid-query/package.json +++ b/packages/solid-query/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-query", - "version": "6.0.0-beta.8", + "version": "6.0.0-rc", "description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid", "author": "tannerlinsley", "license": "MIT", @@ -71,15 +71,15 @@ "@babel/core": "^7.28.0", "@babel/preset-typescript": "^7.18.6", "@solidjs/testing-library": "^0.8.10", - "@solidjs/web": "2.0.0-beta.33", + "@solidjs/vite-plugin": "^3.0.0-next.27", + "@solidjs/web": "^2.0.0-rc.0", "@tanstack/query-test-utils": "workspace:*", - "babel-preset-solid": "2.0.0-beta.33", + "babel-preset-solid": "^2.0.0-rc.0", "npm-run-all2": "^5.0.0", - "solid-js": "2.0.0-beta.33", - "tsup-preset-solid": "^2.2.0", - "vite-plugin-solid": "3.0.0-next.21" + "solid-js": "^2.0.0-rc.0", + "tsup-preset-solid": "^2.2.0" }, "peerDependencies": { - "solid-js": ">=2.0.0-beta.33 <3.0.0" + "solid-js": ">=2.0.0-rc.0 <3.0.0" } } diff --git a/packages/solid-query/src/__tests__/fixtures/hydration/build-and-render.mjs b/packages/solid-query/src/__tests__/fixtures/hydration/build-and-render.mjs index 8ca257a33ba..066b023f886 100644 --- a/packages/solid-query/src/__tests__/fixtures/hydration/build-and-render.mjs +++ b/packages/solid-query/src/__tests__/fixtures/hydration/build-and-render.mjs @@ -10,7 +10,7 @@ import { execFileSync } from 'node:child_process' import * as path from 'node:path' import { fileURLToPath } from 'node:url' import { build } from 'vite' -import solidPlugin from 'vite-plugin-solid' +import solidPlugin from '@solidjs/vite-plugin' const fixtureDir = fileURLToPath(new URL('.', import.meta.url)) const packageRoot = path.join(fixtureDir, '..', '..', '..', '..') diff --git a/packages/solid-query/vite.config.ts b/packages/solid-query/vite.config.ts index 2a08cb8901f..5449c21e044 100644 --- a/packages/solid-query/vite.config.ts +++ b/packages/solid-query/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'vitest/config' -import solid from 'vite-plugin-solid' +import solid from '@solidjs/vite-plugin' import packageJson from './package.json' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e00ee0fa652..3ecc379f3c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1590,7 +1590,7 @@ importers: version: 9.5.5(astro@5.18.1(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@1.21.7)(lightningcss@1.32.0)(rollup@4.60.1)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.8.3)(yaml@2.8.3)) '@astrojs/solid-js': specifier: ^5.0.7 - version: 5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(solid-js@2.0.0-beta.33)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(solid-js@2.0.0-rc.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) '@astrojs/tailwind': specifier: ^6.0.2 version: 6.0.2(astro@5.18.1(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@1.21.7)(lightningcss@1.32.0)(rollup@4.60.1)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.8.3)(yaml@2.8.3))(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.3)) @@ -1598,8 +1598,8 @@ importers: specifier: ^8.1.3 version: 8.2.11(@sveltejs/kit@2.57.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.1)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.55.1)(typescript@5.8.3)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(astro@5.18.1(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@1.21.7)(lightningcss@1.32.0)(rollup@4.60.1)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.8.3)(yaml@2.8.3))(next@16.2.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.90.0))(react@19.2.4)(rollup@4.60.1)(svelte@5.55.1)(vue@3.5.31(typescript@5.8.3)) '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query @@ -1610,8 +1610,8 @@ importers: specifier: ^5.5.6 version: 5.18.1(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@1.21.7)(lightningcss@1.32.0)(rollup@4.60.1)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(typescript@5.8.3)(yaml@2.8.3) solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tailwindcss: specifier: ^3.4.7 version: 3.4.19(tsx@4.21.0)(yaml@2.8.3) @@ -1622,8 +1622,8 @@ importers: examples/solid/basic: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query @@ -1631,24 +1631,24 @@ importers: specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query-devtools solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) typescript: specifier: 5.8.3 version: 5.8.3 vite: specifier: ^6.4.1 version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) examples/solid/basic-graphql-request: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query @@ -1662,24 +1662,24 @@ importers: specifier: ^7.1.2 version: 7.4.0(graphql@16.13.2) solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) typescript: specifier: 5.8.3 version: 5.8.3 vite: specifier: ^6.4.1 version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) examples/solid/default-query-function: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query @@ -1687,24 +1687,24 @@ importers: specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query-devtools solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) typescript: specifier: 5.8.3 version: 5.8.3 vite: specifier: ^6.4.1 version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) examples/solid/offline: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/query-async-storage-persister': specifier: ^5.101.0 version: link:../../../packages/query-async-storage-persister @@ -1721,24 +1721,24 @@ importers: specifier: ^2.6.6 version: 2.12.14(@types/node@22.19.15)(typescript@5.8.3) solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) typescript: specifier: 5.8.3 version: 5.8.3 vite: specifier: ^6.4.1 version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) examples/solid/simple: dependencies: '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query @@ -1746,9 +1746,12 @@ importers: specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query-devtools solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 devDependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/eslint-plugin-query': specifier: ^5.101.0 version: link:../../../packages/eslint-plugin-query @@ -1758,24 +1761,21 @@ importers: vite: specifier: ^6.4.1 version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) examples/solid/solid-start-streaming: dependencies: '@solidjs/meta': specifier: ^0.29.4 - version: 0.29.4(solid-js@2.0.0-beta.33) + version: 0.29.4(solid-js@2.0.0-rc.0) '@solidjs/router': specifier: ^0.15.3 - version: 0.15.4(solid-js@2.0.0-beta.33) + version: 0.15.4(solid-js@2.0.0-rc.0) '@solidjs/start': specifier: ^1.1.3 - version: 1.3.2(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 1.3.2(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query @@ -1783,8 +1783,8 @@ importers: specifier: ^6.0.0-beta.8 version: link:../../../packages/solid-query-devtools solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vinxi: specifier: ^0.5.3 version: 0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) @@ -2392,9 +2392,12 @@ importers: integrations/solid-vite: dependencies: + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': specifier: workspace:* version: link:../../packages/solid-query @@ -2402,14 +2405,11 @@ importers: specifier: workspace:* version: link:../../packages/solid-query-devtools solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 vite: specifier: ^6.4.1 version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) integrations/svelte-vite: devDependencies: @@ -2955,28 +2955,28 @@ importers: version: 7.28.5(@babel/core@7.29.0) '@solidjs/testing-library': specifier: ^0.8.10 - version: 0.8.10(@solidjs/router@0.15.4(solid-js@2.0.0-beta.33))(solid-js@2.0.0-beta.33) + version: 0.8.10(@solidjs/router@0.15.4(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/query-test-utils': specifier: workspace:* version: link:../query-test-utils babel-preset-solid: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(@babel/core@7.29.0)(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) npm-run-all2: specifier: ^5.0.0 version: 5.0.2 solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tsup-preset-solid: specifier: ^2.2.0 - version: 2.2.0(esbuild@0.27.4)(solid-js@2.0.0-beta.33)(tsup@8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.2.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0)(tsup@8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)) packages/solid-query-devtools: dependencies: @@ -2991,32 +2991,32 @@ importers: specifier: ^7.18.6 version: 7.28.5(@babel/core@7.29.0) '@solidjs/signals': - specifier: ^2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 '@solidjs/testing-library': specifier: ^0.8.10 - version: 0.8.10(@solidjs/router@0.15.4(solid-js@2.0.0-beta.33))(solid-js@2.0.0-beta.33) + version: 0.8.10(@solidjs/router@0.15.4(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/solid-query': specifier: workspace:* version: link:../solid-query babel-preset-solid: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(@babel/core@7.29.0)(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) npm-run-all2: specifier: ^5.0.0 version: 5.0.2 solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tsup-preset-solid: specifier: ^2.2.0 - version: 2.2.0(esbuild@0.27.4)(solid-js@2.0.0-beta.33)(tsup@8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.2.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0)(tsup@8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)) packages/solid-query-persist-client: dependencies: @@ -3032,10 +3032,13 @@ importers: version: 7.28.5(@babel/core@7.29.0) '@solidjs/testing-library': specifier: ^0.8.10 - version: 0.8.10(@solidjs/router@0.15.4(solid-js@2.0.0-beta.33))(solid-js@2.0.0-beta.33) + version: 0.8.10(@solidjs/router@0.15.4(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0) + '@solidjs/vite-plugin': + specifier: ^3.0.0-next.27 + version: 3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@solidjs/web': - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(solid-js@2.0.0-rc.0) '@tanstack/query-test-utils': specifier: workspace:* version: link:../query-test-utils @@ -3043,20 +3046,17 @@ importers: specifier: workspace:* version: link:../solid-query babel-preset-solid: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33(@babel/core@7.29.0)(solid-js@2.0.0-beta.33) + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) npm-run-all2: specifier: ^5.0.0 version: 5.0.2 solid-js: - specifier: 2.0.0-beta.33 - version: 2.0.0-beta.33 + specifier: ^2.0.0-rc.0 + version: 2.0.0-rc.0 tsup-preset-solid: specifier: ^2.2.0 - version: 2.2.0(esbuild@0.27.4)(solid-js@2.0.0-beta.33)(tsup@8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)) - vite-plugin-solid: - specifier: 3.0.0-next.21 - version: 3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.2.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0)(tsup@8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)) packages/svelte-query: dependencies: @@ -4694,49 +4694,49 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@dom-expressions/babel-plugin-jsx@0.50.0-next.34': - resolution: {integrity: sha512-mcH1h/FgNkf9jatVCuU/tE9PUGRxQfT3862GXh+IbCcH9PKEbxQKoA3GsKpixsOmLVkbcW2auJxKIV8u8WacOw==} + '@dom-expressions/babel-plugin-jsx@0.50.0-next.41': + resolution: {integrity: sha512-JQnjahkQysfo5P5ahsOqtA1yN3GeAIaAke1FA4s/vy+ZEOpUHbI5IpdF43+RrVghoTcgtML9tEC0fINtJ4Cmpg==} peerDependencies: '@babel/core': ^7.20.12 - '@dom-expressions/babel-plugin-jsx@0.50.0-next.41': - resolution: {integrity: sha512-JQnjahkQysfo5P5ahsOqtA1yN3GeAIaAke1FA4s/vy+ZEOpUHbI5IpdF43+RrVghoTcgtML9tEC0fINtJ4Cmpg==} + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42': + resolution: {integrity: sha512-ol24x9RW8loPyOTzC/mQzh/zAsrsPxyTG4WRxxRlwzNK2uBWIBftWN5IwmSV51zDQa7JcT6sE6kkXFCLUvsYIQ==} peerDependencies: '@babel/core': ^7.20.12 - '@dom-expressions/compiler-darwin-arm64@0.50.0-next.34': - resolution: {integrity: sha512-MkIi1jWuVPaFoyM6qXlx3EPYXgUyySCDUJ/2zxpqzITW6/fkVvCQ++o2MrumgNFjQ/wxXdg8j0WMLcarnJ2H2Q==} + '@dom-expressions/compiler-darwin-arm64@0.50.0-next.40': + resolution: {integrity: sha512-+3aXdhw4SVt08fvgAsEM56ky/wdCVPXT0Wtxo164Cchgg7sapPsRqo8Gwwn0UU5AhVcEp3CIhdB5+pMoUicKFg==} cpu: [arm64] os: [darwin] - '@dom-expressions/compiler-darwin-x64@0.50.0-next.34': - resolution: {integrity: sha512-T7epwdLa+0WZBWvme3vHvYPz3Zc8APFsDAZh0N+OPlQywRjsIKymqP9Z5DAOScSIkZP3FERgThHk++vbv6pMhQ==} + '@dom-expressions/compiler-darwin-x64@0.50.0-next.40': + resolution: {integrity: sha512-Tbjg6ZQEIhKLKGd/Ep6MKqD76arPdV6SE2d3fkrP4qooIv2gYvAkvUw90qNdZxVHcuyjutrbJE0WpXYY9nSIIQ==} cpu: [x64] os: [darwin] - '@dom-expressions/compiler-linux-arm64-gnu@0.50.0-next.34': - resolution: {integrity: sha512-5Q9D+qPS/djpfRrMPxCkYKkSzIweFk72hpZcKdQnXNnttmj6pi7L4rp5ZzupX3XVGTsZGXIjjuirViysfjiIoQ==} + '@dom-expressions/compiler-linux-arm64-gnu@0.50.0-next.40': + resolution: {integrity: sha512-tIJMY8dPyjiYNSL5uc4JA5l88Sw0WoMwoAilqTTHpGYdCL5GwzGq6ZOV1bndw8XKEYFYfnTr276FDHyYpLtRYQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@dom-expressions/compiler-linux-x64-gnu@0.50.0-next.34': - resolution: {integrity: sha512-aPXMQM3KoZPOWv7AYBKz7oT9mUdPkLjJZoiYftua7AM59A4VJ+I6RvvXYnRNK28uk1zzt+IkZxrEKIQFOptDBg==} + '@dom-expressions/compiler-linux-x64-gnu@0.50.0-next.40': + resolution: {integrity: sha512-H/K/3Ykk8aCSNuKDlv/sgbPdSks+zqFxZ4mzqaGJmlDqEfeaWYXan5fsvwQbACdNDJeKoKLO4GhnlnKlKWjiJg==} cpu: [x64] os: [linux] libc: [glibc] - '@dom-expressions/compiler-wasm32-wasi@0.50.0-next.34': - resolution: {integrity: sha512-XpghiRyhrY5/Zxg5q1dcUCCNCSOqnNZQ1IX87MfwrDWdIZ3ZDaGrcCFUcT37veeZgzgbb3bpt5fSKwyN9VAq3w==} + '@dom-expressions/compiler-wasm32-wasi@0.50.0-next.40': + resolution: {integrity: sha512-2SAfc35FEvvxkUz2yeh/4aNx0s9waZnce4KS64oUMlVpYEFtNBdfnZKCB/bgzJFvTxXjMs+HcU6OInGltH5jHA==} engines: {node: '>=14.0.0'} - '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.34': - resolution: {integrity: sha512-4+RLrBo//1Ruok1GG1qIDv2wn0vRWIMi5lhphp6i6H0zwUTPgOLPY6ksMz8ZyEiAIh86jBTNiLj5rKCAU4pepQ==} + '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.40': + resolution: {integrity: sha512-bBdHMxdfUHtIrS5xrt9udqdGRnGKdYQgKxJNIts+Il3Fs8QGyNwaZpi0tjnlRjYa0+GdWEC3Gw1Pmq/HFXzFeQ==} cpu: [x64] os: [win32] - '@dom-expressions/compiler@0.50.0-next.34': - resolution: {integrity: sha512-XGlXicYgEKB2hesd37GT+HuctvbLRShd/G3ij2sxAIEEo6clza2jB64ZezyuuZY6iZn/QJwxAIyUVEChZ+Tl9g==} + '@dom-expressions/compiler@0.50.0-next.40': + resolution: {integrity: sha512-RI/kHU+QkLOHo4CQyqLTn9c7sAfl/GEULMsOpS1YqkPJgy7R8MCPWXFN4sI0QDBbM6ePtEyuW+2bsdsXqyxkzQ==} '@egjs/hammerjs@2.0.17': resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} @@ -7225,8 +7225,8 @@ packages: peerDependencies: solid-js: ^1.8.6 - '@solidjs/signals@2.0.0-beta.33': - resolution: {integrity: sha512-W+ftJ7bzIE+wfJnx2oM2fEFTejHTce+vKRP3PcopBFqoEFNLZKgnnXxXyyD65QZVNr/CPv2Z/Naa+NuzGHFvVg==} + '@solidjs/signals@2.0.0-rc.0': + resolution: {integrity: sha512-oKZSfvsCcKw1uJjOGbUkJ+OqlhXLHtZ+rShSyu9KH0lUH7UUwfMfsKeh81JPiQxDDg4YLhEwI38hg0JkwzTdvA==} '@solidjs/start@1.3.2': resolution: {integrity: sha512-tasDl3utVbtP0rr4InB3ntBIFV2upvEiFrOOCkRrAA3yBfjx9elpxnc94sJQXo65PNYdAAAkPIC6h93vLrtwHg==} @@ -7243,10 +7243,21 @@ packages: '@solidjs/router': optional: true - '@solidjs/web@2.0.0-beta.33': - resolution: {integrity: sha512-4wGUjG9jFGbI1dHHYBa8q/Z7w6ijFCNV99UsifQCDxo25ZH1kkK5qR6b2yU/mrKiKgdBbY0SBPcJGYMVIiSUBQ==} + '@solidjs/vite-plugin@3.0.0-next.27': + resolution: {integrity: sha512-wytjSKLe1YkUhi/TXr1yNOxZUjoajn3SILCF6TCHk7QJckrNRxddnsIIuzVbPbCm1icpkow75iIuF7EENBB7fQ==} peerDependencies: - solid-js: ^2.0.0-beta.33 + '@solidjs/web': '>=2.0.0-beta.32 <2.0.0-experimental.0' + '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* + solid-js: '>=2.0.0-beta.32 <2.0.0-experimental.0' + vite: ^6.4.1 + peerDependenciesMeta: + '@testing-library/jest-dom': + optional: true + + '@solidjs/web@2.0.0-rc.0': + resolution: {integrity: sha512-pYSaA9+dH8H1h/d/ZF/P2kR6omfzFGNcdzKhWTcg9fJghXhn8+5UrXUr2iYxDdYNOXZzxxFQhYHSJ7P4HKDqgw==} + peerDependencies: + solid-js: ^2.0.0-rc.0 '@speed-highlight/core@1.2.15': resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} @@ -8752,20 +8763,20 @@ packages: solid-js: optional: true - babel-preset-solid@2.0.0-beta.29: - resolution: {integrity: sha512-k3kDFDYdThcPZo5/PEIdZa+tYw/f4TVJomRjL7U2par3OWZxu49O3I9fHyezwEIfYjtyIyLygIKVfQ8Apu5wEg==} + babel-preset-solid@2.0.0-beta.33: + resolution: {integrity: sha512-YB1O8FBbIJ9GOAZ3AZrA5T3w86RjO5lPV/Oge8c5XccQYatjUtostD946JgKK/xO/7W7lwpWBjXhDJkKXnh8cQ==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^2.0.0-beta.29 + solid-js: ^2.0.0-beta.33 peerDependenciesMeta: solid-js: optional: true - babel-preset-solid@2.0.0-beta.33: - resolution: {integrity: sha512-YB1O8FBbIJ9GOAZ3AZrA5T3w86RjO5lPV/Oge8c5XccQYatjUtostD946JgKK/xO/7W7lwpWBjXhDJkKXnh8cQ==} + babel-preset-solid@2.0.0-rc.0: + resolution: {integrity: sha512-Ap2/QQY3pICj+Q0VM/RnIOpZo7e6icZnUA0oBJuhqzoCrljqMNo3eFb2OeEa4pUQeFREJOlex4Bt1ggwrcgC8w==} peerDependencies: '@babel/core': ^7.0.0 - solid-js: ^2.0.0-beta.33 + solid-js: ^2.0.0-rc.0 peerDependenciesMeta: solid-js: optional: true @@ -14792,8 +14803,8 @@ packages: solid-js@1.9.12: resolution: {integrity: sha512-QzKaSJq2/iDrWR1As6MHZQ8fQkdOBf8GReYb7L5iKwMGceg7HxDcaOHk0at66tNgn9U2U7dXo8ZZpLIAmGMzgw==} - solid-js@2.0.0-beta.33: - resolution: {integrity: sha512-nayHb+qIYS1PsyJwzN+zc4mJxdaptLWzWaHMCIU+zS/byrp1xaO5Vsl22meoPciDtafUmxoyO4TxnjwQQobNgQ==} + solid-js@2.0.0-rc.0: + resolution: {integrity: sha512-3enTJ71VL69nM5p/it2InVBDBt316Cqfij+F0S7VuHZLITc8YV7Rvavjoy52nAKKxYWXM+BcXh2K7KcLTf1zdQ==} solid-presence@0.1.8: resolution: {integrity: sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==} @@ -16000,17 +16011,6 @@ packages: '@testing-library/jest-dom': optional: true - vite-plugin-solid@3.0.0-next.21: - resolution: {integrity: sha512-N9NJtw87jbdcQHSmwK//bvTJpDdrcZJ8zWMko4y9dq+XPoip7kmgUZSK8hwG+d9qz8Z+WyC1fUcu78hpesbPzQ==} - peerDependencies: - '@solidjs/web': '>=2.0.0-beta.29 <2.0.0-experimental.0' - '@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.* - solid-js: '>=2.0.0-beta.29 <2.0.0-experimental.0' - vite: ^6.4.1 - peerDependenciesMeta: - '@testing-library/jest-dom': - optional: true - vite-prerender-plugin@0.5.13: resolution: {integrity: sha512-IKSpYkzDBsKAxa05naRbj7GvNVMSdww/Z/E89oO3xndz+gWnOBOKOAbEXv7qDhktY/j3vHgJmoV1pPzqU2tx9g==} peerDependencies: @@ -17115,11 +17115,11 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/solid-js@5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(solid-js@2.0.0-beta.33)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)': + '@astrojs/solid-js@5.1.3(@testing-library/jest-dom@6.9.1)(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(solid-js@2.0.0-rc.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)': dependencies: - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 vite: 6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-solid: 2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vite-plugin-solid: 2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - '@testing-library/jest-dom' - '@types/node' @@ -18599,7 +18599,7 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@dom-expressions/babel-plugin-jsx@0.50.0-next.34(@babel/core@7.29.0)': + '@dom-expressions/babel-plugin-jsx@0.50.0-next.41(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.18.6 @@ -18609,7 +18609,7 @@ snapshots: parse5: 7.3.0 validate-html-nesting: 1.2.4 - '@dom-expressions/babel-plugin-jsx@0.50.0-next.41(@babel/core@7.29.0)': + '@dom-expressions/babel-plugin-jsx@0.50.0-next.42(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.18.6 @@ -18619,36 +18619,36 @@ snapshots: parse5: 7.3.0 validate-html-nesting: 1.2.4 - '@dom-expressions/compiler-darwin-arm64@0.50.0-next.34': + '@dom-expressions/compiler-darwin-arm64@0.50.0-next.40': optional: true - '@dom-expressions/compiler-darwin-x64@0.50.0-next.34': + '@dom-expressions/compiler-darwin-x64@0.50.0-next.40': optional: true - '@dom-expressions/compiler-linux-arm64-gnu@0.50.0-next.34': + '@dom-expressions/compiler-linux-arm64-gnu@0.50.0-next.40': optional: true - '@dom-expressions/compiler-linux-x64-gnu@0.50.0-next.34': + '@dom-expressions/compiler-linux-x64-gnu@0.50.0-next.40': optional: true - '@dom-expressions/compiler-wasm32-wasi@0.50.0-next.34': + '@dom-expressions/compiler-wasm32-wasi@0.50.0-next.40': dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true - '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.34': + '@dom-expressions/compiler-win32-x64-msvc@0.50.0-next.40': optional: true - '@dom-expressions/compiler@0.50.0-next.34': + '@dom-expressions/compiler@0.50.0-next.40': optionalDependencies: - '@dom-expressions/compiler-darwin-arm64': 0.50.0-next.34 - '@dom-expressions/compiler-darwin-x64': 0.50.0-next.34 - '@dom-expressions/compiler-linux-arm64-gnu': 0.50.0-next.34 - '@dom-expressions/compiler-linux-x64-gnu': 0.50.0-next.34 - '@dom-expressions/compiler-wasm32-wasi': 0.50.0-next.34 - '@dom-expressions/compiler-win32-x64-msvc': 0.50.0-next.34 + '@dom-expressions/compiler-darwin-arm64': 0.50.0-next.40 + '@dom-expressions/compiler-darwin-x64': 0.50.0-next.40 + '@dom-expressions/compiler-linux-arm64-gnu': 0.50.0-next.40 + '@dom-expressions/compiler-linux-x64-gnu': 0.50.0-next.40 + '@dom-expressions/compiler-wasm32-wasi': 0.50.0-next.40 + '@dom-expressions/compiler-win32-x64-msvc': 0.50.0-next.40 '@egjs/hammerjs@2.0.17': dependencies: @@ -21148,22 +21148,22 @@ snapshots: dependencies: solid-js: 1.9.12 - '@solidjs/meta@0.29.4(solid-js@2.0.0-beta.33)': + '@solidjs/meta@0.29.4(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 '@solidjs/router@0.15.4(solid-js@1.9.12)': dependencies: solid-js: 1.9.12 optional: true - '@solidjs/router@0.15.4(solid-js@2.0.0-beta.33)': + '@solidjs/router@0.15.4(solid-js@2.0.0-rc.0)': dependencies: - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 - '@solidjs/signals@2.0.0-beta.33': {} + '@solidjs/signals@2.0.0-rc.0': {} - '@solidjs/start@1.3.2(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@solidjs/start@1.3.2(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@tanstack/server-functions-plugin': 1.121.21(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) @@ -21177,10 +21177,10 @@ snapshots: seroval-plugins: 1.5.1(seroval@1.5.1) shiki: 1.29.2 source-map-js: 1.2.1 - terracotta: 1.1.0(solid-js@2.0.0-beta.33) + terracotta: 1.1.0(solid-js@2.0.0-rc.0) tinyglobby: 0.2.15 vinxi: 0.5.11(@types/node@22.19.15)(@vercel/functions@2.2.13)(db0@0.3.4)(idb-keyval@6.2.2)(ioredis@5.10.1)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-solid: 2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vite-plugin-solid: 2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - '@testing-library/jest-dom' - solid-js @@ -21194,18 +21194,35 @@ snapshots: optionalDependencies: '@solidjs/router': 0.15.4(solid-js@1.9.12) - '@solidjs/testing-library@0.8.10(@solidjs/router@0.15.4(solid-js@2.0.0-beta.33))(solid-js@2.0.0-beta.33)': + '@solidjs/testing-library@0.8.10(@solidjs/router@0.15.4(solid-js@2.0.0-rc.0))(solid-js@2.0.0-rc.0)': dependencies: '@testing-library/dom': 10.4.1 - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 optionalDependencies: - '@solidjs/router': 0.15.4(solid-js@2.0.0-beta.33) + '@solidjs/router': 0.15.4(solid-js@2.0.0-rc.0) - '@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33)': + '@solidjs/vite-plugin@3.0.0-next.27(@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/core': 7.29.0 + '@dom-expressions/compiler': 0.50.0-next.40 + '@solidjs/web': 2.0.0-rc.0(solid-js@2.0.0-rc.0) + '@types/babel__core': 7.20.5 + babel-preset-solid: 2.0.0-beta.33(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) + merge-anything: 5.1.7 + solid-js: 2.0.0-rc.0 + vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vitefu: 1.1.2(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + optionalDependencies: + '@testing-library/jest-dom': 6.9.1 + transitivePeerDependencies: + - supports-color + + '@solidjs/web@2.0.0-rc.0(solid-js@2.0.0-rc.0)': dependencies: seroval: 1.5.6 seroval-plugins: 1.5.6(seroval@1.5.6) - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 '@speed-highlight/core@1.2.15': {} @@ -23361,26 +23378,26 @@ snapshots: optionalDependencies: solid-js: 1.9.12 - babel-preset-solid@1.9.12(@babel/core@7.29.0)(solid-js@2.0.0-beta.33): + babel-preset-solid@1.9.12(@babel/core@7.29.0)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.29.0 babel-plugin-jsx-dom-expressions: 0.40.6(@babel/core@7.29.0) optionalDependencies: - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 - babel-preset-solid@2.0.0-beta.29(@babel/core@7.29.0)(solid-js@2.0.0-beta.33): + babel-preset-solid@2.0.0-beta.33(@babel/core@7.29.0)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.29.0 - '@dom-expressions/babel-plugin-jsx': 0.50.0-next.34(@babel/core@7.29.0) + '@dom-expressions/babel-plugin-jsx': 0.50.0-next.41(@babel/core@7.29.0) optionalDependencies: - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 - babel-preset-solid@2.0.0-beta.33(@babel/core@7.29.0)(solid-js@2.0.0-beta.33): + babel-preset-solid@2.0.0-rc.0(@babel/core@7.29.0)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.29.0 - '@dom-expressions/babel-plugin-jsx': 0.50.0-next.41(@babel/core@7.29.0) + '@dom-expressions/babel-plugin-jsx': 0.50.0-next.42(@babel/core@7.29.0) optionalDependencies: - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 bail@2.0.2: {} @@ -24932,13 +24949,13 @@ snapshots: transitivePeerDependencies: - supports-color - esbuild-plugin-solid@0.5.0(esbuild@0.27.4)(solid-js@2.0.0-beta.33): + esbuild-plugin-solid@0.5.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0): dependencies: '@babel/core': 7.29.0 '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - babel-preset-solid: 1.9.12(@babel/core@7.29.0)(solid-js@2.0.0-beta.33) + babel-preset-solid: 1.9.12(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) esbuild: 0.27.4 - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - supports-color @@ -31018,9 +31035,9 @@ snapshots: seroval: 1.5.1 seroval-plugins: 1.5.1(seroval@1.5.1) - solid-js@2.0.0-beta.33: + solid-js@2.0.0-rc.0: dependencies: - '@solidjs/signals': 2.0.0-beta.33 + '@solidjs/signals': 2.0.0-rc.0 csstype: 3.2.3 seroval: 1.5.6 seroval-plugins: 1.5.6(seroval@1.5.6) @@ -31044,12 +31061,12 @@ snapshots: transitivePeerDependencies: - supports-color - solid-refresh@0.6.3(solid-js@2.0.0-beta.33): + solid-refresh@0.6.3(solid-js@2.0.0-rc.0): dependencies: '@babel/generator': 7.29.1 '@babel/helper-module-imports': 7.28.6 '@babel/types': 7.29.0 - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 transitivePeerDependencies: - supports-color @@ -31059,9 +31076,9 @@ snapshots: '@solid-primitives/transition-group': 1.1.2(solid-js@1.9.12) solid-js: 1.9.12 - solid-use@0.9.1(solid-js@2.0.0-beta.33): + solid-use@0.9.1(solid-js@2.0.0-rc.0): dependencies: - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 sort-by@1.2.0: dependencies: @@ -31574,10 +31591,10 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terracotta@1.1.0(solid-js@2.0.0-beta.33): + terracotta@1.1.0(solid-js@2.0.0-rc.0): dependencies: - solid-js: 2.0.0-beta.33 - solid-use: 0.9.1(solid-js@2.0.0-beta.33) + solid-js: 2.0.0-rc.0 + solid-use: 0.9.1(solid-js@2.0.0-rc.0) terser-webpack-plugin@1.4.6(webpack@4.47.0): dependencies: @@ -31793,9 +31810,9 @@ snapshots: - solid-js - supports-color - tsup-preset-solid@2.2.0(esbuild@0.27.4)(solid-js@2.0.0-beta.33)(tsup@8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)): + tsup-preset-solid@2.2.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0)(tsup@8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)): dependencies: - esbuild-plugin-solid: 0.5.0(esbuild@0.27.4)(solid-js@2.0.0-beta.33) + esbuild-plugin-solid: 0.5.0(esbuild@0.27.4)(solid-js@2.0.0-rc.0) tsup: 8.5.1(@microsoft/api-extractor@7.47.7(@types/node@22.19.15))(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3) transitivePeerDependencies: - esbuild @@ -32470,14 +32487,14 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.12(@babel/core@7.29.0)(solid-js@2.0.0-beta.33) + babel-preset-solid: 1.9.12(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) merge-anything: 5.1.7 - solid-js: 2.0.0-beta.33 - solid-refresh: 0.6.3(solid-js@2.0.0-beta.33) + solid-js: 2.0.0-rc.0 + solid-refresh: 0.6.3(solid-js@2.0.0-rc.0) vite: 6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) vitefu: 1.1.2(vite@6.4.1(@types/node@22.19.15)(jiti@1.21.7)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: @@ -32485,31 +32502,14 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-solid@2.11.11(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-rc.0)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@babel/core': 7.29.0 '@types/babel__core': 7.20.5 - babel-preset-solid: 1.9.12(@babel/core@7.29.0)(solid-js@2.0.0-beta.33) - merge-anything: 5.1.7 - solid-js: 2.0.0-beta.33 - solid-refresh: 0.6.3(solid-js@2.0.0-beta.33) - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vitefu: 1.1.2(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) - optionalDependencies: - '@testing-library/jest-dom': 6.9.1 - transitivePeerDependencies: - - supports-color - - vite-plugin-solid@3.0.0-next.21(@solidjs/web@2.0.0-beta.33(solid-js@2.0.0-beta.33))(@testing-library/jest-dom@6.9.1)(solid-js@2.0.0-beta.33)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/core': 7.29.0 - '@dom-expressions/compiler': 0.50.0-next.34 - '@solidjs/web': 2.0.0-beta.33(solid-js@2.0.0-beta.33) - '@types/babel__core': 7.20.5 - babel-preset-solid: 2.0.0-beta.29(@babel/core@7.29.0)(solid-js@2.0.0-beta.33) + babel-preset-solid: 1.9.12(@babel/core@7.29.0)(solid-js@2.0.0-rc.0) merge-anything: 5.1.7 - solid-js: 2.0.0-beta.33 + solid-js: 2.0.0-rc.0 + solid-refresh: 0.6.3(solid-js@2.0.0-rc.0) vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) vitefu: 1.1.2(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.90.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: From 606d09d369b4ff54514747b2bb49fe610d115e2e Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Wed, 12 Aug 2026 23:16:59 -0500 Subject: [PATCH 97/97] test(solid-query-devtools): stub devtools mount so the lazy UI import never starts The Test job failed post-merge with an EnvironmentTeardownError: mounting TanstackQueryDevtools(Panel) lazily imports the devtools UI, nothing in these synchronous tests awaits it, and on the slower CI agent the import was still in flight when vitest tore the environment down. Locally the import loses the race a different way: the UI chain pulls in @solid-primitives/transition-group, Solid 1 code that no longer resolves under this Solid 2 setup, surfacing as unhandled rejections. These tests only assert what the wrapper forwards to the instance, and the container element the style tests query is rendered by the wrapper itself, so mount() (and unmount(), which throws when nothing was really mounted) are stubbed in beforeEach. Rendered roots are now disposed via an explicit cleanup() before vi.restoreAllMocks(), because disposal calls unmount() and testing-library's automatic cleanup would otherwise run after the stub was already restored. Co-Authored-By: Claude Opus 5 --- .../src/__tests__/devtools.test.tsx | 16 +++++++++++++++- .../src/__tests__/devtoolsPanel.test.tsx | 17 ++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/solid-query-devtools/src/__tests__/devtools.test.tsx b/packages/solid-query-devtools/src/__tests__/devtools.test.tsx index b837c6663a1..7a80bef538d 100644 --- a/packages/solid-query-devtools/src/__tests__/devtools.test.tsx +++ b/packages/solid-query-devtools/src/__tests__/devtools.test.tsx @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { createSignal, flush } from 'solid-js' -import { render } from '@solidjs/testing-library' +import { cleanup, render } from '@solidjs/testing-library' import { QueryClient, QueryClientProvider } from '@tanstack/solid-query' import { TanstackQueryDevtools } from '@tanstack/query-devtools' import SolidQueryDevtools from '../devtools' @@ -16,9 +16,23 @@ describe('SolidQueryDevtools', () => { beforeEach(() => { queryClient = new QueryClient() + // Mounting the real devtools lazily imports the devtools UI, which is Solid + // 1 code that cannot resolve under this Solid 2 test setup. These tests only + // assert what the wrapper forwards to the instance, and the container + // element is rendered by the wrapper itself, so stub the mount out. + vi.spyOn(TanstackQueryDevtools.prototype, 'mount').mockImplementation( + () => {}, + ) + // ...and with nothing really mounted, the real unmount() would throw. + vi.spyOn(TanstackQueryDevtools.prototype, 'unmount').mockImplementation( + () => {}, + ) }) afterEach(() => { + // Dispose rendered roots before restoring mocks: disposal calls unmount() + // on the instance, which must still be the stub from beforeEach. + cleanup() vi.restoreAllMocks() }) diff --git a/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx b/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx index 9dfc25c88f9..9e774a309fd 100644 --- a/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx +++ b/packages/solid-query-devtools/src/__tests__/devtoolsPanel.test.tsx @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { render } from '@solidjs/testing-library' +import { cleanup, render } from '@solidjs/testing-library' import { flush } from 'solid-js' import { QueryClient, QueryClientProvider } from '@tanstack/solid-query' import { TanstackQueryDevtoolsPanel } from '@tanstack/query-devtools' @@ -10,9 +10,24 @@ describe('SolidQueryDevtoolsPanel', () => { beforeEach(() => { queryClient = new QueryClient() + // Mounting the real panel lazily imports the devtools UI, which is Solid 1 + // code that cannot resolve under this Solid 2 test setup. These tests only + // assert what the wrapper forwards to the instance, and the container + // element is rendered by the wrapper itself, so stub the mount out. + vi.spyOn(TanstackQueryDevtoolsPanel.prototype, 'mount').mockImplementation( + () => {}, + ) + // ...and with nothing really mounted, the real unmount() would throw. + vi.spyOn( + TanstackQueryDevtoolsPanel.prototype, + 'unmount', + ).mockImplementation(() => {}) }) afterEach(() => { + // Dispose rendered roots before restoring mocks: disposal calls unmount() + // on the instance, which must still be the stub from beforeEach. + cleanup() vi.restoreAllMocks() })