@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.
- package/build/codemods/coverage/base.css +224 -0
- package/build/codemods/coverage/block-navigation.js +87 -0
- package/build/codemods/coverage/clover.xml +6 -0
- package/build/codemods/coverage/coverage-final.json +1 -0
- package/build/codemods/coverage/favicon.png +0 -0
- package/build/codemods/coverage/index.html +101 -0
- package/build/codemods/coverage/prettify.css +1 -0
- package/build/codemods/coverage/prettify.js +2 -0
- package/build/codemods/coverage/sort-arrow-sprite.png +0 -0
- package/build/codemods/coverage/sorter.js +196 -0
- package/build/legacy/useQueries.cjs.map +1 -1
- package/build/legacy/useQueries.d.cts +9 -5
- package/build/legacy/useQueries.d.ts +9 -5
- package/build/legacy/useQueries.js.map +1 -1
- package/build/legacy/useSuspenseQueries.cjs.map +1 -1
- package/build/legacy/useSuspenseQueries.d.cts +9 -5
- package/build/legacy/useSuspenseQueries.d.ts +9 -5
- package/build/legacy/useSuspenseQueries.js.map +1 -1
- package/build/modern/useQueries.cjs.map +1 -1
- package/build/modern/useQueries.d.cts +9 -5
- package/build/modern/useQueries.d.ts +9 -5
- package/build/modern/useQueries.js.map +1 -1
- package/build/modern/useSuspenseQueries.cjs.map +1 -1
- package/build/modern/useSuspenseQueries.d.cts +9 -5
- package/build/modern/useSuspenseQueries.d.ts +9 -5
- package/build/modern/useSuspenseQueries.js.map +1 -1
- package/package.json +2 -3
- package/src/__tests__/useQueries.test.tsx +53 -1
- package/src/__tests__/useQuery.test.tsx +1 -1
- package/src/__tests__/useQuery.types.test.tsx +9 -7
- package/src/useQueries.ts +23 -6
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
"
|
|
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 =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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,
|
|
71
|
-
: T extends {
|
|
72
|
-
|
|
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 {
|
|
98
|
-
|
|
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,
|
|
39
|
-
: T extends {
|
|
40
|
-
|
|
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<
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|