@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.
Files changed (50) hide show
  1. package/README.md +3 -6
  2. package/build/codemods/src/v5/remove-overloads/remove-overloads.js +1 -1
  3. package/build/codemods/src/v5/remove-overloads/transformers/filter-aware-usage-transformer.js +32 -6
  4. package/build/legacy/QueryErrorResetBoundary.d.cts +1 -1
  5. package/build/legacy/QueryErrorResetBoundary.d.ts +1 -1
  6. package/build/legacy/suspense.cjs.map +1 -1
  7. package/build/legacy/suspense.js.map +1 -1
  8. package/build/legacy/useQueries.cjs.map +1 -1
  9. package/build/legacy/useQueries.d.cts +9 -5
  10. package/build/legacy/useQueries.d.ts +9 -5
  11. package/build/legacy/useQueries.js.map +1 -1
  12. package/build/legacy/useSuspenseQueries.cjs.map +1 -1
  13. package/build/legacy/useSuspenseQueries.d.cts +9 -5
  14. package/build/legacy/useSuspenseQueries.d.ts +9 -5
  15. package/build/legacy/useSuspenseQueries.js.map +1 -1
  16. package/build/modern/QueryErrorResetBoundary.d.cts +1 -1
  17. package/build/modern/QueryErrorResetBoundary.d.ts +1 -1
  18. package/build/modern/suspense.cjs.map +1 -1
  19. package/build/modern/suspense.js.map +1 -1
  20. package/build/modern/useQueries.cjs.map +1 -1
  21. package/build/modern/useQueries.d.cts +9 -5
  22. package/build/modern/useQueries.d.ts +9 -5
  23. package/build/modern/useQueries.js.map +1 -1
  24. package/build/modern/useSuspenseQueries.cjs.map +1 -1
  25. package/build/modern/useSuspenseQueries.d.cts +9 -5
  26. package/build/modern/useSuspenseQueries.d.ts +9 -5
  27. package/build/modern/useSuspenseQueries.js.map +1 -1
  28. package/package.json +4 -5
  29. package/src/__tests__/HydrationBoundary.test.tsx +1 -0
  30. package/src/__tests__/QueryClientProvider.test.tsx +1 -0
  31. package/src/__tests__/QueryResetErrorBoundary.test.tsx +1 -0
  32. package/src/__tests__/fine-grained-persister.test.tsx +1 -2
  33. package/src/__tests__/infiniteQueryOptions.types.test.tsx +1 -0
  34. package/src/__tests__/queryOptions.types.test.tsx +1 -0
  35. package/src/__tests__/ssr-hydration.test.tsx +1 -3
  36. package/src/__tests__/ssr.test.tsx +1 -2
  37. package/src/__tests__/suspense.test.tsx +3 -3
  38. package/src/__tests__/suspense.types.test.tsx +1 -0
  39. package/src/__tests__/useInfiniteQuery.test.tsx +1 -2
  40. package/src/__tests__/useInfiniteQuery.type.test.tsx +1 -0
  41. package/src/__tests__/useIsFetching.test.tsx +1 -1
  42. package/src/__tests__/useMutation.test.tsx +1 -3
  43. package/src/__tests__/useMutationState.test.tsx +1 -0
  44. package/src/__tests__/useQueries.test.tsx +54 -3
  45. package/src/__tests__/useQuery.test.tsx +4 -5
  46. package/src/__tests__/useQuery.types.test.tsx +10 -7
  47. package/src/__tests__/utils.tsx +1 -2
  48. package/src/suspense.ts +1 -1
  49. package/src/useQueries.ts +23 -6
  50. 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 test = useWrappedQuery([''], async () => '1')
