@tanstack/react-query 5.0.0-rc.7 → 5.0.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 (32) hide show
  1. package/build/codemods/coverage/base.css +224 -0
  2. package/build/codemods/coverage/block-navigation.js +87 -0
  3. package/build/codemods/coverage/clover.xml +6 -0
  4. package/build/codemods/coverage/coverage-final.json +1 -0
  5. package/build/codemods/coverage/favicon.png +0 -0
  6. package/build/codemods/coverage/index.html +101 -0
  7. package/build/codemods/coverage/prettify.css +1 -0
  8. package/build/codemods/coverage/prettify.js +2 -0
  9. package/build/codemods/coverage/sort-arrow-sprite.png +0 -0
  10. package/build/codemods/coverage/sorter.js +196 -0
  11. package/build/legacy/useQueries.cjs.map +1 -1
  12. package/build/legacy/useQueries.d.cts +9 -5
  13. package/build/legacy/useQueries.d.ts +9 -5
  14. package/build/legacy/useQueries.js.map +1 -1
  15. package/build/legacy/useSuspenseQueries.cjs.map +1 -1
  16. package/build/legacy/useSuspenseQueries.d.cts +9 -5
  17. package/build/legacy/useSuspenseQueries.d.ts +9 -5
  18. package/build/legacy/useSuspenseQueries.js.map +1 -1
  19. package/build/modern/useQueries.cjs.map +1 -1
  20. package/build/modern/useQueries.d.cts +9 -5
  21. package/build/modern/useQueries.d.ts +9 -5
  22. package/build/modern/useQueries.js.map +1 -1
  23. package/build/modern/useSuspenseQueries.cjs.map +1 -1
  24. package/build/modern/useSuspenseQueries.d.cts +9 -5
  25. package/build/modern/useSuspenseQueries.d.ts +9 -5
  26. package/build/modern/useSuspenseQueries.js.map +1 -1
  27. package/package.json +2 -3
  28. package/src/__tests__/useQueries.test.tsx +53 -1
  29. package/src/__tests__/useQuery.test.tsx +1 -1
  30. package/src/__tests__/useQuery.types.test.tsx +9 -7
  31. package/src/useQueries.ts +23 -6
  32. package/src/useSuspenseQueries.ts +21 -6
@@ -1,5 +1,5 @@
1
1
  import { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types.cjs';
2
- import { DefaultError, QueryClient, QueryFunction } from '@tanstack/query-core';
2
+ import { DefaultError, QueryClient, QueryFunction, ThrowOnError } from '@tanstack/query-core';
3
3
 
4
4
  type MAXIMUM_DEPTH = 20;
5
5
  type GetSuspenseOptions<T> = T extends {
@@ -15,9 +15,11 @@ type GetSuspenseOptions<T> = T extends {
15
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
16
  queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
17
17
  select: (data: any) => infer TData;
18
- } ? UseSuspenseQueryOptions<TQueryFnData, Error, TData, TQueryKey> : T extends {
18
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
19
+ } ? UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey> : T extends {
19
20
  queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
20
- } ? UseSuspenseQueryOptions<TQueryFnData, Error, TQueryFnData, TQueryKey> : UseSuspenseQueryOptions;
21
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
22
+ } ? UseSuspenseQueryOptions<TQueryFnData, TError, TQueryFnData, TQueryKey> : UseSuspenseQueryOptions;
21
23
  type GetSuspenseResults<T> = T extends {
22
24
  queryFnData: any;
23
25
  error?: infer TError;
@@ -31,9 +33,11 @@ type GetSuspenseResults<T> = T extends {
31
33
  } ? 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
34
  queryFn?: QueryFunction<unknown, any>;
33
35
  select: (data: any) => infer TData;
34
- } ? UseSuspenseQueryResult<TData> : T extends {
36
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
37
+ } ? UseSuspenseQueryResult<TData, unknown extends TError ? DefaultError : TError> : T extends {
35
38
  queryFn?: QueryFunction<infer TQueryFnData, any>;
36
- } ? UseSuspenseQueryResult<TQueryFnData> : UseSuspenseQueryResult;
39
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
40
+ } ? UseSuspenseQueryResult<TQueryFnData, unknown extends TError ? DefaultError : TError> : UseSuspenseQueryResult;
37
41
  /**
38
42
  * SuspenseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
39
43
  */
