@tanstack/react-query 5.0.0-alpha.91 → 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.
Files changed (97) hide show
  1. package/build/codemods/package.json +33 -0
  2. package/build/codemods/tsconfig.json +4 -0
  3. package/build/legacy/index.cjs +3 -0
  4. package/build/legacy/index.cjs.map +1 -1
  5. package/build/legacy/index.d.cts +3 -2
  6. package/build/legacy/index.d.ts +3 -2
  7. package/build/legacy/index.js +2 -0
  8. package/build/legacy/index.js.map +1 -1
  9. package/build/legacy/infiniteQueryOptions.cjs.map +1 -1
  10. package/build/legacy/infiniteQueryOptions.d.cts +1 -1
  11. package/build/legacy/infiniteQueryOptions.d.ts +1 -1
  12. package/build/legacy/infiniteQueryOptions.js.map +1 -1
  13. package/build/legacy/queryOptions.cjs.map +1 -1
  14. package/build/legacy/queryOptions.d.cts +2 -2
  15. package/build/legacy/queryOptions.d.ts +2 -2
  16. package/build/legacy/queryOptions.js.map +1 -1
  17. package/build/legacy/types.cjs.map +1 -1
  18. package/build/legacy/types.d.cts +4 -4
  19. package/build/legacy/types.d.ts +4 -4
  20. package/build/legacy/useInfiniteQuery.cjs.map +1 -1
  21. package/build/legacy/useInfiniteQuery.d.cts +2 -1
  22. package/build/legacy/useInfiniteQuery.d.ts +2 -1
  23. package/build/legacy/useInfiniteQuery.js.map +1 -1
  24. package/build/legacy/useQueries.cjs.map +1 -1
  25. package/build/legacy/useQueries.d.cts +1 -1
  26. package/build/legacy/useQueries.d.ts +1 -1
  27. package/build/legacy/useQueries.js.map +1 -1
  28. package/build/legacy/useQuery.cjs.map +1 -1
  29. package/build/legacy/useQuery.d.cts +2 -1
  30. package/build/legacy/useQuery.d.ts +2 -1
  31. package/build/legacy/useQuery.js.map +1 -1
  32. package/build/legacy/useSuspenseQueries.cjs +46 -0
  33. package/build/legacy/useSuspenseQueries.cjs.map +1 -0
  34. package/build/legacy/useSuspenseQueries.d.cts +66 -0
  35. package/build/legacy/useSuspenseQueries.d.ts +66 -0
  36. package/build/legacy/useSuspenseQueries.js +22 -0
  37. package/build/legacy/useSuspenseQueries.js.map +1 -0
  38. package/build/modern/index.cjs +3 -0
  39. package/build/modern/index.cjs.map +1 -1
  40. package/build/modern/index.d.cts +3 -2
  41. package/build/modern/index.d.ts +3 -2
  42. package/build/modern/index.js +2 -0
  43. package/build/modern/index.js.map +1 -1
  44. package/build/modern/infiniteQueryOptions.cjs.map +1 -1
  45. package/build/modern/infiniteQueryOptions.d.cts +1 -1
  46. package/build/modern/infiniteQueryOptions.d.ts +1 -1
  47. package/build/modern/infiniteQueryOptions.js.map +1 -1
  48. package/build/modern/queryOptions.cjs.map +1 -1
  49. package/build/modern/queryOptions.d.cts +2 -2
  50. package/build/modern/queryOptions.d.ts +2 -2
  51. package/build/modern/queryOptions.js.map +1 -1
  52. package/build/modern/types.cjs.map +1 -1
  53. package/build/modern/types.d.cts +4 -4
  54. package/build/modern/types.d.ts +4 -4
  55. package/build/modern/useInfiniteQuery.cjs.map +1 -1
  56. package/build/modern/useInfiniteQuery.d.cts +2 -1
  57. package/build/modern/useInfiniteQuery.d.ts +2 -1
  58. package/build/modern/useInfiniteQuery.js.map +1 -1
  59. package/build/modern/useQueries.cjs.map +1 -1
  60. package/build/modern/useQueries.d.cts +1 -1
  61. package/build/modern/useQueries.d.ts +1 -1
  62. package/build/modern/useQueries.js.map +1 -1
  63. package/build/modern/useQuery.cjs.map +1 -1
  64. package/build/modern/useQuery.d.cts +2 -1
  65. package/build/modern/useQuery.d.ts +2 -1
  66. package/build/modern/useQuery.js.map +1 -1
  67. package/build/modern/useSuspenseQueries.cjs +46 -0
  68. package/build/modern/useSuspenseQueries.cjs.map +1 -0
  69. package/build/modern/useSuspenseQueries.d.cts +66 -0
  70. package/build/modern/useSuspenseQueries.d.ts +66 -0
  71. package/build/modern/useSuspenseQueries.js +22 -0
  72. package/build/modern/useSuspenseQueries.js.map +1 -0
  73. package/package.json +6 -5
  74. package/src/__tests__/QueryResetErrorBoundary.test.tsx +10 -6
  75. package/src/__tests__/suspense.test.tsx +28 -388
  76. package/src/__tests__/useInfiniteQuery.type.test.tsx +14 -3
  77. package/src/__tests__/useQuery.test.tsx +3 -0
  78. package/src/__tests__/useQuery.types.test.tsx +28 -67
  79. package/src/index.ts +13 -0
  80. package/src/infiniteQueryOptions.ts +3 -1
  81. package/src/queryOptions.ts +14 -6
  82. package/src/types.ts +20 -14
  83. package/src/useInfiniteQuery.ts +7 -2
  84. package/src/useQueries.ts +1 -1
  85. package/src/useQuery.ts +3 -1
  86. package/src/useSuspenseQueries.ts +157 -0
  87. /package/build/codemods/{transformers → src/utils/transformers}/query-cache-transformer.js +0 -0
  88. /package/build/codemods/{transformers → src/utils/transformers}/query-client-transformer.js +0 -0
  89. /package/build/codemods/{transformers → src/utils/transformers}/use-query-like-transformer.js +0 -0
  90. /package/build/codemods/{utils → src/v4/utils}/replacers/key-replacer.js +0 -0
  91. /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/remove-overloads.js +0 -0
  92. /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/transformers/filter-aware-usage-transformer.js +0 -0
  93. /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/transformers/query-fn-aware-usage-transformer.js +0 -0
  94. /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/utils/index.js +0 -0
  95. /package/build/codemods/{remove-overloads → src/v5/remove-overloads}/utils/unknown-usage-error.js +0 -0
  96. /package/build/codemods/{rename-hydrate → src/v5/rename-hydrate}/rename-hydrate.js +0 -0
  97. /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 { InfiniteData, UseInfiniteQueryResult, UseQueryResult } from '..'