158
- expectTypeOf<string | undefined>(test.data)
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 = <TData = number,>(select?: (data: number) => TData) =>
51
- queryOptions({
52
- queryKey: ['key'],
53
- queryFn: () => Promise.resolve(1),
54
- select,
55
- })
56
- const query = useQuery(options((data) => data > 1))
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']>
@@ -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
@@ -1,4 +1,4 @@
1
- import type { DefaultError } from '@tanstack/query-core/src'
1
+ import type { DefaultError } from '@tanstack/query-core'
2
2
  import type {
3
3
  DefaultedQueryObserverOptions,
4
4
  Query,
package/src/useQueries.ts CHANGED
@@ -24,6 +24,7 @@ import type {
24
24
  QueryClient,
25
25
  QueryFunction,
26
26
  QueryKey,
27
+ ThrowOnError,
27
28
  } from '@tanstack/query-core'
28
29
 
29
30
  // This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
@@ -66,10 +67,19 @@ type GetOptions<T> =
66
67
  T extends {
67
68
  queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
68
69
  select: (data: any) => infer TData
70
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
69
71
  }
70
- ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>
71
- : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }
72
- ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>
72
+ ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>
73
+ : T extends {
74
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
75
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
76
+ }
77
+ ? UseQueryOptionsForUseQueries<
78
+ TQueryFnData,
79
+ TError,
80
+ TQueryFnData,
81
+ TQueryKey
82
+ >
73
83
  : // Fallback
74
84
  UseQueryOptionsForUseQueries
75
85
 
@@ -92,10 +102,17 @@ type GetResults<T> =
92
102
  T extends {
93
103
  queryFn?: QueryFunction<unknown, any>
94
104
  select: (data: any) => infer TData
105
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
95
106
  }
96
- ? UseQueryResult<TData>
97
- : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }
98
- ? UseQueryResult<TQueryFnData>
107
+ ? UseQueryResult<TData, unknown extends TError ? DefaultError : TError>
108
+ : T extends {
109
+ queryFn?: QueryFunction<infer TQueryFnData, any>
110
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
111
+ }
112
+ ? UseQueryResult<
113
+ TQueryFnData,
114
+ unknown extends TError ? DefaultError : TError
115
+ >
99
116
  : // Fallback
100
117
  UseQueryResult
101
118
 
@@ -6,6 +6,7 @@ import type {
6
6
  DefaultError,
7
7
  QueryClient,
8
8
  QueryFunction,
9
+ ThrowOnError,
9
10
  } from '@tanstack/query-core'
10
11
 
11
12
  // Avoid TS depth-limit error in case of large array literal
@@ -34,10 +35,14 @@ type GetSuspenseOptions<T> =
34
35
  T extends {
35
36
  queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
36
37
  select: (data: any) => infer TData
38
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
37
39
  }
38
- ? UseSuspenseQueryOptions<TQueryFnData, Error, TData, TQueryKey>
39
- : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }
40
- ? UseSuspenseQueryOptions<TQueryFnData, Error, TQueryFnData, TQueryKey>
40
+ ? UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>
41
+ : T extends {
42
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
43
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
44
+ }
45
+ ? UseSuspenseQueryOptions<TQueryFnData, TError, TQueryFnData, TQueryKey>
41
46
  : // Fallback
42
47
  UseSuspenseQueryOptions
43
48
 
@@ -60,10 +65,20 @@ type GetSuspenseResults<T> =
60
65
  T extends {
61
66
  queryFn?: QueryFunction<unknown, any>
62
67
  select: (data: any) => infer TData
68
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
63
69
  }
64
- ? UseSuspenseQueryResult<TData>
65
- : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }
66
- ? UseSuspenseQueryResult<TQueryFnData>
70
+ ? UseSuspenseQueryResult<
71
+ TData,
72
+ unknown extends TError ? DefaultError : TError
73
+ >
74
+ : T extends {
75
+ queryFn?: QueryFunction<infer TQueryFnData, any>
76
+ throwOnError?: ThrowOnError<any, infer TError, any, any>
77
+ }
78
+ ? UseSuspenseQueryResult<
79
+ TQueryFnData,
80
+ unknown extends TError ? DefaultError : TError
81
+ >
67
82
  : // Fallback
68
83
  UseSuspenseQueryResult
69
84