@@ -1,5 +1,5 @@
1
1
  import { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types.js';
2
- import { DefaultError, QueryClient, QueryFunction } from '@tanstack/query-core';
2
+ import { DefaultError, QueryClient, QueryFunction, ThrowOnError } from '@tanstack/query-core';
3
3
 
4
4
  type MAXIMUM_DEPTH = 20;
5
5
  type GetSuspenseOptions<T> = T extends {
@@ -15,9 +15,11 @@ type GetSuspenseOptions<T> = T extends {
15
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
16
  queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
17
17
  select: (data: any) => infer TData;
18
- } ? UseSuspenseQueryOptions<TQueryFnData, Error, TData, TQueryKey> : T extends {
18
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
19
+ } ? UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey> : T extends {
19
20
  queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>;
20
- } ? UseSuspenseQueryOptions<TQueryFnData, Error, TQueryFnData, TQueryKey> : UseSuspenseQueryOptions;
21
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
22
+ } ? UseSuspenseQueryOptions<TQueryFnData, TError, TQueryFnData, TQueryKey> : UseSuspenseQueryOptions;
21
23
  type GetSuspenseResults<T> = T extends {
22
24
  queryFnData: any;
23
25
  error?: infer TError;
@@ -31,9 +33,11 @@ type GetSuspenseResults<T> = T extends {
31
33
  } ? 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
34
  queryFn?: QueryFunction<unknown, any>;
33
35
  select: (data: any) => infer TData;
34
- } ? UseSuspenseQueryResult<TData> : T extends {
36
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
37
+ } ? UseSuspenseQueryResult<TData, unknown extends TError ? DefaultError : TError> : T extends {
35
38
  queryFn?: QueryFunction<infer TQueryFnData, any>;
36
- } ? UseSuspenseQueryResult<TQueryFnData> : UseSuspenseQueryResult;
39
+ throwOnError?: ThrowOnError<any, infer TError, any, any>;
40
+ } ? UseSuspenseQueryResult<TQueryFnData, unknown extends TError ? DefaultError : TError> : UseSuspenseQueryResult;
37
41
  /**
38
42
  * SuspenseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
39
43
  */
@@ -1 +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":[]}
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 ThrowOnError,\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 throwOnError?: ThrowOnError<any, infer TError, any, any>\n }\n ? UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>\n : T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n throwOnError?: ThrowOnError<any, infer TError, any, any>\n }\n ? UseSuspenseQueryOptions<TQueryFnData, TError, 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 throwOnError?: ThrowOnError<any, infer TError, any, any>\n }\n ? UseSuspenseQueryResult<\n TData,\n unknown extends TError ? DefaultError : TError\n >\n : T extends {\n queryFn?: QueryFunction<infer TQueryFnData, any>\n throwOnError?: ThrowOnError<any, infer TError, any, any>\n }\n ? UseSuspenseQueryResult<\n TQueryFnData,\n unknown extends TError ? DefaultError : TError\n >\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;AA0J7B,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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-query",
3
- "version": "5.0.0-rc.7",
3
+ "version": "5.0.0",
4
4
  "description": "Hooks for managing, caching and syncing asynchronous and remote data in React",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -41,8 +41,7 @@
41
41
  "!build/codemods/**/__tests__"
42
42
  ],
43
43
  "dependencies": {
44
- "client-only": "0.0.1",
45
- "@tanstack/query-core": "5.0.0-rc.6"
44
+ "@tanstack/query-core": "5.0.0"
46
45
  },
