@tanstack/react-query 5.0.0-rc.7 → 5.0.5
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/README.md +3 -6
- package/build/codemods/src/v5/remove-overloads/remove-overloads.js +1 -1
- package/build/codemods/src/v5/remove-overloads/transformers/filter-aware-usage-transformer.js +32 -6
- package/build/legacy/QueryErrorResetBoundary.d.cts +1 -1
- package/build/legacy/QueryErrorResetBoundary.d.ts +1 -1
- package/build/legacy/suspense.cjs.map +1 -1
- package/build/legacy/suspense.js.map +1 -1
- 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/QueryErrorResetBoundary.d.cts +1 -1
- package/build/modern/QueryErrorResetBoundary.d.ts +1 -1
- package/build/modern/suspense.cjs.map +1 -1
- package/build/modern/suspense.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 +4 -5
- package/src/__tests__/HydrationBoundary.test.tsx +1 -0
- package/src/__tests__/QueryClientProvider.test.tsx +1 -0
- package/src/__tests__/QueryResetErrorBoundary.test.tsx +1 -0
- package/src/__tests__/fine-grained-persister.test.tsx +1 -2
- package/src/__tests__/infiniteQueryOptions.types.test.tsx +1 -0
- package/src/__tests__/queryOptions.types.test.tsx +1 -0
- package/src/__tests__/ssr-hydration.test.tsx +1 -3
- package/src/__tests__/ssr.test.tsx +1 -2
- package/src/__tests__/suspense.test.tsx +3 -3
- package/src/__tests__/suspense.types.test.tsx +1 -0
- package/src/__tests__/useInfiniteQuery.test.tsx +1 -2
- package/src/__tests__/useInfiniteQuery.type.test.tsx +1 -0
- package/src/__tests__/useIsFetching.test.tsx +1 -1
- package/src/__tests__/useMutation.test.tsx +1 -3
- package/src/__tests__/useMutationState.test.tsx +1 -0
- package/src/__tests__/useQueries.test.tsx +54 -3
- package/src/__tests__/useQuery.test.tsx +4 -5
- package/src/__tests__/useQuery.types.test.tsx +10 -7
- package/src/__tests__/utils.tsx +1 -2
- package/src/suspense.ts +1 -1
- package/src/useQueries.ts +23 -6
- package/src/useSuspenseQueries.ts +21 -6
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
import { describe, expect, expectTypeOf, it, vi } from 'vitest'
|
|
1
2
|
import { fireEvent, render, waitFor } from '@testing-library/react'
|
|
2
3
|
import * as React from 'react'
|
|
3
4
|
import { ErrorBoundary } from 'react-error-boundary'
|
|
4
|
-
|
|
5
|
-
import { vi } from 'vitest'
|
|
6
5
|
import { QueryCache, useQueries } from '..'
|
|
7
6
|
import {
|
|
8
7
|
createQueryClient,
|
|
@@ -377,6 +376,10 @@ describe('useQueries', () => {
|
|
|
377
376
|
const key2 = queryKey()
|
|
378
377
|
const key3 = queryKey()
|
|
379
378
|
const key4 = queryKey()
|
|
379
|
+
const key5 = queryKey()
|
|
380
|
+
|
|
381
|
+
type BizError = { code: number }
|
|
382
|
+
const throwOnError = (_error: BizError) => true
|
|
380
383
|
|
|
381
384
|
// @ts-expect-error (Page component is not rendered)
|
|
382
385
|
// eslint-disable-next-line
|
|
@@ -391,6 +394,18 @@ describe('useQueries', () => {
|
|
|
391
394
|
expectTypeOf<Array<QueryObserverResult<number, unknown>>>(result1)
|
|
392
395
|
expectTypeOf<number | undefined>(result1[0]?.data)
|
|
393
396
|
|
|
397
|
+
// Array.map preserves TError
|
|
398
|
+
const result1_err = useQueries({
|
|
399
|
+
queries: Array(50).map((_, i) => ({
|
|
400
|
+
queryKey: ['key', i] as const,
|
|
401
|
+
queryFn: () => i + 10,
|
|
402
|
+
throwOnError,
|
|
403
|
+
})),
|
|
404
|
+
})
|
|
405
|
+
expectTypeOf<Array<QueryObserverResult<number, unknown>>>(result1_err)
|
|
406
|
+
expectTypeOf<number | undefined>(result1_err[0]?.data)
|
|
407
|
+
expectTypeOf<BizError | null | undefined>(result1_err[0]?.error)
|
|
408
|
+
|
|
394
409
|
// Array.map preserves TData
|
|
395
410
|
const result2 = useQueries({
|
|
396
411
|
queries: Array(50).map((_, i) => ({
|
|
@@ -401,6 +416,16 @@ describe('useQueries', () => {
|
|
|
401
416
|
})
|
|
402
417
|
expectTypeOf<Array<QueryObserverResult<string, unknown>>>(result2)
|
|
403
418
|
|
|
419
|
+
const result2_err = useQueries({
|
|
420
|
+
queries: Array(50).map((_, i) => ({
|
|
421
|
+
queryKey: ['key', i] as const,
|
|
422
|
+
queryFn: () => i + 10,
|
|
423
|
+
select: (data: number) => data.toString(),
|
|
424
|
+
throwOnError,
|
|
425
|
+
})),
|
|
426
|
+
})
|
|
427
|
+
expectTypeOf<Array<QueryObserverResult<string, BizError>>>(result2_err)
|
|
428
|
+
|
|
404
429
|
const result3 = useQueries({
|
|
405
430
|
queries: [
|
|
406
431
|
{
|
|
@@ -416,6 +441,11 @@ describe('useQueries', () => {
|
|
|
416
441
|
queryFn: () => ['string[]'],
|
|
417
442
|
select: () => 123,
|
|
418
443
|
},
|
|
444
|
+
{
|
|
445
|
+
queryKey: key5,
|
|
446
|
+
queryFn: () => 'string',
|
|
447
|
+
throwOnError,
|
|
448
|
+
},
|
|
419
449
|
],
|
|
420
450
|
})
|
|
421
451
|
expectTypeOf<QueryObserverResult<number, unknown>>(result3[0])
|
|
@@ -423,8 +453,11 @@ describe('useQueries', () => {
|
|
|
423
453
|
expectTypeOf<QueryObserverResult<number, unknown>>(result3[2])
|
|
424
454
|
expectTypeOf<number | undefined>(result3[0].data)
|
|
425
455
|
expectTypeOf<string | undefined>(result3[1].data)
|
|
456
|
+
expectTypeOf<string | undefined>(result3[3].data)
|
|
426
457
|
// select takes precedence over queryFn
|
|
427
458
|
expectTypeOf<number | undefined>(result3[2].data)
|
|
459
|
+
// infer TError from throwOnError
|
|
460
|
+
expectTypeOf<BizError | null | undefined>(result3[3].error)
|
|
428
461
|
|
|
429
462
|
// initialData/placeholderData are enforced
|
|
430
463
|
useQueries({
|
|
@@ -446,7 +479,7 @@ describe('useQueries', () => {
|
|
|
446
479
|
],
|
|
447
480
|
})
|
|
448
481
|
|
|
449
|
-
// select params are "indirectly" enforced
|
|
482
|
+
// select and throwOnError params are "indirectly" enforced
|
|
450
483
|
useQueries({
|
|
451
484
|
queries: [
|
|
452
485
|
// unfortunately TS will not suggest the type for you
|
|
@@ -469,6 +502,11 @@ describe('useQueries', () => {
|
|
|
469
502
|
queryFn: () => 'string',
|
|
470
503
|
select: (a: string) => parseInt(a),
|
|
471
504
|
},
|
|
505
|
+
{
|
|
506
|
+
queryKey: key5,
|
|
507
|
+
queryFn: () => 'string',
|
|
508
|
+
throwOnError,
|
|
509
|
+
},
|
|
472
510
|
],
|
|
473
511
|
})
|
|
474
512
|
|
|
@@ -504,11 +542,18 @@ describe('useQueries', () => {
|
|
|
504
542
|
queryFn: () => 'string',
|
|
505
543
|
select: (a: string) => parseInt(a),
|
|
506
544
|
},
|
|
545
|
+
{
|
|
546
|
+
queryKey: key5,
|
|
547
|
+
queryFn: () => 'string',
|
|
548
|
+
select: (a: string) => parseInt(a),
|
|
549
|
+
throwOnError,
|
|
550
|
+
},
|
|
507
551
|
],
|
|
508
552
|
})
|
|
509
553
|
expectTypeOf<QueryObserverResult<string, unknown>>(result4[0])
|
|
510
554
|
expectTypeOf<QueryObserverResult<string, unknown>>(result4[1])
|
|
511
555
|
expectTypeOf<QueryObserverResult<number, unknown>>(result4[2])
|
|
556
|
+
expectTypeOf<QueryObserverResult<number, BizError>>(result4[3])
|
|
512
557
|
|
|
513
558
|
// handles when queryFn returns a Promise
|
|
514
559
|
const result5 = useQueries({
|
|
@@ -532,10 +577,16 @@ describe('useQueries', () => {
|
|
|
532
577
|
queryKey: ['key1'],
|
|
533
578
|
queryFn: () => 123,
|
|
534
579
|
},
|
|
580
|
+
{
|
|
581
|
+
queryKey: key5,
|
|
582
|
+
queryFn: () => 'string',
|
|
583
|
+
throwOnError,
|
|
584
|
+
},
|
|
535
585
|
],
|
|
536
586
|
} as const)
|
|
537
587
|
expectTypeOf<QueryObserverResult<string, unknown>>(result6[0])
|
|
538
588
|
expectTypeOf<QueryObserverResult<number, unknown>>(result6[1])
|
|
589
|
+
expectTypeOf<QueryObserverResult<string, BizError>>(result6[2])
|
|
539
590
|
|
|
540
591
|
// field names should be enforced - array literal
|
|
541
592
|
useQueries({
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
import { describe, expect, expectTypeOf, it, test, vi } from 'vitest'
|
|
1
2
|
import { act, fireEvent, render, waitFor } from '@testing-library/react'
|
|
2
|
-
import '@testing-library/jest-dom'
|
|
3
3
|
import * as React from 'react'
|
|
4
4
|
import { ErrorBoundary } from 'react-error-boundary'
|
|
5
|
-
import { vi } from 'vitest'
|
|
6
5
|
import { QueryCache, keepPreviousData, useQuery } from '..'
|
|
7
6
|
import {
|
|
8
7
|
Blink,
|
|
@@ -154,8 +153,8 @@ describe('useQuery', () => {
|
|
|
154
153
|
queryFn: () => fetcher(qk[1], 'token'),
|
|
155
154
|
...options,
|
|
156
155
|
})
|
|
157
|
-
const
|
|
158
|
-
expectTypeOf<string | undefined>(
|
|
156
|
+
const testQuery = useWrappedQuery([''], async () => '1')
|
|
157
|
+
expectTypeOf<string | undefined>(testQuery.data)
|
|
159
158
|
|
|
160
159
|
// handles wrapped queries with custom fetcher passed directly to useQuery
|
|
161
160
|
const useWrappedFuncStyleQuery = <
|
|
@@ -4146,7 +4145,7 @@ describe('useQuery', () => {
|
|
|
4146
4145
|
await sleep(10)
|
|
4147
4146
|
return count++
|
|
4148
4147
|
},
|
|
4149
|
-
refetchInterval: (data = 0) => (data < 2 ? 10 : false),
|
|
4148
|
+
refetchInterval: ({ state: { data = 0 } }) => (data < 2 ? 10 : false),
|
|
4150
4149
|
})
|
|
4151
4150
|
|
|
4152
4151
|
states.push(queryInfo)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { describe, it } from 'vitest'
|
|
1
2
|
import { useQuery } from '../useQuery'
|
|
2
3
|
import { queryOptions } from '../queryOptions'
|
|
3
4
|
import { doNotExecute } from './utils'
|
|
@@ -47,13 +48,15 @@ describe('initialData', () => {
|
|
|
47
48
|
|
|
48
49
|
it('it should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQuery', () => {
|
|
49
50
|
doNotExecute(() => {
|
|
50
|
-
const options =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
const options = queryOptions({
|
|
52
|
+
queryKey: ['key'],
|
|
53
|
+
queryFn: () => Promise.resolve(1),
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
const query = useQuery({
|
|
57
|
+
...options,
|
|
58
|
+
select: (data) => data > 1,
|
|
59
|
+
})
|
|
57
60
|
|
|
58
61
|
const result: Expect<
|
|
59
62
|
Equal<boolean | undefined, (typeof query)['data']>
|
package/src/__tests__/utils.tsx
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
+
import { vi } from 'vitest'
|
|
1
2
|
import * as React from 'react'
|
|
2
3
|
import { act, render } from '@testing-library/react'
|
|
3
|
-
|
|
4
4
|
import * as utils from '@tanstack/query-core'
|
|
5
|
-
import { vi } from 'vitest'
|
|
6
5
|
import { QueryClient, QueryClientProvider, onlineManager } from '..'
|
|
7
6
|
import type { QueryClientConfig } from '..'
|
|
8
7
|
import type { SpyInstance } from 'vitest'
|
package/src/suspense.ts
CHANGED
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
|
|