@tanstack/react-query 5.0.0-beta.0 → 5.0.0-beta.13
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/package.json +33 -0
- package/build/codemods/tsconfig.json +4 -0
- package/build/legacy/index.cjs +3 -0
- package/build/legacy/index.cjs.map +1 -1
- package/build/legacy/index.d.cts +3 -2
- package/build/legacy/index.d.ts +3 -2
- package/build/legacy/index.js +2 -0
- package/build/legacy/index.js.map +1 -1
- package/build/legacy/infiniteQueryOptions.cjs.map +1 -1
- package/build/legacy/infiniteQueryOptions.d.cts +1 -1
- package/build/legacy/infiniteQueryOptions.d.ts +1 -1
- package/build/legacy/infiniteQueryOptions.js.map +1 -1
- package/build/legacy/queryOptions.cjs.map +1 -1
- package/build/legacy/queryOptions.d.cts +2 -2
- package/build/legacy/queryOptions.d.ts +2 -2
- package/build/legacy/queryOptions.js.map +1 -1
- package/build/legacy/types.cjs.map +1 -1
- package/build/legacy/types.d.cts +4 -4
- package/build/legacy/types.d.ts +4 -4
- package/build/legacy/useInfiniteQuery.cjs.map +1 -1
- package/build/legacy/useInfiniteQuery.d.cts +2 -1
- package/build/legacy/useInfiniteQuery.d.ts +2 -1
- package/build/legacy/useInfiniteQuery.js.map +1 -1
- package/build/legacy/useQueries.cjs.map +1 -1
- package/build/legacy/useQueries.d.cts +1 -1
- package/build/legacy/useQueries.d.ts +1 -1
- package/build/legacy/useQueries.js.map +1 -1
- package/build/legacy/useQuery.cjs.map +1 -1
- package/build/legacy/useQuery.d.cts +2 -1
- package/build/legacy/useQuery.d.ts +2 -1
- package/build/legacy/useQuery.js.map +1 -1
- package/build/legacy/useSuspenseQueries.cjs +46 -0
- package/build/legacy/useSuspenseQueries.cjs.map +1 -0
- package/build/legacy/useSuspenseQueries.d.cts +66 -0
- package/build/legacy/useSuspenseQueries.d.ts +66 -0
- package/build/legacy/useSuspenseQueries.js +22 -0
- package/build/legacy/useSuspenseQueries.js.map +1 -0
- package/build/modern/index.cjs +3 -0
- package/build/modern/index.cjs.map +1 -1
- package/build/modern/index.d.cts +3 -2
- package/build/modern/index.d.ts +3 -2
- package/build/modern/index.js +2 -0
- package/build/modern/index.js.map +1 -1
- package/build/modern/infiniteQueryOptions.cjs.map +1 -1
- package/build/modern/infiniteQueryOptions.d.cts +1 -1
- package/build/modern/infiniteQueryOptions.d.ts +1 -1
- package/build/modern/infiniteQueryOptions.js.map +1 -1
- package/build/modern/queryOptions.cjs.map +1 -1
- package/build/modern/queryOptions.d.cts +2 -2
- package/build/modern/queryOptions.d.ts +2 -2
- package/build/modern/queryOptions.js.map +1 -1
- package/build/modern/types.cjs.map +1 -1
- package/build/modern/types.d.cts +4 -4
- package/build/modern/types.d.ts +4 -4
- package/build/modern/useInfiniteQuery.cjs.map +1 -1
- package/build/modern/useInfiniteQuery.d.cts +2 -1
- package/build/modern/useInfiniteQuery.d.ts +2 -1
- package/build/modern/useInfiniteQuery.js.map +1 -1
- package/build/modern/useQueries.cjs.map +1 -1
- package/build/modern/useQueries.d.cts +1 -1
- package/build/modern/useQueries.d.ts +1 -1
- package/build/modern/useQueries.js.map +1 -1
- package/build/modern/useQuery.cjs.map +1 -1
- package/build/modern/useQuery.d.cts +2 -1
- package/build/modern/useQuery.d.ts +2 -1
- package/build/modern/useQuery.js.map +1 -1
- package/build/modern/useSuspenseQueries.cjs +46 -0
- package/build/modern/useSuspenseQueries.cjs.map +1 -0
- package/build/modern/useSuspenseQueries.d.cts +66 -0
- package/build/modern/useSuspenseQueries.d.ts +66 -0
- package/build/modern/useSuspenseQueries.js +22 -0
- package/build/modern/useSuspenseQueries.js.map +1 -0
- package/package.json +6 -5
- package/src/__tests__/QueryResetErrorBoundary.test.tsx +10 -6
- package/src/__tests__/suspense.test.tsx +28 -388
- package/src/__tests__/useInfiniteQuery.type.test.tsx +14 -3
- package/src/__tests__/useQuery.test.tsx +3 -0
- package/src/__tests__/useQuery.types.test.tsx +28 -67
- package/src/index.ts +13 -0
- package/src/infiniteQueryOptions.ts +3 -1
- package/src/queryOptions.ts +14 -6
- package/src/types.ts +20 -14
- package/src/useInfiniteQuery.ts +7 -2
- package/src/useQueries.ts +1 -1
- package/src/useQuery.ts +3 -1
- package/src/useSuspenseQueries.ts +157 -0
- /package/build/codemods/{transformers → src/utils/transformers}/query-cache-transformer.js +0 -0
- /package/build/codemods/{transformers → src/utils/transformers}/query-client-transformer.js +0 -0
- /package/build/codemods/{transformers → src/utils/transformers}/use-query-like-transformer.js +0 -0
- /package/build/codemods/{utils → src/v4/utils}/replacers/key-replacer.js +0 -0
- /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/remove-overloads.js +0 -0
- /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/transformers/filter-aware-usage-transformer.js +0 -0
- /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/transformers/query-fn-aware-usage-transformer.js +0 -0
- /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/utils/index.js +0 -0
- /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/utils/unknown-usage-error.js +0 -0
- /package/build/codemods/{rename-hydrate → src/v5/rename-hydrate}/rename-hydrate.js +0 -0
- /package/build/codemods/{rename-properties → src/v5/rename-properties}/rename-properties.js +0 -0
|
@@ -5,21 +5,25 @@ import { vi } from 'vitest'
|
|
|
5
5
|
import {
|
|
6
6
|
QueryCache,
|
|
7
7
|
QueryErrorResetBoundary,
|
|
8
|
-
useInfiniteQuery,
|
|
9
|
-
useQueries,
|
|
10
|
-
useQuery,
|
|
11
8
|
useQueryErrorResetBoundary,
|
|
9
|
+
useSuspenseInfiniteQuery,
|
|
10
|
+
useSuspenseQueries,
|
|
11
|
+
useSuspenseQuery,
|
|
12
12
|
} from '..'
|
|
13
13
|
import { createQueryClient, queryKey, renderWithClient, sleep } from './utils'
|
|
14
|
-
import type {
|
|
14
|
+
import type {
|
|
15
|
+
InfiniteData,
|
|
16
|
+
UseSuspenseInfiniteQueryResult,
|
|
17
|
+
UseSuspenseQueryResult,
|
|
18
|
+
} from '..'
|
|
15
19
|
|
|
16
|
-
describe(
|
|
20
|
+
describe('useSuspenseQuery', () => {
|
|
17
21
|
const queryCache = new QueryCache()
|
|
18
22
|
const queryClient = createQueryClient({ queryCache })
|
|
19
23
|
|
|
20
24
|
it('should render the correct amount of times in Suspense mode', async () => {
|
|
21
25
|
const key = queryKey()
|
|
22
|
-
const states:
|
|
26
|
+
const states: UseSuspenseQueryResult<number>[] = []
|
|
23
27
|
|
|
24
28
|
let count = 0
|
|
25
29
|
let renders = 0
|
|
@@ -29,14 +33,13 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
29
33
|
|
|
30
34
|
const [stateKey, setStateKey] = React.useState(key)
|
|
31
35
|
|
|
32
|
-
const state =
|
|
36
|
+
const state = useSuspenseQuery({
|
|
33
37
|
queryKey: stateKey,
|
|
34
38
|
queryFn: async () => {
|
|
35
39
|
count++
|
|
36
40
|
await sleep(10)
|
|
37
41
|
return count
|
|
38
42
|
},
|
|
39
|
-
suspense: true,
|
|
40
43
|
})
|
|
41
44
|
|
|
42
45
|
states.push(state)
|
|
@@ -69,17 +72,16 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
69
72
|
|
|
70
73
|
it('should return the correct states for a successful infinite query', async () => {
|
|
71
74
|
const key = queryKey()
|
|
72
|
-
const states:
|
|
75
|
+
const states: UseSuspenseInfiniteQueryResult<InfiniteData<number>>[] = []
|
|
73
76
|
|
|
74
77
|
function Page() {
|
|
75
78
|
const [multiplier, setMultiplier] = React.useState(1)
|
|
76
|
-
const state =
|
|
79
|
+
const state = useSuspenseInfiniteQuery({
|
|
77
80
|
queryKey: [`${key}_${multiplier}`],
|
|
78
81
|
queryFn: async ({ pageParam }) => {
|
|
79
82
|
await sleep(10)
|
|
80
83
|
return Number(pageParam * multiplier)
|
|
81
84
|
},
|
|
82
|
-
suspense: true,
|
|
83
85
|
defaultPageParam: 1,
|
|
84
86
|
getNextPageParam: (lastPage) => lastPage + 1,
|
|
85
87
|
})
|
|
@@ -127,7 +129,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
127
129
|
})
|
|
128
130
|
|
|
129
131
|
function Page() {
|
|
130
|
-
|
|
132
|
+
useSuspenseQuery({ queryKey: [key], queryFn })
|
|
131
133
|
|
|
132
134
|
return <>rendered</>
|
|
133
135
|
}
|
|
@@ -148,13 +150,12 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
148
150
|
const key = queryKey()
|
|
149
151
|
|
|
150
152
|
function Page() {
|
|
151
|
-
|
|
153
|
+
useSuspenseQuery({
|
|
152
154
|
queryKey: key,
|
|
153
155
|
queryFn: () => {
|
|
154
156
|
sleep(10)
|
|
155
157
|
return 'data'
|
|
156
158
|
},
|
|
157
|
-
suspense: true,
|
|
158
159
|
})
|
|
159
160
|
|
|
160
161
|
return <>rendered</>
|
|
@@ -200,7 +201,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
200
201
|
let succeed = false
|
|
201
202
|
|
|
202
203
|
function Page() {
|
|
203
|
-
|
|
204
|
+
useSuspenseQuery({
|
|
204
205
|
queryKey: key,
|
|
205
206
|
queryFn: async () => {
|
|
206
207
|
await sleep(10)
|
|
@@ -212,7 +213,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
212
213
|
}
|
|
213
214
|
},
|
|
214
215
|
retryDelay: 10,
|
|
215
|
-
suspense: true,
|
|
216
216
|
})
|
|
217
217
|
|
|
218
218
|
return <div>rendered</div>
|
|
@@ -272,7 +272,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
272
272
|
let succeed = false
|
|
273
273
|
|
|
274
274
|
function Page() {
|
|
275
|
-
|
|
275
|
+
useSuspenseQuery({
|
|
276
276
|
queryKey: key,
|
|
277
277
|
queryFn: async () => {
|
|
278
278
|
await sleep(10)
|
|
@@ -283,7 +283,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
283
283
|
}
|
|
284
284
|
},
|
|
285
285
|
retry: false,
|
|
286
|
-
suspense: true,
|
|
287
286
|
})
|
|
288
287
|
return <div>rendered</div>
|
|
289
288
|
}
|
|
@@ -332,7 +331,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
332
331
|
let count = 0
|
|
333
332
|
|
|
334
333
|
function Component() {
|
|
335
|
-
const result =
|
|
334
|
+
const result = useSuspenseQuery({
|
|
336
335
|
queryKey: key,
|
|
337
336
|
queryFn: async () => {
|
|
338
337
|
await sleep(100)
|
|
@@ -340,7 +339,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
340
339
|
return count
|
|
341
340
|
},
|
|
342
341
|
retry: false,
|
|
343
|
-
suspense: true,
|
|
344
342
|
staleTime: 0,
|
|
345
343
|
})
|
|
346
344
|
return (
|
|
@@ -388,7 +386,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
388
386
|
const key2 = queryKey()
|
|
389
387
|
|
|
390
388
|
function Component(props: { queryKey: Array<string> }) {
|
|
391
|
-
const result =
|
|
389
|
+
const result = useSuspenseQuery({
|
|
392
390
|
queryKey: props.queryKey,
|
|
393
391
|
queryFn: async () => {
|
|
394
392
|
await sleep(100)
|
|
@@ -396,7 +394,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
396
394
|
},
|
|
397
395
|
|
|
398
396
|
retry: false,
|
|
399
|
-
suspense: true,
|
|
400
397
|
})
|
|
401
398
|
return <div>data: {result.data}</div>
|
|
402
399
|
}
|
|
@@ -437,7 +434,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
437
434
|
let succeed = false
|
|
438
435
|
|
|
439
436
|
function Page() {
|
|
440
|
-
|
|
437
|
+
useSuspenseQuery({
|
|
441
438
|
queryKey: key,
|
|
442
439
|
queryFn: async () => {
|
|
443
440
|
await sleep(10)
|
|
@@ -448,7 +445,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
448
445
|
}
|
|
449
446
|
},
|
|
450
447
|
retry: false,
|
|
451
|
-
suspense: true,
|
|
452
448
|
})
|
|
453
449
|
return <div>rendered</div>
|
|
454
450
|
}
|
|
@@ -499,96 +495,13 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
499
495
|
const key = queryKey()
|
|
500
496
|
|
|
501
497
|
function Page() {
|
|
502
|
-
|
|
498
|
+
useSuspenseQuery({
|
|
503
499
|
queryKey: key,
|
|
504
500
|
queryFn: async (): Promise<unknown> => {
|
|
505
501
|
await sleep(10)
|
|
506
502
|
throw new Error('Suspense Error a1x')
|
|
507
503
|
},
|
|
508
504
|
retry: false,
|
|
509
|
-
suspense: true,
|
|
510
|
-
})
|
|
511
|
-
return <div>rendered</div>
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
function App() {
|
|
515
|
-
return (
|
|
516
|
-
<ErrorBoundary
|
|
517
|
-
fallbackRender={() => (
|
|
518
|
-
<div>
|
|
519
|
-
<div>error boundary</div>
|
|
520
|
-
</div>
|
|
521
|
-
)}
|
|
522
|
-
>
|
|
523
|
-
<React.Suspense fallback="Loading...">
|
|
524
|
-
<Page />
|
|
525
|
-
</React.Suspense>
|
|
526
|
-
</ErrorBoundary>
|
|
527
|
-
)
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
const rendered = renderWithClient(queryClient, <App />)
|
|
531
|
-
|
|
532
|
-
await waitFor(() => rendered.getByText('Loading...'))
|
|
533
|
-
await waitFor(() => rendered.getByText('error boundary'))
|
|
534
|
-
consoleMock.mockRestore()
|
|
535
|
-
})
|
|
536
|
-
|
|
537
|
-
it('should not throw errors to the error boundary when throwOnError: false', async () => {
|
|
538
|
-
const key = queryKey()
|
|
539
|
-
|
|
540
|
-
function Page() {
|
|
541
|
-
useQuery({
|
|
542
|
-
queryKey: key,
|
|
543
|
-
queryFn: async (): Promise<unknown> => {
|
|
544
|
-
await sleep(10)
|
|
545
|
-
throw new Error('Suspense Error a2x')
|
|
546
|
-
},
|
|
547
|
-
retry: false,
|
|
548
|
-
suspense: true,
|
|
549
|
-
throwOnError: false,
|
|
550
|
-
})
|
|
551
|
-
return <div>rendered</div>
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
function App() {
|
|
555
|
-
return (
|
|
556
|
-
<ErrorBoundary
|
|
557
|
-
fallbackRender={() => (
|
|
558
|
-
<div>
|
|
559
|
-
<div>error boundary</div>
|
|
560
|
-
</div>
|
|
561
|
-
)}
|
|
562
|
-
>
|
|
563
|
-
<React.Suspense fallback="Loading...">
|
|
564
|
-
<Page />
|
|
565
|
-
</React.Suspense>
|
|
566
|
-
</ErrorBoundary>
|
|
567
|
-
)
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
const rendered = renderWithClient(queryClient, <App />)
|
|
571
|
-
|
|
572
|
-
await waitFor(() => rendered.getByText('Loading...'))
|
|
573
|
-
await waitFor(() => rendered.getByText('rendered'))
|
|
574
|
-
})
|
|
575
|
-
|
|
576
|
-
it('should throw errors to the error boundary when a throwOnError function returns true', async () => {
|
|
577
|
-
const consoleMock = vi
|
|
578
|
-
.spyOn(console, 'error')
|
|
579
|
-
.mockImplementation(() => undefined)
|
|
580
|
-
const key = queryKey()
|
|
581
|
-
|
|
582
|
-
function Page() {
|
|
583
|
-
useQuery({
|
|
584
|
-
queryKey: key,
|
|
585
|
-
queryFn: async (): Promise<unknown> => {
|
|
586
|
-
await sleep(10)
|
|
587
|
-
return Promise.reject(new Error('Remote Error'))
|
|
588
|
-
},
|
|
589
|
-
retry: false,
|
|
590
|
-
suspense: true,
|
|
591
|
-
throwOnError: (err) => err.message !== 'Local Error',
|
|
592
505
|
})
|
|
593
506
|
return <div>rendered</div>
|
|
594
507
|
}
|
|
@@ -616,89 +529,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
616
529
|
consoleMock.mockRestore()
|
|
617
530
|
})
|
|
618
531
|
|
|
619
|
-
it('should not throw errors to the error boundary when a throwOnError function returns false', async () => {
|
|
620
|
-
const key = queryKey()
|
|
621
|
-
|
|
622
|
-
function Page() {
|
|
623
|
-
useQuery({
|
|
624
|
-
queryKey: key,
|
|
625
|
-
queryFn: async (): Promise<unknown> => {
|
|
626
|
-
await sleep(10)
|
|
627
|
-
return Promise.reject(new Error('Local Error'))
|
|
628
|
-
},
|
|
629
|
-
retry: false,
|
|
630
|
-
suspense: true,
|
|
631
|
-
throwOnError: (err) => err.message !== 'Local Error',
|
|
632
|
-
})
|
|
633
|
-
return <div>rendered</div>
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
function App() {
|
|
637
|
-
return (
|
|
638
|
-
<ErrorBoundary
|
|
639
|
-
fallbackRender={() => (
|
|
640
|
-
<div>
|
|
641
|
-
<div>error boundary</div>
|
|
642
|
-
</div>
|
|
643
|
-
)}
|
|
644
|
-
>
|
|
645
|
-
<React.Suspense fallback="Loading...">
|
|
646
|
-
<Page />
|
|
647
|
-
</React.Suspense>
|
|
648
|
-
</ErrorBoundary>
|
|
649
|
-
)
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
const rendered = renderWithClient(queryClient, <App />)
|
|
653
|
-
|
|
654
|
-
await waitFor(() => rendered.getByText('Loading...'))
|
|
655
|
-
await waitFor(() => rendered.getByText('rendered'))
|
|
656
|
-
})
|
|
657
|
-
|
|
658
|
-
it('should not call the queryFn when not enabled', async () => {
|
|
659
|
-
const key = queryKey()
|
|
660
|
-
|
|
661
|
-
const queryFn = vi.fn<unknown[], Promise<string>>()
|
|
662
|
-
queryFn.mockImplementation(async () => {
|
|
663
|
-
await sleep(10)
|
|
664
|
-
return '23'
|
|
665
|
-
})
|
|
666
|
-
|
|
667
|
-
function Page() {
|
|
668
|
-
const [enabled, setEnabled] = React.useState(false)
|
|
669
|
-
const result = useQuery({
|
|
670
|
-
queryKey: [key],
|
|
671
|
-
queryFn,
|
|
672
|
-
suspense: true,
|
|
673
|
-
enabled,
|
|
674
|
-
})
|
|
675
|
-
|
|
676
|
-
return (
|
|
677
|
-
<div>
|
|
678
|
-
<button onClick={() => setEnabled(true)}>fire</button>
|
|
679
|
-
<h1>{result.data}</h1>
|
|
680
|
-
</div>
|
|
681
|
-
)
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
const rendered = renderWithClient(
|
|
685
|
-
queryClient,
|
|
686
|
-
<React.Suspense fallback="loading">
|
|
687
|
-
<Page />
|
|
688
|
-
</React.Suspense>,
|
|
689
|
-
)
|
|
690
|
-
|
|
691
|
-
expect(queryFn).toHaveBeenCalledTimes(0)
|
|
692
|
-
|
|
693
|
-
fireEvent.click(rendered.getByRole('button', { name: /fire/i }))
|
|
694
|
-
|
|
695
|
-
await waitFor(() => {
|
|
696
|
-
expect(rendered.getByRole('heading').textContent).toBe('23')
|
|
697
|
-
})
|
|
698
|
-
|
|
699
|
-
expect(queryFn).toHaveBeenCalledTimes(1)
|
|
700
|
-
})
|
|
701
|
-
|
|
702
532
|
it('should error catched in error boundary without infinite loop', async () => {
|
|
703
533
|
const consoleMock = vi
|
|
704
534
|
.spyOn(console, 'error')
|
|
@@ -710,7 +540,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
710
540
|
function Page() {
|
|
711
541
|
const [nonce] = React.useState(0)
|
|
712
542
|
const queryKeys = [`${key}-${succeed}`]
|
|
713
|
-
const result =
|
|
543
|
+
const result = useSuspenseQuery({
|
|
714
544
|
queryKey: queryKeys,
|
|
715
545
|
queryFn: async () => {
|
|
716
546
|
await sleep(10)
|
|
@@ -721,7 +551,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
721
551
|
}
|
|
722
552
|
},
|
|
723
553
|
retry: false,
|
|
724
|
-
suspense: true,
|
|
725
554
|
})
|
|
726
555
|
return (
|
|
727
556
|
<div>
|
|
@@ -782,7 +611,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
782
611
|
const [key, rerender] = React.useReducer((x) => x + 1, 0)
|
|
783
612
|
const queryKeys = [key, succeed]
|
|
784
613
|
|
|
785
|
-
const result =
|
|
614
|
+
const result = useSuspenseQuery({
|
|
786
615
|
queryKey: queryKeys,
|
|
787
616
|
queryFn: async () => {
|
|
788
617
|
await sleep(10)
|
|
@@ -793,7 +622,6 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
793
622
|
}
|
|
794
623
|
},
|
|
795
624
|
retry: false,
|
|
796
|
-
suspense: true,
|
|
797
625
|
})
|
|
798
626
|
return (
|
|
799
627
|
<div>
|
|
@@ -839,77 +667,9 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
839
667
|
consoleMock.mockRestore()
|
|
840
668
|
})
|
|
841
669
|
|
|
842
|
-
it('should error catched in error boundary without infinite loop when enabled changed', async () => {
|
|
843
|
-
const consoleMock = vi
|
|
844
|
-
.spyOn(console, 'error')
|
|
845
|
-
.mockImplementation(() => undefined)
|
|
846
|
-
function Page() {
|
|
847
|
-
const queryKeys = '1'
|
|
848
|
-
const [enabled, setEnabled] = React.useState(false)
|
|
849
|
-
|
|
850
|
-
const result = useQuery<string>({
|
|
851
|
-
queryKey: [queryKeys],
|
|
852
|
-
queryFn: async () => {
|
|
853
|
-
await sleep(10)
|
|
854
|
-
throw new Error('Suspense Error Bingo')
|
|
855
|
-
},
|
|
856
|
-
|
|
857
|
-
retry: false,
|
|
858
|
-
suspense: true,
|
|
859
|
-
enabled,
|
|
860
|
-
})
|
|
861
|
-
return (
|
|
862
|
-
<div>
|
|
863
|
-
<span>rendered</span> <span>{result.data}</span>
|
|
864
|
-
<button
|
|
865
|
-
aria-label="fail"
|
|
866
|
-
onClick={() => {
|
|
867
|
-
setEnabled(true)
|
|
868
|
-
}}
|
|
869
|
-
>
|
|
870
|
-
fail
|
|
871
|
-
</button>
|
|
872
|
-
</div>
|
|
873
|
-
)
|
|
874
|
-
}
|
|
875
|
-
|
|
876
|
-
function App() {
|
|
877
|
-
const { reset } = useQueryErrorResetBoundary()
|
|
878
|
-
return (
|
|
879
|
-
<ErrorBoundary
|
|
880
|
-
onReset={reset}
|
|
881
|
-
fallbackRender={() => <div>error boundary</div>}
|
|
882
|
-
>
|
|
883
|
-
<React.Suspense fallback="Loading...">
|
|
884
|
-
<Page />
|
|
885
|
-
</React.Suspense>
|
|
886
|
-
</ErrorBoundary>
|
|
887
|
-
)
|
|
888
|
-
}
|
|
889
|
-
|
|
890
|
-
const rendered = renderWithClient(queryClient, <App />)
|
|
891
|
-
|
|
892
|
-
// render empty data with 'rendered' when enabled is false
|
|
893
|
-
await waitFor(() => rendered.getByText('rendered'))
|
|
894
|
-
|
|
895
|
-
// change enabled to true
|
|
896
|
-
fireEvent.click(rendered.getByLabelText('fail'))
|
|
897
|
-
|
|
898
|
-
// render pending fallback
|
|
899
|
-
await waitFor(() => rendered.getByText('Loading...'))
|
|
900
|
-
|
|
901
|
-
// render error boundary fallback (error boundary)
|
|
902
|
-
await waitFor(() => rendered.getByText('error boundary'))
|
|
903
|
-
expect(consoleMock).toHaveBeenCalledWith(
|
|
904
|
-
expect.objectContaining(new Error('Suspense Error Bingo')),
|
|
905
|
-
)
|
|
906
|
-
|
|
907
|
-
consoleMock.mockRestore()
|
|
908
|
-
})
|
|
909
|
-
|
|
910
670
|
it('should render the correct amount of times in Suspense mode when gcTime is set to 0', async () => {
|
|
911
671
|
const key = queryKey()
|
|
912
|
-
let state:
|
|
672
|
+
let state: UseSuspenseQueryResult<number> | null = null
|
|
913
673
|
|
|
914
674
|
let count = 0
|
|
915
675
|
let renders = 0
|
|
@@ -917,14 +677,13 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
917
677
|
function Page() {
|
|
918
678
|
renders++
|
|
919
679
|
|
|
920
|
-
state =
|
|
680
|
+
state = useSuspenseQuery({
|
|
921
681
|
queryKey: key,
|
|
922
682
|
queryFn: async () => {
|
|
923
683
|
count++
|
|
924
684
|
await sleep(10)
|
|
925
685
|
return count
|
|
926
686
|
},
|
|
927
|
-
suspense: true,
|
|
928
687
|
gcTime: 0,
|
|
929
688
|
})
|
|
930
689
|
|
|
@@ -954,7 +713,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
954
713
|
})
|
|
955
714
|
})
|
|
956
715
|
|
|
957
|
-
describe('
|
|
716
|
+
describe('useSuspenseQueries', () => {
|
|
958
717
|
const queryClient = createQueryClient()
|
|
959
718
|
it('should suspend all queries in parallel', async () => {
|
|
960
719
|
const key1 = queryKey()
|
|
@@ -967,7 +726,7 @@ describe('useQueries with suspense', () => {
|
|
|
967
726
|
}
|
|
968
727
|
|
|
969
728
|
function Page() {
|
|
970
|
-
const result =
|
|
729
|
+
const result = useSuspenseQueries({
|
|
971
730
|
queries: [
|
|
972
731
|
{
|
|
973
732
|
queryKey: key1,
|
|
@@ -976,7 +735,6 @@ describe('useQueries with suspense', () => {
|
|
|
976
735
|
await sleep(10)
|
|
977
736
|
return '1'
|
|
978
737
|
},
|
|
979
|
-
suspense: true,
|
|
980
738
|
},
|
|
981
739
|
{
|
|
982
740
|
queryKey: key2,
|
|
@@ -985,7 +743,6 @@ describe('useQueries with suspense', () => {
|
|
|
985
743
|
await sleep(20)
|
|
986
744
|
return '2'
|
|
987
745
|
},
|
|
988
|
-
suspense: true,
|
|
989
746
|
},
|
|
990
747
|
],
|
|
991
748
|
})
|
|
@@ -1009,63 +766,6 @@ describe('useQueries with suspense', () => {
|
|
|
1009
766
|
expect(results).toEqual(['1', '2', 'loading'])
|
|
1010
767
|
})
|
|
1011
768
|
|
|
1012
|
-
it('should allow to mix suspense with non-suspense', async () => {
|
|
1013
|
-
const key1 = queryKey()
|
|
1014
|
-
const key2 = queryKey()
|
|
1015
|
-
const results: string[] = []
|
|
1016
|
-
|
|
1017
|
-
function Fallback() {
|
|
1018
|
-
results.push('loading')
|
|
1019
|
-
return <div>loading</div>
|
|
1020
|
-
}
|
|
1021
|
-
|
|
1022
|
-
function Page() {
|
|
1023
|
-
const result = useQueries({
|
|
1024
|
-
queries: [
|
|
1025
|
-
{
|
|
1026
|
-
queryKey: key1,
|
|
1027
|
-
queryFn: async () => {
|
|
1028
|
-
results.push('1')
|
|
1029
|
-
await sleep(50)
|
|
1030
|
-
return '1'
|
|
1031
|
-
},
|
|
1032
|
-
suspense: true,
|
|
1033
|
-
},
|
|
1034
|
-
{
|
|
1035
|
-
queryKey: key2,
|
|
1036
|
-
queryFn: async () => {
|
|
1037
|
-
results.push('2')
|
|
1038
|
-
await sleep(200)
|
|
1039
|
-
return '2'
|
|
1040
|
-
},
|
|
1041
|
-
staleTime: 2000,
|
|
1042
|
-
suspense: false,
|
|
1043
|
-
},
|
|
1044
|
-
],
|
|
1045
|
-
})
|
|
1046
|
-
|
|
1047
|
-
return (
|
|
1048
|
-
<div>
|
|
1049
|
-
<h1>data: {result.map((it) => it.data ?? 'null').join(',')}</h1>
|
|
1050
|
-
<h2>status: {result.map((it) => it.status).join(',')}</h2>
|
|
1051
|
-
</div>
|
|
1052
|
-
)
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
const rendered = renderWithClient(
|
|
1056
|
-
queryClient,
|
|
1057
|
-
<React.Suspense fallback={<Fallback />}>
|
|
1058
|
-
<Page />
|
|
1059
|
-
</React.Suspense>,
|
|
1060
|
-
)
|
|
1061
|
-
await waitFor(() => rendered.getByText('loading'))
|
|
1062
|
-
await waitFor(() => rendered.getByText('status: success,pending'))
|
|
1063
|
-
await waitFor(() => rendered.getByText('data: 1,null'))
|
|
1064
|
-
await waitFor(() => rendered.getByText('data: 1,2'))
|
|
1065
|
-
|
|
1066
|
-
expect(results).toEqual(['1', '2', 'loading'])
|
|
1067
|
-
})
|
|
1068
|
-
|
|
1069
769
|
it("shouldn't unmount before all promises fetched", async () => {
|
|
1070
770
|
const key1 = queryKey()
|
|
1071
771
|
const key2 = queryKey()
|
|
@@ -1079,7 +779,7 @@ describe('useQueries with suspense', () => {
|
|
|
1079
779
|
|
|
1080
780
|
function Page() {
|
|
1081
781
|
const ref = React.useRef(Math.random())
|
|
1082
|
-
const result =
|
|
782
|
+
const result = useSuspenseQueries({
|
|
1083
783
|
queries: [
|
|
1084
784
|
{
|
|
1085
785
|
queryKey: key1,
|
|
@@ -1089,7 +789,6 @@ describe('useQueries with suspense', () => {
|
|
|
1089
789
|
await sleep(10)
|
|
1090
790
|
return '1'
|
|
1091
791
|
},
|
|
1092
|
-
suspense: true,
|
|
1093
792
|
},
|
|
1094
793
|
{
|
|
1095
794
|
queryKey: key2,
|
|
@@ -1099,7 +798,6 @@ describe('useQueries with suspense', () => {
|
|
|
1099
798
|
await sleep(20)
|
|
1100
799
|
return '2'
|
|
1101
800
|
},
|
|
1102
|
-
suspense: true,
|
|
1103
801
|
},
|
|
1104
802
|
],
|
|
1105
803
|
})
|
|
@@ -1121,62 +819,4 @@ describe('useQueries with suspense', () => {
|
|
|
1121
819
|
await waitFor(() => rendered.getByText('data: 1,2'))
|
|
1122
820
|
expect(refs[0]).toBe(refs[1])
|
|
1123
821
|
})
|
|
1124
|
-
|
|
1125
|
-
it('should suspend all queries in parallel - global configuration', async () => {
|
|
1126
|
-
const queryClientSuspenseMode = createQueryClient({
|
|
1127
|
-
defaultOptions: {
|
|
1128
|
-
queries: {
|
|
1129
|
-
suspense: true,
|
|
1130
|
-
},
|
|
1131
|
-
},
|
|
1132
|
-
})
|
|
1133
|
-
const key1 = queryKey()
|
|
1134
|
-
const key2 = queryKey()
|
|
1135
|
-
const results: string[] = []
|
|
1136
|
-
|
|
1137
|
-
function Fallback() {
|
|
1138
|
-
results.push('loading')
|
|
1139
|
-
return <div>loading</div>
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
function Page() {
|
|
1143
|
-
const result = useQueries({
|
|
1144
|
-
queries: [
|
|
1145
|
-
{
|
|
1146
|
-
queryKey: key1,
|
|
1147
|
-
queryFn: async () => {
|
|
1148
|
-
results.push('1')
|
|
1149
|
-
await sleep(10)
|
|
1150
|
-
return '1'
|
|
1151
|
-
},
|
|
1152
|
-
},
|
|
1153
|
-
{
|
|
1154
|
-
queryKey: key2,
|
|
1155
|
-
queryFn: async () => {
|
|
1156
|
-
results.push('2')
|
|
1157
|
-
await sleep(20)
|
|
1158
|
-
return '2'
|
|
1159
|
-
},
|
|
1160
|
-
},
|
|
1161
|
-
],
|
|
1162
|
-
})
|
|
1163
|
-
return (
|
|
1164
|
-
<div>
|
|
1165
|
-
<h1>data: {result.map((it) => it.data ?? 'null').join(',')}</h1>
|
|
1166
|
-
</div>
|
|
1167
|
-
)
|
|
1168
|
-
}
|
|
1169
|
-
|
|
1170
|
-
const rendered = renderWithClient(
|
|
1171
|
-
queryClientSuspenseMode,
|
|
1172
|
-
<React.Suspense fallback={<Fallback />}>
|
|
1173
|
-
<Page />
|
|
1174
|
-
</React.Suspense>,
|
|
1175
|
-
)
|
|
1176
|
-
|
|
1177
|
-
await waitFor(() => rendered.getByText('loading'))
|
|
1178
|
-
await waitFor(() => rendered.getByText('data: 1,2'))
|
|
1179
|
-
|
|
1180
|
-
expect(results).toEqual(['1', '2', 'loading'])
|
|
1181
|
-
})
|
|
1182
822
|
})
|
|
@@ -100,9 +100,14 @@ describe('select', () => {
|
|
|
100
100
|
getNextPageParam: () => undefined,
|
|
101
101
|
})
|
|
102
102
|
|
|
103
|
+
// TODO: Order of generics prevents pageParams to be typed correctly. Using `unknown` for now
|
|
103
104
|
const result: Expect<
|
|
104
|
-
Equal<
|
|
105
|
+
Equal<
|
|
106
|
+
InfiniteData<number, unknown> | undefined,
|
|
107
|
+
(typeof infiniteQuery)['data']
|
|
108
|
+
>
|
|
105
109
|
> = true
|
|
110
|
+
|
|
106
111
|
return result
|
|
107
112
|
})
|
|
108
113
|
})
|
|
@@ -117,7 +122,9 @@ describe('select', () => {
|
|
|
117
122
|
defaultPageParam: 1,
|
|
118
123
|
getNextPageParam: () => undefined,
|
|
119
124
|
select: (data) => {
|
|
120
|
-
const result: Expect<
|
|
125
|
+
const result: Expect<
|
|
126
|
+
Equal<InfiniteData<number, number>, typeof data>
|
|
127
|
+
> = true
|
|
121
128
|
return result
|
|
122
129
|
},
|
|
123
130
|
})
|
|
@@ -203,8 +210,12 @@ describe('getNextPageParam / getPreviousPageParam', () => {
|
|
|
203
210
|
},
|
|
204
211
|
})
|
|
205
212
|
|
|
213
|
+
// TODO: Order of generics prevents pageParams to be typed correctly. Using `unknown` for now
|
|
206
214
|
const result: Expect<
|
|
207
|
-
Equal<
|
|
215
|
+
Equal<
|
|
216
|
+
InfiniteData<string, unknown> | undefined,
|
|
217
|
+
(typeof infiniteQuery)['data']
|
|
218
|
+
>
|
|
208
219
|
> = true
|
|
209
220
|
return result
|
|
210
221
|
})
|