47
46
  "devDependencies": {
48
47
  "@types/react": "^18.2.4",
@@ -377,6 +377,10 @@ describe('useQueries', () => {
377
377
  const key2 = queryKey()
378
378
  const key3 = queryKey()
379
379
  const key4 = queryKey()
380
+ const key5 = queryKey()
381
+
382
+ type BizError = { code: number }
383
+ const throwOnError = (_error: BizError) => true
380
384
 
381
385
  // @ts-expect-error (Page component is not rendered)
382
386
  // eslint-disable-next-line
@@ -391,6 +395,18 @@ describe('useQueries', () => {
391
395
  expectTypeOf<Array<QueryObserverResult<number, unknown>>>(result1)
392
396
  expectTypeOf<number | undefined>(result1[0]?.data)
393
397
 
398
+ // Array.map preserves TError
399
+ const result1_err = useQueries({
400
+ queries: Array(50).map((_, i) => ({
401
+ queryKey: ['key', i] as const,
402
+ queryFn: () => i + 10,
403
+ throwOnError,
404
+ })),
405
+ })
406
+ expectTypeOf<Array<QueryObserverResult<number, unknown>>>(result1_err)
407
+ expectTypeOf<number | undefined>(result1_err[0]?.data)
408
+ expectTypeOf<BizError | null | undefined>(result1_err[0]?.error)
409
+
394
410
  // Array.map preserves TData
395
411
  const result2 = useQueries({
396
412
  queries: Array(50).map((_, i) => ({
@@ -401,6 +417,16 @@ describe('useQueries', () => {
401
417
  })
402
418
  expectTypeOf<Array<QueryObserverResult<string, unknown>>>(result2)
403
419
 
420
+ const result2_err = useQueries({
421
+ queries: Array(50).map((_, i) => ({
422
+ queryKey: ['key', i] as const,
423
+ queryFn: () => i + 10,
424
+ select: (data: number) => data.toString(),
425
+ throwOnError,
426
+ })),
427
+ })
428
+ expectTypeOf<Array<QueryObserverResult<string, BizError>>>(result2_err)
429
+
404
430
  const result3 = useQueries({
405
431
  queries: [
406
432
  {
@@ -416,6 +442,11 @@ describe('useQueries', () => {
416
442
  queryFn: () => ['string[]'],
417
443
  select: () => 123,
418
444
  },
445
+ {
446
+ queryKey: key5,
447
+ queryFn: () => 'string',
448
+ throwOnError,
449
+ },
419
450
  ],
420
451
  })
421
452
  expectTypeOf<QueryObserverResult<number, unknown>>(result3[0])
@@ -423,8 +454,11 @@ describe('useQueries', () => {
423
454
  expectTypeOf<QueryObserverResult<number, unknown>>(result3[2])
424
455
  expectTypeOf<number | undefined>(result3[0].data)
425
456
  expectTypeOf<string | undefined>(result3[1].data)
457
+ expectTypeOf<string | undefined>(result3[3].data)
426
458
  // select takes precedence over queryFn
427
459
  expectTypeOf<number | undefined>(result3[2].data)
460
+ // infer TError from throwOnError
461
+ expectTypeOf<BizError | null | undefined>(result3[3].error)
428
462
 
429
463
  // initialData/placeholderData are enforced
430
464
  useQueries({
@@ -446,7 +480,7 @@ describe('useQueries', () => {
446
480
  ],
447
481
  })
448
482
 
449
- // select params are "indirectly" enforced
483
+ // select and throwOnError params are "indirectly" enforced
450
484
  useQueries({
451
485
  queries: [
452
486
  // unfortunately TS will not suggest the type for you
@@ -469,6 +503,11 @@ describe('useQueries', () => {
469
503
  queryFn: () => 'string',
470
504
  select: (a: string) => parseInt(a),
471
505
  },
506
+ {
507
+ queryKey: key5,
508
+ queryFn: () => 'string',
509
+ throwOnError,
510
+ },
472
511
  ],
473
512
  })
474
513
 
@@ -504,11 +543,18 @@ describe('useQueries', () => {
504
543
  queryFn: () => 'string',
505
544
  select: (a: string) => parseInt(a),
506
545
  },
546
+ {
547
+ queryKey: key5,
548
+ queryFn: () => 'string',
549
+ select: (a: string) => parseInt(a),
550
+ throwOnError,
551
+ },
507
552
  ],
508
553
  })
509
554
  expectTypeOf<QueryObserverResult<string, unknown>>(result4[0])
510
555
  expectTypeOf<QueryObserverResult<string, unknown>>(result4[1])
511
556
  expectTypeOf<QueryObserverResult<number, unknown>>(result4[2])
557
+ expectTypeOf<QueryObserverResult<number, BizError>>(result4[3])
512
558
 
513
559
  // handles when queryFn returns a Promise
514
560
  const result5 = useQueries({
@@ -532,10 +578,16 @@ describe('useQueries', () => {
532
578
  queryKey: ['key1'],
533
579
  queryFn: () => 123,
534
580
  },
581
+ {
582
+ queryKey: key5,
583
+ queryFn: () => 'string',
584
+ throwOnError,
585
+ },
535
586
  ],
536
587
  } as const)
537
588
  expectTypeOf<QueryObserverResult<string, unknown>>(result6[0])
538
589
  expectTypeOf<QueryObserverResult<number, unknown>>(result6[1])
590
+ expectTypeOf<QueryObserverResult<string, BizError>>(result6[2])
539
591
 
540
592
  // field names should be enforced - array literal
541
593
  useQueries({
@@ -4146,7 +4146,7 @@ describe('useQuery', () => {
4146
4146
  await sleep(10)
4147
4147
  return count++
4148
4148
  },
4149
- refetchInterval: (data = 0) => (data < 2 ? 10 : false),
4149
+ refetchInterval: ({ state: { data = 0 } }) => (data < 2 ? 10 : false),
4150
4150
  })
4151
4151
 
4152
4152
  states.push(queryInfo)
@@ -47,13 +47,15 @@ describe('initialData', () => {
47
47
 
48
48
  it('it should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQuery', () => {
49
49
  doNotExecute(() => {
50
- const options = <TData = number,>(select?: (data: number) => TData) =>
51
- queryOptions({
52
- queryKey: ['key'],
53
- queryFn: () => Promise.resolve(1),
54
- select,
55
- })
56
- const query = useQuery(options((data) => data > 1))
50
+ const options = queryOptions({
51
+ queryKey: ['key'],
52
+ queryFn: () => Promise.resolve(1),
53
+ })
54
+
55
+ const query = useQuery({
56
+ ...options,
57
+ select: (data) => data > 1,
58
+ })
57
59
 
58
60
  const result: Expect<
59
61
  Equal<boolean | undefined, (typeof query)['data']>
package/src/useQueries.ts CHANGED
@@ -24,6 +24,7 @@ import type {
24
24
  QueryClient,
25
25
  QueryFunction,
26
26
  QueryKey,
27
+ ThrowOnError,
27
28
  } from '@tanstack/query-core'
28
29
 
29
30
  // This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
@@ -66,10 +67,19 @@ type GetOptions<T> =
66
67
  T extends {
67
68
  queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
68
69
  select: (data: any) => infer TData
70
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
69
71
  }
70
- ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>
71
- : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }
72
- ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>
72
+ ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>
73
+ : T extends {
74
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
75
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
76
+ }
77
+ ? UseQueryOptionsForUseQueries<
78
+ TQueryFnData,
79
+ TError,
80
+ TQueryFnData,
81
+ TQueryKey
82
+ >
73
83
  : // Fallback
74
84
  UseQueryOptionsForUseQueries
75
85
 
@@ -92,10 +102,17 @@ type GetResults<T> =
92
102
  T extends {
93
103
  queryFn?: QueryFunction<unknown, any>
94
104
  select: (data: any) => infer TData
105
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
95
106
  }
96
- ? UseQueryResult<TData>
97
- : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }
98
- ? UseQueryResult<TQueryFnData>
107
+ ? UseQueryResult<TData, unknown extends TError ? DefaultError : TError>
108
+ : T extends {
109
+ queryFn?: QueryFunction<infer TQueryFnData, any>
110
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
111
+ }
112
+ ? UseQueryResult<
113
+ TQueryFnData,
114
+ unknown extends TError ? DefaultError : TError
115
+ >
99
116
  : // Fallback
100
117
  UseQueryResult
101
118
 
@@ -6,6 +6,7 @@ import type {
6
6
  DefaultError,
7
7
  QueryClient,
8
8
  QueryFunction,
9
+ ThrowOnError,
9
10
  } from '@tanstack/query-core'
10
11
 
11
12
  // Avoid TS depth-limit error in case of large array literal
@@ -34,10 +35,14 @@ type GetSuspenseOptions<T> =
34
35
  T extends {
35
36
  queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
36
37
  select: (data: any) => infer TData
38
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
37
39
  }
38
- ? UseSuspenseQueryOptions<TQueryFnData, Error, TData, TQueryKey>
39
- : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }
40
- ? UseSuspenseQueryOptions<TQueryFnData, Error, TQueryFnData, TQueryKey>
40
+ ? UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>
41
+ : T extends {
42
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
43
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
44
+ }
45
+ ? UseSuspenseQueryOptions<TQueryFnData, TError, TQueryFnData, TQueryKey>
41
46
  : // Fallback
42
47
  UseSuspenseQueryOptions
43
48
 
@@ -60,10 +65,20 @@ type GetSuspenseResults<T> =
60
65
  T extends {
61
66
  queryFn?: QueryFunction<unknown, any>
62
67
  select: (data: any) => infer TData
68
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
63
69
  }
64
- ? UseSuspenseQueryResult<TData>
65
- : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }
66
- ? UseSuspenseQueryResult<TQueryFnData>
70
+ ? UseSuspenseQueryResult<
71
+ TData,
72
+ unknown extends TError ? DefaultError : TError
73
+ >
74
+ : T extends {
75
+ queryFn?: QueryFunction<infer TQueryFnData, any>
76
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
77
+ }
78
+ ? UseSuspenseQueryResult<
79
+ TQueryFnData,
80
+ unknown extends TError ? DefaultError : TError
81
+ >
67
82
  : // Fallback
68
83
  UseSuspenseQueryResult
69
84