@tanstack/react-query 5.0.0-beta.9 → 5.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/build/codemods/coverage/clover.xml +2 -2
  2. package/build/codemods/coverage/index.html +1 -1
  3. package/build/legacy/HydrationBoundary.cjs +37 -2
  4. package/build/legacy/HydrationBoundary.cjs.map +1 -1
  5. package/build/legacy/HydrationBoundary.d.cts +3 -1
  6. package/build/legacy/HydrationBoundary.d.ts +3 -1
  7. package/build/legacy/HydrationBoundary.js +37 -2
  8. package/build/legacy/HydrationBoundary.js.map +1 -1
  9. package/build/legacy/index.cjs +3 -0
  10. package/build/legacy/index.cjs.map +1 -1
  11. package/build/legacy/index.d.cts +1 -0
  12. package/build/legacy/index.d.ts +1 -0
  13. package/build/legacy/index.js +2 -0
  14. package/build/legacy/index.js.map +1 -1
  15. package/build/legacy/queryOptions.cjs.map +1 -1
  16. package/build/legacy/queryOptions.d.cts +7 -3
  17. package/build/legacy/queryOptions.d.ts +7 -3
  18. package/build/legacy/queryOptions.js.map +1 -1
  19. package/build/legacy/suspense.cjs +3 -0
  20. package/build/legacy/suspense.cjs.map +1 -1
  21. package/build/legacy/suspense.d.cts +3 -2
  22. package/build/legacy/suspense.d.ts +3 -2
  23. package/build/legacy/suspense.js +2 -0
  24. package/build/legacy/suspense.js.map +1 -1
  25. package/build/legacy/types.cjs.map +1 -1
  26. package/build/legacy/types.d.cts +4 -4
  27. package/build/legacy/types.d.ts +4 -4
  28. package/build/legacy/useQueries.cjs.map +1 -1
  29. package/build/legacy/useQueries.d.cts +4 -4
  30. package/build/legacy/useQueries.d.ts +4 -4
  31. package/build/legacy/useQueries.js.map +1 -1
  32. package/build/legacy/useSuspenseQueries.cjs +47 -0
  33. package/build/legacy/useSuspenseQueries.cjs.map +1 -0
  34. package/build/legacy/useSuspenseQueries.d.cts +66 -0
  35. package/build/legacy/useSuspenseQueries.d.ts +66 -0
  36. package/build/legacy/useSuspenseQueries.js +23 -0
  37. package/build/legacy/useSuspenseQueries.js.map +1 -0
  38. package/build/legacy/useSuspenseQuery.cjs +2 -1
  39. package/build/legacy/useSuspenseQuery.cjs.map +1 -1
  40. package/build/legacy/useSuspenseQuery.js +2 -1
  41. package/build/legacy/useSuspenseQuery.js.map +1 -1
  42. package/build/legacy/utils.cjs.map +1 -1
  43. package/build/legacy/utils.d.cts +1 -1
  44. package/build/legacy/utils.d.ts +1 -1
  45. package/build/legacy/utils.js.map +1 -1
  46. package/build/modern/HydrationBoundary.cjs +37 -2
  47. package/build/modern/HydrationBoundary.cjs.map +1 -1
  48. package/build/modern/HydrationBoundary.d.cts +3 -1
  49. package/build/modern/HydrationBoundary.d.ts +3 -1
  50. package/build/modern/HydrationBoundary.js +37 -2
  51. package/build/modern/HydrationBoundary.js.map +1 -1
  52. package/build/modern/index.cjs +3 -0
  53. package/build/modern/index.cjs.map +1 -1
  54. package/build/modern/index.d.cts +1 -0
  55. package/build/modern/index.d.ts +1 -0
  56. package/build/modern/index.js +2 -0
  57. package/build/modern/index.js.map +1 -1
  58. package/build/modern/queryOptions.cjs.map +1 -1
  59. package/build/modern/queryOptions.d.cts +7 -3
  60. package/build/modern/queryOptions.d.ts +7 -3
  61. package/build/modern/queryOptions.js.map +1 -1
  62. package/build/modern/suspense.cjs +3 -0
  63. package/build/modern/suspense.cjs.map +1 -1
  64. package/build/modern/suspense.d.cts +3 -2
  65. package/build/modern/suspense.d.ts +3 -2
  66. package/build/modern/suspense.js +2 -0
  67. package/build/modern/suspense.js.map +1 -1
  68. package/build/modern/types.cjs.map +1 -1
  69. package/build/modern/types.d.cts +4 -4
  70. package/build/modern/types.d.ts +4 -4
  71. package/build/modern/useQueries.cjs.map +1 -1
  72. package/build/modern/useQueries.d.cts +4 -4
  73. package/build/modern/useQueries.d.ts +4 -4
  74. package/build/modern/useQueries.js.map +1 -1
  75. package/build/modern/useSuspenseQueries.cjs +47 -0
  76. package/build/modern/useSuspenseQueries.cjs.map +1 -0
  77. package/build/modern/useSuspenseQueries.d.cts +66 -0
  78. package/build/modern/useSuspenseQueries.d.ts +66 -0
  79. package/build/modern/useSuspenseQueries.js +23 -0
  80. package/build/modern/useSuspenseQueries.js.map +1 -0
  81. package/build/modern/useSuspenseQuery.cjs +2 -1
  82. package/build/modern/useSuspenseQuery.cjs.map +1 -1
  83. package/build/modern/useSuspenseQuery.js +2 -1
  84. package/build/modern/useSuspenseQuery.js.map +1 -1
  85. package/build/modern/utils.cjs.map +1 -1
  86. package/build/modern/utils.d.cts +1 -1
  87. package/build/modern/utils.d.ts +1 -1
  88. package/build/modern/utils.js.map +1 -1
  89. package/package.json +7 -3
  90. package/src/HydrationBoundary.tsx +78 -8
  91. package/src/__tests__/HydrationBoundary.test.tsx +111 -7
  92. package/src/__tests__/QueryResetErrorBoundary.test.tsx +10 -6
  93. package/src/__tests__/fine-grained-persister.test.tsx +163 -0
  94. package/src/__tests__/queryOptions.types.test.tsx +31 -0
  95. package/src/__tests__/ssr.test.tsx +2 -2
  96. package/src/__tests__/suspense.test.tsx +94 -386
  97. package/src/__tests__/useInfiniteQuery.test.tsx +44 -44
  98. package/src/__tests__/useInfiniteQuery.type.test.tsx +10 -10
  99. package/src/__tests__/useIsFetching.test.tsx +2 -2
  100. package/src/__tests__/useMutation.test.tsx +4 -4
  101. package/src/__tests__/useMutationState.test.tsx +4 -4
  102. package/src/__tests__/useQueries.test.tsx +65 -64
  103. package/src/__tests__/useQuery.test.tsx +142 -141
  104. package/src/__tests__/useQuery.types.test.tsx +34 -0
  105. package/src/__tests__/utils.tsx +0 -7
  106. package/src/index.ts +5 -0
  107. package/src/queryOptions.ts +11 -3
  108. package/src/suspense.ts +12 -0
  109. package/src/types.ts +18 -12
  110. package/src/useQueries.ts +34 -28
  111. package/src/useSuspenseQueries.ts +164 -0
  112. package/src/useSuspenseQuery.ts +2 -1
  113. package/src/utils.ts +1 -1