14
+ import type {
15
+ InfiniteData,
16
+ UseSuspenseInfiniteQueryResult,
17
+ UseSuspenseQueryResult,
18
+ } from '..'
15
19
 
16
- describe("useQuery's in Suspense mode", () => {
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: UseQueryResult<number>[] = []
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 = useQuery({
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: UseInfiniteQueryResult<InfiniteData<number>>[] = []
75
+ const states: UseSuspenseInfiniteQueryResult<InfiniteData<number>>[] = []
73
76
 
74
77
  function Page() {
75
78
  const [multiplier, setMultiplier] = React.useState(1)
76
- const state = useInfiniteQuery({
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
- useQuery({ queryKey: [key], queryFn, suspense: true })
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
- useQuery({
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
- useQuery({
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
- useQuery({
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 = useQuery({
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 = useQuery({
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
- useQuery({
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
- useQuery({
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 = useQuery({
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 = useQuery({
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: UseQueryResult<number> | null = null
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 = useQuery({
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('useQueries with suspense', () => {
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 = useQueries({
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 = useQueries({
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<InfiniteData<number> | undefined, (typeof infiniteQuery)['data']>
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<Equal<InfiniteData<number>, typeof data>> = true
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<InfiniteData<string> | undefined, (typeof infiniteQuery)['data']>
215
+ Equal<
216
+ InfiniteData<string, unknown> | undefined,
217
+ (typeof infiniteQuery)['data']
218
+ >
208
219
  > = true
209
220
  return result
210
221
  })