@@ -0,0 +1,66 @@
1
+ import { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types.cjs';
2
+ import { DefaultError, QueryClient, QueryFunction } from '@tanstack/query-core';
3
+
4
+ type MAXIMUM_DEPTH = 20;
5
+ type GetSuspenseOptions<T> = T extends {
6
+ queryFnData: infer TQueryFnData;
7
+ error?: infer TError;
8
+ data: infer TData;
9
+ } ? UseSuspenseQueryOptions<TQueryFnData, TError, TData> : T extends {
10
+ queryFnData: infer TQueryFnData;
11
+ error?: infer TError;
12
+ } ? UseSuspenseQueryOptions<TQueryFnData, TError> : T extends {
13
+ data: infer TData;
14
+ error?: infer TError;
15
+ } ? UseSuspenseQueryOptions<unknown, TError, TData> : T extends [infer TQueryFnData, infer TError, infer TData] ? UseSuspenseQueryOptions<TQueryFnData, TError, TData> : T extends [infer TQueryFnData, infer TError] ? UseSuspenseQueryOptions<TQueryFnData, TError> : T extends [infer TQueryFnData] ? UseSuspenseQueryOptions<TQueryFnData> : T extends {
16
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
17
+ select: (data: any) => infer TData;
18
+ } ? UseSuspenseQueryOptions<TQueryFnData, Error, TData, TQueryKey> : T extends {
19
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
20
+ } ? UseSuspenseQueryOptions<TQueryFnData, Error, TQueryFnData, TQueryKey> : UseSuspenseQueryOptions;
21
+ type GetSuspenseResults<T> = T extends {
22
+ queryFnData: any;
23
+ error?: infer TError;
24
+ data: infer TData;
25
+ } ? UseSuspenseQueryResult<TData, TError> : T extends {
26
+ queryFnData: infer TQueryFnData;
27
+ error?: infer TError;
28
+ } ? UseSuspenseQueryResult<TQueryFnData, TError> : T extends {
29
+ data: infer TData;
30
+ error?: infer TError;
31
+ } ? UseSuspenseQueryResult<TData, TError> : T extends [any, infer TError, infer TData] ? UseSuspenseQueryResult<TData, TError> : T extends [infer TQueryFnData, infer TError] ? UseSuspenseQueryResult<TQueryFnData, TError> : T extends [infer TQueryFnData] ? UseSuspenseQueryResult<TQueryFnData> : T extends {
32
+ queryFn?: QueryFunction<unknown, any>;
33
+ select: (data: any) => infer TData;
34
+ } ? UseSuspenseQueryResult<TData> : T extends {
35
+ queryFn?: QueryFunction<infer TQueryFnData, any>;
36
+ } ? UseSuspenseQueryResult<TQueryFnData> : UseSuspenseQueryResult;
37
+ /**
38
+ * SuspenseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
39
+ */
40
+ type SuspenseQueriesOptions<T extends Array<any>, Result extends Array<any> = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? Array<UseSuspenseQueryOptions> : T extends [] ? [] : T extends [infer Head] ? [...Result, GetSuspenseOptions<Head>] : T extends [infer Head, ...infer Tail] ? SuspenseQueriesOptions<[
41
+ ...Tail
42
+ ], [
43
+ ...Result,
44
+ GetSuspenseOptions<Head>
45
+ ], [
46
+ ...Depth,
47
+ 1
48
+ ]> : Array<unknown> extends T ? T : T extends Array<UseSuspenseQueryOptions<infer TQueryFnData, infer TError, infer TData, infer TQueryKey>> ? Array<UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>> : Array<UseSuspenseQueryOptions>;
49
+ /**
50
+ * SuspenseQueriesResults reducer recursively maps type param to results
51
+ */
52
+ type SuspenseQueriesResults<T extends Array<any>, Result extends Array<any> = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? Array<UseSuspenseQueryResult> : T extends [] ? [] : T extends [infer Head] ? [...Result, GetSuspenseResults<Head>] : T extends [infer Head, ...infer Tail] ? SuspenseQueriesResults<[
53
+ ...Tail
54
+ ], [
55
+ ...Result,
56
+ GetSuspenseResults<Head>
57
+ ], [
58
+ ...Depth,
59
+ 1
60
+ ]> : T extends Array<UseSuspenseQueryOptions<infer TQueryFnData, infer TError, infer TData, any>> ? Array<UseSuspenseQueryResult<unknown extends TData ? TQueryFnData : TData, unknown extends TError ? DefaultError : TError>> : Array<UseSuspenseQueryResult>;
61
+ declare function useSuspenseQueries<T extends Array<any>, TCombinedResult = SuspenseQueriesResults<T>>(options: {
62
+ queries: readonly [...SuspenseQueriesOptions<T>];
63
+ combine?: (result: SuspenseQueriesResults<T>) => TCombinedResult;
64
+ }, queryClient?: QueryClient): TCombinedResult;
65
+
66
+ export { SuspenseQueriesOptions, SuspenseQueriesResults, useSuspenseQueries };
@@ -0,0 +1,66 @@
1
+ import { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types.js';
2
+ import { DefaultError, QueryClient, QueryFunction } from '@tanstack/query-core';
3
+
4
+ type MAXIMUM_DEPTH = 20;
5
+ type GetSuspenseOptions<T> = T extends {
6
+ queryFnData: infer TQueryFnData;
7
+ error?: infer TError;
8
+ data: infer TData;
9
+ } ? UseSuspenseQueryOptions<TQueryFnData, TError, TData> : T extends {
10
+ queryFnData: infer TQueryFnData;
11
+ error?: infer TError;
12
+ } ? UseSuspenseQueryOptions<TQueryFnData, TError> : T extends {
13
+ data: infer TData;
14
+ error?: infer TError;
15
+ } ? UseSuspenseQueryOptions<unknown, TError, TData> : T extends [infer TQueryFnData, infer TError, infer TData] ? UseSuspenseQueryOptions<TQueryFnData, TError, TData> : T extends [infer TQueryFnData, infer TError] ? UseSuspenseQueryOptions<TQueryFnData, TError> : T extends [infer TQueryFnData] ? UseSuspenseQueryOptions<TQueryFnData> : T extends {
16
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
17
+ select: (data: any) => infer TData;
18
+ } ? UseSuspenseQueryOptions<TQueryFnData, Error, TData, TQueryKey> : T extends {
19
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
20
+ } ? UseSuspenseQueryOptions<TQueryFnData, Error, TQueryFnData, TQueryKey> : UseSuspenseQueryOptions;
21
+ type GetSuspenseResults<T> = T extends {
22
+ queryFnData: any;
23
+ error?: infer TError;
24
+ data: infer TData;
25
+ } ? UseSuspenseQueryResult<TData, TError> : T extends {
26
+ queryFnData: infer TQueryFnData;
27
+ error?: infer TError;
28
+ } ? UseSuspenseQueryResult<TQueryFnData, TError> : T extends {
29
+ data: infer TData;
30
+ error?: infer TError;
31
+ } ? UseSuspenseQueryResult<TData, TError> : T extends [any, infer TError, infer TData] ? UseSuspenseQueryResult<TData, TError> : T extends [infer TQueryFnData, infer TError] ? UseSuspenseQueryResult<TQueryFnData, TError> : T extends [infer TQueryFnData] ? UseSuspenseQueryResult<TQueryFnData> : T extends {
32
+ queryFn?: QueryFunction<unknown, any>;
33
+ select: (data: any) => infer TData;
34
+ } ? UseSuspenseQueryResult<TData> : T extends {
35
+ queryFn?: QueryFunction<infer TQueryFnData, any>;
36
+ } ? UseSuspenseQueryResult<TQueryFnData> : UseSuspenseQueryResult;
37
+ /**
38
+ * SuspenseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
39
+ */
40
+ type SuspenseQueriesOptions<T extends Array<any>, Result extends Array<any> = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? Array<UseSuspenseQueryOptions> : T extends [] ? [] : T extends [infer Head] ? [...Result, GetSuspenseOptions<Head>] : T extends [infer Head, ...infer Tail] ? SuspenseQueriesOptions<[
41
+ ...Tail
42
+ ], [
43
+ ...Result,
44
+ GetSuspenseOptions<Head>
45
+ ], [
46
+ ...Depth,
47
+ 1
48
+ ]> : Array<unknown> extends T ? T : T extends Array<UseSuspenseQueryOptions<infer TQueryFnData, infer TError, infer TData, infer TQueryKey>> ? Array<UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>> : Array<UseSuspenseQueryOptions>;
49
+ /**
50
+ * SuspenseQueriesResults reducer recursively maps type param to results
51
+ */
52
+ type SuspenseQueriesResults<T extends Array<any>, Result extends Array<any> = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? Array<UseSuspenseQueryResult> : T extends [] ? [] : T extends [infer Head] ? [...Result, GetSuspenseResults<Head>] : T extends [infer Head, ...infer Tail] ? SuspenseQueriesResults<[
53
+ ...Tail
54
+ ], [
55
+ ...Result,
56
+ GetSuspenseResults<Head>
57
+ ], [
58
+ ...Depth,
59
+ 1
60
+ ]> : T extends Array<UseSuspenseQueryOptions<infer TQueryFnData, infer TError, infer TData, any>> ? Array<UseSuspenseQueryResult<unknown extends TData ? TQueryFnData : TData, unknown extends TError ? DefaultError : TError>> : Array<UseSuspenseQueryResult>;
61
+ declare function useSuspenseQueries<T extends Array<any>, TCombinedResult = SuspenseQueriesResults<T>>(options: {
62
+ queries: readonly [...SuspenseQueriesOptions<T>];
63
+ combine?: (result: SuspenseQueriesResults<T>) => TCombinedResult;
64
+ }, queryClient?: QueryClient): TCombinedResult;
65
+
66
+ export { SuspenseQueriesOptions, SuspenseQueriesResults, useSuspenseQueries };
@@ -0,0 +1,23 @@
1
+ "use client";
2
+
3
+ // src/useSuspenseQueries.ts
4
+ import { useQueries } from "./useQueries.js";
5
+ import { defaultThrowOnError } from "./suspense.js";
6
+ function useSuspenseQueries(options, queryClient) {
7
+ return useQueries(
8
+ {
9
+ ...options,
10
+ queries: options.queries.map((query) => ({
11
+ ...query,
12
+ suspense: true,
13
+ throwOnError: defaultThrowOnError,
14
+ enabled: true
15
+ }))
16
+ },
17
+ queryClient
18
+ );
19
+ }
20
+ export {
21
+ useSuspenseQueries
22
+ };
23
+ //# sourceMappingURL=useSuspenseQueries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/useSuspenseQueries.ts"],"sourcesContent":["'use client'\nimport { useQueries } from './useQueries'\nimport { defaultThrowOnError } from './suspense'\nimport type { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types'\nimport type {\n DefaultError,\n QueryClient,\n QueryFunction,\n} from '@tanstack/query-core'\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetSuspenseOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseSuspenseQueryOptions<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseSuspenseQueryOptions<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseSuspenseQueryOptions<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseSuspenseQueryOptions<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseSuspenseQueryOptions<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseSuspenseQueryOptions<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseSuspenseQueryOptions<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseSuspenseQueryOptions<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseSuspenseQueryOptions\n\ntype GetSuspenseResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? UseSuspenseQueryResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseSuspenseQueryResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseSuspenseQueryResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? UseSuspenseQueryResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? UseSuspenseQueryResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseSuspenseQueryResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? UseSuspenseQueryResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? UseSuspenseQueryResult<TQueryFnData>\n : // Fallback\n UseSuspenseQueryResult\n\n/**\n * SuspenseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type SuspenseQueriesOptions<\n T extends Array<any>,\n Result extends Array<any> = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? Array<UseSuspenseQueryOptions>\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetSuspenseOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? SuspenseQueriesOptions<\n [...Tail],\n [...Result, GetSuspenseOptions<Head>],\n [...Depth, 1]\n >\n : Array<unknown> extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends Array<\n UseSuspenseQueryOptions<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >\n >\n ? Array<UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>>\n : // Fallback\n Array<UseSuspenseQueryOptions>\n\n/**\n * SuspenseQueriesResults reducer recursively maps type param to results\n */\nexport type SuspenseQueriesResults<\n T extends Array<any>,\n Result extends Array<any> = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? Array<UseSuspenseQueryResult>\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetSuspenseResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? SuspenseQueriesResults<\n [...Tail],\n [...Result, GetSuspenseResults<Head>],\n [...Depth, 1]\n >\n : T extends Array<\n UseSuspenseQueryOptions<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >\n >\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n Array<\n UseSuspenseQueryResult<\n unknown extends TData ? TQueryFnData : TData,\n unknown extends TError ? DefaultError : TError\n >\n >\n : // Fallback\n Array<UseSuspenseQueryResult>\n\nexport function useSuspenseQueries<\n T extends Array<any>,\n TCombinedResult = SuspenseQueriesResults<T>,\n>(\n options: {\n queries: readonly [...SuspenseQueriesOptions<T>]\n combine?: (result: SuspenseQueriesResults<T>) => TCombinedResult\n },\n queryClient?: QueryClient,\n): TCombinedResult {\n return useQueries(\n {\n ...options,\n queries: options.queries.map((query) => ({\n ...query,\n suspense: true,\n throwOnError: defaultThrowOnError,\n enabled: true,\n })),\n } as any,\n queryClient,\n )\n}\n"],"mappings":";;;AACA,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AA2I7B,SAAS,mBAId,SAIA,aACiB;AACjB,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,SAAS,QAAQ,QAAQ,IAAI,CAAC,WAAW;AAAA,QACvC,GAAG;AAAA,QACH,UAAU;AAAA,QACV,cAAc;AAAA,QACd,SAAS;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -26,13 +26,14 @@ __export(useSuspenseQuery_exports, {
26
26
  module.exports = __toCommonJS(useSuspenseQuery_exports);
27
27
  var import_query_core = require("@tanstack/query-core");
28
28
  var import_useBaseQuery = require("./useBaseQuery.cjs");
29
+ var import_suspense = require("./suspense.cjs");
29
30
  function useSuspenseQuery(options, queryClient) {
30
31
  return (0, import_useBaseQuery.useBaseQuery)(
31
32
  {
32
33
  ...options,
33
34
  enabled: true,
34
35
  suspense: true,
35
- throwOnError: true
36
+ throwOnError: import_suspense.defaultThrowOnError
36
37
  },
37
38
  import_query_core.QueryObserver,
38
39
  queryClient
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/useSuspenseQuery.ts"],"sourcesContent":["'use client'\nimport { QueryObserver } from '@tanstack/query-core'\nimport { useBaseQuery } from './useBaseQuery'\nimport type { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types'\nimport type { DefaultError, QueryClient, QueryKey } from '@tanstack/query-core'\n\nexport function useSuspenseQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseSuspenseQueryResult<TData, TError> {\n return useBaseQuery(\n {\n ...options,\n enabled: true,\n suspense: true,\n throwOnError: true,\n },\n QueryObserver,\n queryClient,\n ) as UseSuspenseQueryResult<TData, TError>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAA8B;AAC9B,0BAA6B;AAItB,SAAS,iBAMd,SACA,aACuC;AACvC,aAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,SAAS;AAAA,MACT,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/useSuspenseQuery.ts"],"sourcesContent":["'use client'\nimport { QueryObserver } from '@tanstack/query-core'\nimport { useBaseQuery } from './useBaseQuery'\nimport { defaultThrowOnError } from './suspense'\nimport type { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types'\nimport type { DefaultError, QueryClient, QueryKey } from '@tanstack/query-core'\n\nexport function useSuspenseQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseSuspenseQueryResult<TData, TError> {\n return useBaseQuery(\n {\n ...options,\n enabled: true,\n suspense: true,\n throwOnError: defaultThrowOnError,\n },\n QueryObserver,\n queryClient,\n ) as UseSuspenseQueryResult<TData, TError>\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAA8B;AAC9B,0BAA6B;AAC7B,sBAAoC;AAI7B,SAAS,iBAMd,SACA,aACuC;AACvC,aAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,SAAS;AAAA,MACT,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -3,13 +3,14 @@
3
3
  // src/useSuspenseQuery.ts
4
4
  import { QueryObserver } from "@tanstack/query-core";
5
5
  import { useBaseQuery } from "./useBaseQuery.js";
6
+ import { defaultThrowOnError } from "./suspense.js";
6
7
  function useSuspenseQuery(options, queryClient) {
7
8
  return useBaseQuery(
8
9
  {
9
10
  ...options,
10
11
  enabled: true,
11
12
  suspense: true,
12
- throwOnError: true
13
+ throwOnError: defaultThrowOnError
13
14
  },
14
15
  QueryObserver,
15
16
  queryClient
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/useSuspenseQuery.ts"],"sourcesContent":["'use client'\nimport { QueryObserver } from '@tanstack/query-core'\nimport { useBaseQuery } from './useBaseQuery'\nimport type { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types'\nimport type { DefaultError, QueryClient, QueryKey } from '@tanstack/query-core'\n\nexport function useSuspenseQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseSuspenseQueryResult<TData, TError> {\n return useBaseQuery(\n {\n ...options,\n enabled: true,\n suspense: true,\n throwOnError: true,\n },\n QueryObserver,\n queryClient,\n ) as UseSuspenseQueryResult<TData, TError>\n}\n"],"mappings":";;;AACA,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAItB,SAAS,iBAMd,SACA,aACuC;AACvC,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,SAAS;AAAA,MACT,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/useSuspenseQuery.ts"],"sourcesContent":["'use client'\nimport { QueryObserver } from '@tanstack/query-core'\nimport { useBaseQuery } from './useBaseQuery'\nimport { defaultThrowOnError } from './suspense'\nimport type { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types'\nimport type { DefaultError, QueryClient, QueryKey } from '@tanstack/query-core'\n\nexport function useSuspenseQuery<\n TQueryFnData = unknown,\n TError = DefaultError,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n>(\n options: UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n queryClient?: QueryClient,\n): UseSuspenseQueryResult<TData, TError> {\n return useBaseQuery(\n {\n ...options,\n enabled: true,\n suspense: true,\n throwOnError: defaultThrowOnError,\n },\n QueryObserver,\n queryClient,\n ) as UseSuspenseQueryResult<TData, TError>\n}\n"],"mappings":";;;AACA,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAC7B,SAAS,2BAA2B;AAI7B,SAAS,iBAMd,SACA,aACuC;AACvC,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,SAAS;AAAA,MACT,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["export function shouldThrowError<T extends (...args: any[]) => boolean>(\n throwError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwError function to override throwing behavior on a per-error basis\n if (typeof throwError === 'function') {\n return throwError(...params)\n }\n\n return !!throwError\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,iBACd,YACA,QACS;AAET,MAAI,OAAO,eAAe,YAAY;AACpC,WAAO,WAAW,GAAG,MAAM;AAAA,EAC7B;AAEA,SAAO,CAAC,CAAC;AACX;","names":[]}
1
+ {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["export function shouldThrowError<T extends (...args: Array<any>) => boolean>(\n throwError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwError function to override throwing behavior on a per-error basis\n if (typeof throwError === 'function') {\n return throwError(...params)\n }\n\n return !!throwError\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,iBACd,YACA,QACS;AAET,MAAI,OAAO,eAAe,YAAY;AACpC,WAAO,WAAW,GAAG,MAAM;AAAA,EAC7B;AAEA,SAAO,CAAC,CAAC;AACX;","names":[]}
@@ -1,3 +1,3 @@
1
- declare function shouldThrowError<T extends (...args: any[]) => boolean>(throwError: boolean | T | undefined, params: Parameters<T>): boolean;
1
+ declare function shouldThrowError<T extends (...args: Array<any>) => boolean>(throwError: boolean | T | undefined, params: Parameters<T>): boolean;
2
2
 
3
3
  export { shouldThrowError };
@@ -1,3 +1,3 @@
1
- declare function shouldThrowError<T extends (...args: any[]) => boolean>(throwError: boolean | T | undefined, params: Parameters<T>): boolean;
1
+ declare function shouldThrowError<T extends (...args: Array<any>) => boolean>(throwError: boolean | T | undefined, params: Parameters<T>): boolean;
2
2
 
3
3
  export { shouldThrowError };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["export function shouldThrowError<T extends (...args: any[]) => boolean>(\n throwError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwError function to override throwing behavior on a per-error basis\n if (typeof throwError === 'function') {\n return throwError(...params)\n }\n\n return !!throwError\n}\n"],"mappings":";AAAO,SAAS,iBACd,YACA,QACS;AAET,MAAI,OAAO,eAAe,YAAY;AACpC,WAAO,WAAW,GAAG,MAAM;AAAA,EAC7B;AAEA,SAAO,CAAC,CAAC;AACX;","names":[]}
1
+ {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["export function shouldThrowError<T extends (...args: Array<any>) => boolean>(\n throwError: boolean | T | undefined,\n params: Parameters<T>,\n): boolean {\n // Allow throwError function to override throwing behavior on a per-error basis\n if (typeof throwError === 'function') {\n return throwError(...params)\n }\n\n return !!throwError\n}\n"],"mappings":";AAAO,SAAS,iBACd,YACA,QACS;AAET,MAAI,OAAO,eAAe,YAAY;AACpC,WAAO,WAAW,GAAG,MAAM;AAAA,EAC7B;AAEA,SAAO,CAAC,CAAC;AACX;","names":[]}
package/package.json CHANGED
@@ -1,10 +1,14 @@
1
1
  {
2
2
  "name": "@tanstack/react-query",
3
- "version": "5.0.0-beta.9",
3
+ "version": "5.0.0-rc.0",
4
4
  "description": "Hooks for managing, caching and syncing asynchronous and remote data in React",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
7
- "repository": "tanstack/query",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/TanStack/query.git",
10
+ "directory": "packages/react-query"
11
+ },
8
12
  "homepage": "https://tanstack.com/query",
9
13
  "funding": {
10
14
  "type": "github",
@@ -38,7 +42,7 @@
38
42
  ],
39
43
  "dependencies": {
40
44
  "client-only": "0.0.1",
41
- "@tanstack/query-core": "5.0.0-beta.9"
45
+ "@tanstack/query-core": "5.0.0-rc.0"
42
46
  },
43
47
  "devDependencies": {
44
48
  "@types/react": "^18.2.4",
@@ -3,11 +3,17 @@ import * as React from 'react'
3
3
 
4
4
  import { hydrate } from '@tanstack/query-core'
5
5
  import { useQueryClient } from './QueryClientProvider'
6
- import type { HydrateOptions, QueryClient } from '@tanstack/query-core'
6
+ import type {
7
+ DehydratedState,
8
+ HydrateOptions,
9
+ QueryClient,
10
+ } from '@tanstack/query-core'
7
11
 
8
12
  export interface HydrationBoundaryProps {
9
13
  state?: unknown
10
- options?: HydrateOptions
14
+ options?: Omit<HydrateOptions, 'defaultOptions'> & {
15
+ defaultOptions?: Omit<HydrateOptions['defaultOptions'], 'mutations'>
16
+ }
11
17
  children?: React.ReactNode
12
18
  queryClient?: QueryClient
13
19
  }
@@ -19,19 +25,83 @@ export const HydrationBoundary = ({
19
25
  queryClient,
20
26
  }: HydrationBoundaryProps) => {
21
27
  const client = useQueryClient(queryClient)
28
+ const [hydrationQueue, setHydrationQueue] = React.useState<
29
+ DehydratedState['queries'] | undefined
30
+ >()
22
31
 
23
32
  const optionsRef = React.useRef(options)
24
33
  optionsRef.current = options
25
34
 
26
- // Running hydrate again with the same queries is safe,
27
- // it wont overwrite or initialize existing queries,
28
- // relying on useMemo here is only a performance optimization.
29
- // hydrate can and should be run *during* render here for SSR to work properly
35
+ // This useMemo is for performance reasons only, everything inside it _must_
36
+ // be safe to run in every render and code here should be read as "in render".
37
+ //
38
+ // This code needs to happen during the render phase, because after initial
39
+ // SSR, hydration needs to happen _before_ children render. Also, if hydrating
40
+ // during a transition, we want to hydrate as much as is safe in render so
41
+ // we can prerender as much as possible.
42
+ //
43
+ // For any queries that already exist in the cache, we want to hold back on
44
+ // hydrating until _after_ the render phase. The reason for this is that during
45
+ // transitions, we don't want the existing queries and observers to update to
46
+ // the new data on the current page, only _after_ the transition is committed.
47
+ // If the transition is aborted, we will have hydrated any _new_ queries, but
48
+ // we throw away the fresh data for any existing ones to avoid unexpectedly
49
+ // updating the UI.
30
50
  React.useMemo(() => {
31
51
  if (state) {
32
- hydrate(client, state, optionsRef.current)
52
+ if (typeof state !== 'object') {
53
+ return
54
+ }
55
+
56
+ const queryCache = client.getQueryCache()
57
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
58
+ const queries = (state as DehydratedState).queries || []
59
+
60
+ const newQueries: DehydratedState['queries'] = []
61
+ const existingQueries: DehydratedState['queries'] = []
62
+ for (const dehydratedQuery of queries) {
63
+ const existingQuery = queryCache.get(dehydratedQuery.queryHash)
64
+
65
+ if (!existingQuery) {
66
+ newQueries.push(dehydratedQuery)
67
+ } else {
68
+ const hydrationIsNewer =
69
+ dehydratedQuery.state.dataUpdatedAt >
70
+ existingQuery.state.dataUpdatedAt
71
+ const queryAlreadyQueued = hydrationQueue?.find(
72
+ (query) => query.queryHash === dehydratedQuery.queryHash,
73
+ )
74
+
75
+ if (
76
+ hydrationIsNewer &&
77
+ (!queryAlreadyQueued ||
78
+ dehydratedQuery.state.dataUpdatedAt >
79
+ queryAlreadyQueued.state.dataUpdatedAt)
80
+ ) {
81
+ existingQueries.push(dehydratedQuery)
82
+ }
83
+ }
84
+ }
85
+
86
+ if (newQueries.length > 0) {
87
+ // It's actually fine to call this with queries/state that already exists
88
+ // in the cache, or is older. hydrate() is idempotent for queries.
89
+ hydrate(client, { queries: newQueries }, optionsRef.current)
90
+ }
91
+ if (existingQueries.length > 0) {
92
+ setHydrationQueue((prev) =>
93
+ prev ? [...prev, ...existingQueries] : existingQueries,
94
+ )
95
+ }
96
+ }
97
+ }, [client, hydrationQueue, state])
98
+
99
+ React.useEffect(() => {
100
+ if (hydrationQueue) {
101
+ hydrate(client, { queries: hydrationQueue }, optionsRef.current)
102
+ setHydrationQueue(undefined)
33
103
  }
34
- }, [client, state])
104
+ }, [client, hydrationQueue])
35
105
 
36
106
  return children as React.ReactElement
37
107
  }
@@ -137,8 +137,8 @@ describe('React hydration', () => {
137
137
  queryFn: () => dataQuery(['should change']),
138
138
  })
139
139
  await intermediateClient.prefetchQuery({
140
- queryKey: ['added string'],
141
- queryFn: () => dataQuery(['added string']),
140
+ queryKey: ['added'],
141
+ queryFn: () => dataQuery(['added']),
142
142
  })
143
143
  const dehydrated = dehydrate(intermediateClient)
144
144
  intermediateClient.clear()
@@ -147,17 +147,121 @@ describe('React hydration', () => {
147
147
  <QueryClientProvider client={queryClient}>
148
148
  <HydrationBoundary state={dehydrated}>
149
149
  <Page queryKey={['string']} />
150
- <Page queryKey={['added string']} />
150
+ <Page queryKey={['added']} />
151
151
  </HydrationBoundary>
152
152
  </QueryClientProvider>,
153
153
  )
154
154
 
155
- // Existing query data should be overwritten if older,
156
- // so this should have changed
155
+ // Existing observer should not have updated at this point,
156
+ // as that would indicate a side effect in the render phase
157
+ rendered.getByText('string')
158
+ // New query data should be available immediately
159
+ rendered.getByText('added')
160
+
157
161
  await sleep(10)
162
+ // After effects phase has had time to run, the observer should have updated
163
+ expect(rendered.queryByText('string')).toBeNull()
158
164
  rendered.getByText('should change')
159
- // New query data should be available immediately
160
- rendered.getByText('added string')
165
+
166
+ queryClient.clear()
167
+ })
168
+
169
+ // When we hydrate in transitions that are later aborted, it could be
170
+ // confusing to both developers and users if we suddenly updated existing
171
+ // state on the screen (why did this update when it was not stale, nothing
172
+ // remounted, I didn't change tabs etc?).
173
+ // Any queries that does not exist in the cache yet can still be hydrated
174
+ // since they don't have any observers on the current page that would update.
175
+ test('should hydrate new but not existing queries if transition is aborted', async () => {
176
+ const initialDehydratedState = JSON.parse(stringifiedState)
177
+ const queryCache = new QueryCache()
178
+ const queryClient = createQueryClient({ queryCache })
179
+
180
+ function Page({ queryKey }: { queryKey: [string] }) {
181
+ const { data } = useQuery({
182
+ queryKey,
183
+ queryFn: () => dataQuery(queryKey),
184
+ })
185
+ return (
186
+ <div>
187
+ <h1>{data}</h1>
188
+ </div>
189
+ )
190
+ }
191
+
192
+ const rendered = render(
193
+ <QueryClientProvider client={queryClient}>
194
+ <HydrationBoundary state={initialDehydratedState}>
195
+ <Page queryKey={['string']} />
196
+ </HydrationBoundary>
197
+ </QueryClientProvider>,
198
+ )
199
+
200
+ await rendered.findByText('string')
201
+
202
+ const intermediateCache = new QueryCache()
203
+ const intermediateClient = createQueryClient({
204
+ queryCache: intermediateCache,
205
+ })
206
+ await intermediateClient.prefetchQuery({
207
+ queryKey: ['string'],
208
+ queryFn: () => dataQuery(['should not change']),
209
+ })
210
+ await intermediateClient.prefetchQuery({
211
+ queryKey: ['added'],
212
+ queryFn: () => dataQuery(['added']),
213
+ })
214
+ const newDehydratedState = dehydrate(intermediateClient)
215
+ intermediateClient.clear()
216
+
217
+ function Thrower() {
218
+ throw new Promise(() => {
219
+ // Never resolve
220
+ })
221
+
222
+ // @ts-ignore
223
+ return null
224
+ }
225
+
226
+ React.startTransition(() => {
227
+ rendered.rerender(
228
+ <React.Suspense fallback="loading">
229
+ <QueryClientProvider client={queryClient}>
230
+ <HydrationBoundary state={newDehydratedState}>
231
+ <Page queryKey={['string']} />
232
+ <Page queryKey={['added']} />
233
+ <Thrower />
234
+ </HydrationBoundary>
235
+ </QueryClientProvider>
236
+ </React.Suspense>,
237
+ )
238
+
239
+ rendered.getByText('loading')
240
+ })
241
+
242
+ React.startTransition(() => {
243
+ rendered.rerender(
244
+ <QueryClientProvider client={queryClient}>
245
+ <HydrationBoundary state={initialDehydratedState}>
246
+ <Page queryKey={['string']} />
247
+ <Page queryKey={['added']} />
248
+ </HydrationBoundary>
249
+ </QueryClientProvider>,
250
+ )
251
+
252
+ // This query existed before the transition so it should stay the same
253
+ rendered.getByText('string')
254
+ expect(rendered.queryByText('should not change')).toBeNull()
255
+ // New query data should be available immediately because it was
256
+ // hydrated in the previous transition, even though the new dehydrated
257
+ // state did not contain it
258
+ rendered.getByText('added')
259
+ })
260
+
261
+ await sleep(10)
262
+ // It should stay the same even after effects have had a chance to run
263
+ rendered.getByText('string')
264
+ expect(rendered.queryByText('should not change')).toBeNull()
161
265
 
162
266
  queryClient.clear()
163
267
  })
@@ -3,7 +3,14 @@ import { ErrorBoundary } from 'react-error-boundary'
3
3
  import * as React from 'react'
4
4
 
5
5
  import { vi } from 'vitest'
6
- import { QueryCache, QueryErrorResetBoundary, useQueries, useQuery } from '..'
6
+ import {
7
+ QueryCache,
8
+ QueryErrorResetBoundary,
9
+ useQueries,
10
+ useQuery,
11
+ useSuspenseQueries,
12
+ useSuspenseQuery,
13
+ } from '..'
7
14
  import { createQueryClient, queryKey, renderWithClient, sleep } from './utils'
8
15
 
9
16
  // TODO: This should be removed with the types for react-error-boundary get updated.
@@ -522,7 +529,7 @@ describe('QueryErrorResetBoundary', () => {
522
529
  let renders = 0
523
530
 
524
531
  function Page() {
525
- const { data } = useQuery({
532
+ const { data } = useSuspenseQuery({
526
533
  queryKey: key,
527
534
  queryFn: async () => {
528
535
  fetchCount++
@@ -534,7 +541,6 @@ describe('QueryErrorResetBoundary', () => {
534
541
  }
535
542
  },
536
543
  retry: false,
537
- suspense: true,
538
544
  })
539
545
  renders++
540
546
  return <div>{data}</div>
@@ -735,7 +741,7 @@ describe('QueryErrorResetBoundary', () => {
735
741
  let succeed = false
736
742
 
737
743
  function Page() {
738
- const [{ data }] = useQueries({
744
+ const [{ data }] = useSuspenseQueries({
739
745
  queries: [
740
746
  {
741
747
  queryKey: key,
@@ -748,9 +754,7 @@ describe('QueryErrorResetBoundary', () => {
748
754
  }
749
755
  },
750
756
  retry: false,
751
- throwOnError: true,
752
757
  retryOnMount: true,
753
- suspense: true,
754
758
  },
755
759
  ],
756
760
  })