@tanstack/react-query 5.0.0-rc.1 → 5.0.0-rc.16

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 (68) hide show
  1. package/build/legacy/infiniteQueryOptions.cjs.map +1 -1
  2. package/build/legacy/infiniteQueryOptions.d.cts +11 -6
  3. package/build/legacy/infiniteQueryOptions.d.ts +11 -6
  4. package/build/legacy/infiniteQueryOptions.js.map +1 -1
  5. package/build/legacy/queryOptions.cjs.map +1 -1
  6. package/build/legacy/queryOptions.d.cts +6 -5
  7. package/build/legacy/queryOptions.d.ts +6 -5
  8. package/build/legacy/queryOptions.js.map +1 -1
  9. package/build/legacy/types.cjs.map +1 -1
  10. package/build/legacy/types.d.cts +3 -3
  11. package/build/legacy/types.d.ts +3 -3
  12. package/build/legacy/useInfiniteQuery.cjs.map +1 -1
  13. package/build/legacy/useInfiniteQuery.d.cts +2 -2
  14. package/build/legacy/useInfiniteQuery.d.ts +2 -2
  15. package/build/legacy/useInfiniteQuery.js.map +1 -1
  16. package/build/legacy/useQueries.cjs.map +1 -1
  17. package/build/legacy/useQueries.d.cts +9 -5
  18. package/build/legacy/useQueries.d.ts +9 -5
  19. package/build/legacy/useQueries.js.map +1 -1
  20. package/build/legacy/useSuspenseInfiniteQuery.cjs +2 -1
  21. package/build/legacy/useSuspenseInfiniteQuery.cjs.map +1 -1
  22. package/build/legacy/useSuspenseInfiniteQuery.js +2 -1
  23. package/build/legacy/useSuspenseInfiniteQuery.js.map +1 -1
  24. package/build/legacy/useSuspenseQueries.cjs.map +1 -1
  25. package/build/legacy/useSuspenseQueries.d.cts +9 -5
  26. package/build/legacy/useSuspenseQueries.d.ts +9 -5
  27. package/build/legacy/useSuspenseQueries.js.map +1 -1
  28. package/build/modern/infiniteQueryOptions.cjs.map +1 -1
  29. package/build/modern/infiniteQueryOptions.d.cts +11 -6
  30. package/build/modern/infiniteQueryOptions.d.ts +11 -6
  31. package/build/modern/infiniteQueryOptions.js.map +1 -1
  32. package/build/modern/queryOptions.cjs.map +1 -1
  33. package/build/modern/queryOptions.d.cts +6 -5
  34. package/build/modern/queryOptions.d.ts +6 -5
  35. package/build/modern/queryOptions.js.map +1 -1
  36. package/build/modern/types.cjs.map +1 -1
  37. package/build/modern/types.d.cts +3 -3
  38. package/build/modern/types.d.ts +3 -3
  39. package/build/modern/useInfiniteQuery.cjs.map +1 -1
  40. package/build/modern/useInfiniteQuery.d.cts +2 -2
  41. package/build/modern/useInfiniteQuery.d.ts +2 -2
  42. package/build/modern/useInfiniteQuery.js.map +1 -1
  43. package/build/modern/useQueries.cjs.map +1 -1
  44. package/build/modern/useQueries.d.cts +9 -5
  45. package/build/modern/useQueries.d.ts +9 -5
  46. package/build/modern/useQueries.js.map +1 -1
  47. package/build/modern/useSuspenseInfiniteQuery.cjs +2 -1
  48. package/build/modern/useSuspenseInfiniteQuery.cjs.map +1 -1
  49. package/build/modern/useSuspenseInfiniteQuery.js +2 -1
  50. package/build/modern/useSuspenseInfiniteQuery.js.map +1 -1
  51. package/build/modern/useSuspenseQueries.cjs.map +1 -1
  52. package/build/modern/useSuspenseQueries.d.cts +9 -5
  53. package/build/modern/useSuspenseQueries.d.ts +9 -5
  54. package/build/modern/useSuspenseQueries.js.map +1 -1
  55. package/package.json +2 -3
  56. package/src/__tests__/infiniteQueryOptions.types.test.tsx +163 -0
  57. package/src/__tests__/queryOptions.types.test.tsx +154 -3
  58. package/src/__tests__/suspense.types.test.tsx +146 -0
  59. package/src/__tests__/useQueries.test.tsx +53 -1
  60. package/src/__tests__/useQuery.test.tsx +3 -3
  61. package/src/__tests__/useQuery.types.test.tsx +7 -1
  62. package/src/infiniteQueryOptions.ts +21 -22
  63. package/src/queryOptions.ts +11 -19
  64. package/src/types.ts +2 -4
  65. package/src/useInfiniteQuery.ts +0 -2
  66. package/src/useQueries.ts +24 -7
  67. package/src/useSuspenseInfiniteQuery.ts +2 -1
  68. package/src/useSuspenseQueries.ts +21 -6
@@ -0,0 +1,146 @@
1
+ import { useSuspenseQuery } from '../useSuspenseQuery'
2
+ import { useSuspenseInfiniteQuery } from '../useSuspenseInfiniteQuery'
3
+ import { doNotExecute } from './utils'
4
+ import type { InfiniteData } from '@tanstack/query-core'
5
+ import type { Equal, Expect } from './utils'
6
+
7
+ describe('useSuspenseQuery', () => {
8
+ it('should always have data defined', () => {
9
+ doNotExecute(() => {
10
+ const { data } = useSuspenseQuery({
11
+ queryKey: ['key'],
12
+ queryFn: () => Promise.resolve(5),
13
+ })
14
+
15
+ const result: Expect<Equal<typeof data, number>> = true
16
+ return result
17
+ })
18
+ })
19
+
20
+ it('should not have pending status', () => {
21
+ doNotExecute(() => {
22
+ const { status } = useSuspenseQuery({
23
+ queryKey: ['key'],
24
+ queryFn: () => Promise.resolve(5),
25
+ })
26
+
27
+ const result: Expect<Equal<typeof status, 'error' | 'success'>> = true
28
+ return result
29
+ })
30
+ })
31
+
32
+ it('should not allow placeholderData, enabled or throwOnError props', () => {
33
+ doNotExecute(() => {
34
+ useSuspenseQuery({
35
+ queryKey: ['key'],
36
+ queryFn: () => Promise.resolve(5),
37
+ // @ts-expect-error TS2345
38
+ placeholderData: 5,
39
+ enabled: true,
40
+ })
41
+
42
+ useSuspenseQuery({
43
+ queryKey: ['key'],
44
+ queryFn: () => Promise.resolve(5),
45
+ // @ts-expect-error TS2345
46
+ enabled: true,
47
+ })
48
+
49
+ useSuspenseQuery({
50
+ queryKey: ['key'],
51
+ queryFn: () => Promise.resolve(5),
52
+ // @ts-expect-error TS2345
53
+ throwOnError: true,
54
+ })
55
+ })
56
+ })
57
+
58
+ it('should not return isPlaceholderData', () => {
59
+ doNotExecute(() => {
60
+ const query = useSuspenseQuery({
61
+ queryKey: ['key'],
62
+ queryFn: () => Promise.resolve(5),
63
+ })
64
+
65
+ // @ts-expect-error TS2339
66
+ void query.isPlaceholderData
67
+ })
68
+ })
69
+ })
70
+
71
+ describe('useSuspenseInfiniteQuery', () => {
72
+ it('should always have data defined', () => {
73
+ doNotExecute(() => {
74
+ const { data } = useSuspenseInfiniteQuery({
75
+ queryKey: ['key'],
76
+ queryFn: () => Promise.resolve(5),
77
+ initialPageParam: 1,
78
+ getNextPageParam: () => 1,
79
+ })
80
+
81
+ const result: Expect<Equal<typeof data, InfiniteData<number, unknown>>> =
82
+ true
83
+ return result
84
+ })
85
+ })
86
+
87
+ it('should not have pending status', () => {
88
+ doNotExecute(() => {
89
+ const { status } = useSuspenseInfiniteQuery({
90
+ queryKey: ['key'],
91
+ queryFn: () => Promise.resolve(5),
92
+ initialPageParam: 1,
93
+ getNextPageParam: () => 1,
94
+ })
95
+
96
+ const result: Expect<Equal<typeof status, 'error' | 'success'>> = true
97
+ return result
98
+ })
99
+ })
100
+
101
+ it('should not allow placeholderData, enabled or throwOnError props', () => {
102
+ doNotExecute(() => {
103
+ useSuspenseInfiniteQuery({
104
+ queryKey: ['key'],
105
+ queryFn: () => Promise.resolve(5),
106
+ initialPageParam: 1,
107
+ getNextPageParam: () => 1,
108
+ // @ts-expect-error TS2345
109
+ placeholderData: 5,
110
+ enabled: true,
111
+ })
112
+
113
+ useSuspenseInfiniteQuery({
114
+ queryKey: ['key'],
115
+ queryFn: () => Promise.resolve(5),
116
+ initialPageParam: 1,
117
+ getNextPageParam: () => 1,
118
+ // @ts-expect-error TS2345
119
+ enabled: true,
120
+ })
121
+
122
+ useSuspenseInfiniteQuery({
123
+ queryKey: ['key'],
124
+ queryFn: () => Promise.resolve(5),
125
+ initialPageParam: 1,
126
+ getNextPageParam: () => 1,
127
+ // @ts-expect-error TS2345
128
+ throwOnError: true,
129
+ })
130
+ })
131
+ })
132
+
133
+ it('should not return isPlaceholderData', () => {
134
+ doNotExecute(() => {
135
+ const query = useSuspenseInfiniteQuery({
136
+ queryKey: ['key'],
137
+ queryFn: () => Promise.resolve(5),
138
+ initialPageParam: 1,
139
+ getNextPageParam: () => 1,
140
+ })
141
+
142
+ // @ts-expect-error TS2339
143
+ void query.isPlaceholderData
144
+ })
145
+ })
146
+ })
@@ -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)
@@ -5975,11 +5975,11 @@ describe('useQuery', () => {
5975
5975
  <div>data: {state.data}</div>
5976
5976
  <div>dataUpdatedAt: {state.dataUpdatedAt}</div>
5977
5977
  <button
5978
- onClick={() =>
5978
+ onClick={() => {
5979
5979
  queryClient.setQueryData(key, 'newData', {
5980
5980
  updatedAt: 100,
5981
5981
  })
5982
- }
5982
+ }}
5983
5983
  >
5984
5984
  setQueryData
5985
5985
  </button>
@@ -51,10 +51,16 @@ describe('initialData', () => {
51
51
  queryKey: ['key'],
52
52
  queryFn: () => Promise.resolve(1),
53
53
  })
54
- useQuery({
54
+
55
+ const query = useQuery({
55
56
  ...options,
56
57
  select: (data) => data > 1,
57
58
  })
59
+
60
+ const result: Expect<
61
+ Equal<boolean | undefined, (typeof query)['data']>
62
+ > = true
63
+ return result
58
64
  })
59
65
  })
60
66
 
@@ -1,50 +1,50 @@
1
+ import type { DataTag } from '@tanstack/query-core'
1
2
  import type { InfiniteData } from '@tanstack/query-core'
2
3
  import type { UseInfiniteQueryOptions } from './types'
3
4
  import type { DefaultError, QueryKey } from '@tanstack/query-core'
4
5
 
5
6
  export type UndefinedInitialDataInfiniteOptions<
6
- TQueryFnData = unknown,
7
+ TQueryFnData,
7
8
  TError = DefaultError,
8
- TData = TQueryFnData,
9
- TQueryData = TQueryFnData,
9
+ TData = InfiniteData<TQueryFnData>,
10
10
  TQueryKey extends QueryKey = QueryKey,
11
11
  TPageParam = unknown,
12
12
  > = UseInfiniteQueryOptions<
13
13
  TQueryFnData,
14
14
  TError,
15
15
  TData,
16
- TQueryData,
16
+ TQueryFnData,
17
17
  TQueryKey,
18
18
  TPageParam
19
19
  > & {
20
20
  initialData?: undefined
21
21
  }
22
22
 
23
+ type NonUndefinedGuard<T> = T extends undefined ? never : T
24
+
23
25
  export type DefinedInitialDataInfiniteOptions<
24
- TQueryFnData = unknown,
26
+ TQueryFnData,
25
27
  TError = DefaultError,
26
- TData = TQueryFnData,
27
- TQueryData = TQueryFnData,
28
+ TData = InfiniteData<TQueryFnData>,
28
29
  TQueryKey extends QueryKey = QueryKey,
29
30
  TPageParam = unknown,
30
31
  > = UseInfiniteQueryOptions<
31
32
  TQueryFnData,
32
33
  TError,
33
34
  TData,
34
- TQueryData,
35
+ TQueryFnData,
35
36
  TQueryKey,
36
37
  TPageParam
37
38
  > & {
38
39
  initialData:
39
- | InfiniteData<TQueryData, TPageParam>
40
- | (() => InfiniteData<TQueryData, TPageParam>)
40
+ | NonUndefinedGuard<InfiniteData<TQueryFnData, TPageParam>>
41
+ | (() => NonUndefinedGuard<InfiniteData<TQueryFnData, TPageParam>>)
41
42
  }
42
43
 
43
44
  export function infiniteQueryOptions<
44
- TQueryFnData = unknown,
45
+ TQueryFnData,
45
46
  TError = DefaultError,
46
- TData = TQueryFnData,
47
- TQueryData = TQueryFnData,
47
+ TData = InfiniteData<TQueryFnData>,
48
48
  TQueryKey extends QueryKey = QueryKey,
49
49
  TPageParam = unknown,
50
50
  >(
@@ -52,7 +52,6 @@ export function infiniteQueryOptions<
52
52
  TQueryFnData,
53
53
  TError,
54
54
  TData,
55
- TQueryFnData,
56
55
  TQueryKey,
57
56
  TPageParam
58
57
  >,
@@ -60,16 +59,16 @@ export function infiniteQueryOptions<
60
59
  TQueryFnData,
61
60
  TError,
62
61
  TData,
63
- TQueryFnData,
64
62
  TQueryKey,
65
63
  TPageParam
66
- >
64
+ > & {
65
+ queryKey: DataTag<TQueryKey, TData>
66
+ }
67
67
 
68
68
  export function infiniteQueryOptions<
69
- TQueryFnData = unknown,
69
+ TQueryFnData,
70
70
  TError = DefaultError,
71
- TData = TQueryFnData,
72
- TQueryData = TQueryFnData,
71
+ TData = InfiniteData<TQueryFnData>,
73
72
  TQueryKey extends QueryKey = QueryKey,
74
73
  TPageParam = unknown,
75
74
  >(
@@ -77,7 +76,6 @@ export function infiniteQueryOptions<
77
76
  TQueryFnData,
78
77
  TError,
79
78
  TData,
80
- TQueryFnData,
81
79
  TQueryKey,
82
80
  TPageParam
83
81
  >,
@@ -85,10 +83,11 @@ export function infiniteQueryOptions<
85
83
  TQueryFnData,
86
84
  TError,
87
85
  TData,
88
- TQueryFnData,
89
86
  TQueryKey,
90
87
  TPageParam
91
- >
88
+ > & {
89
+ queryKey: DataTag<TQueryKey, TData>
90
+ }
92
91
 
93
92
  export function infiniteQueryOptions(options: unknown) {
94
93
  return options
@@ -1,4 +1,4 @@
1
- import type { DefaultError, QueryKey } from '@tanstack/query-core'
1
+ import type { DataTag, DefaultError, QueryKey } from '@tanstack/query-core'
2
2
  import type { UseQueryOptions } from './types'
3
3
 
4
4
  export type UndefinedInitialDataOptions<
@@ -23,35 +23,27 @@ export type DefinedInitialDataOptions<
23
23
  | (() => NonUndefinedGuard<TQueryFnData>)
24
24
  }
25
25
 
26
- type ValidateQueryOptions<T> = {
27
- [K in keyof T]: K extends keyof UseQueryOptions ? T[K] : never
28
- }
29
-
30
26
  export function queryOptions<
31
27
  TQueryFnData = unknown,
32
28
  TError = DefaultError,
33
29
  TData = TQueryFnData,
34
30
  TQueryKey extends QueryKey = QueryKey,
35
- TOptions extends UndefinedInitialDataOptions<
36
- TQueryFnData,
37
- TError,
38
- TData,
39
- TQueryKey
40
- > = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
41
- >(options: ValidateQueryOptions<TOptions>): TOptions
31
+ >(
32
+ options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
33
+ ): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
34
+ queryKey: DataTag<TQueryKey, TData>
35
+ }
42
36
 
43
37
  export function queryOptions<
44
38
  TQueryFnData = unknown,
45
39
  TError = DefaultError,
46
40
  TData = TQueryFnData,
47
41
  TQueryKey extends QueryKey = QueryKey,
48
- TOptions extends DefinedInitialDataOptions<
49
- TQueryFnData,
50
- TError,
51
- TData,
52
- TQueryKey
53
- > = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
54
- >(options: ValidateQueryOptions<TOptions>): TOptions
42
+ >(
43
+ options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
44
+ ): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
45
+ queryKey: DataTag<TQueryKey, TData>
46
+ }
55
47
 
56
48
  export function queryOptions(options: unknown) {
57
49
  return options
package/src/types.ts CHANGED
@@ -6,14 +6,12 @@ import type {
6
6
  DefinedQueryObserverResult,
7
7
  InfiniteQueryObserverOptions,
8
8
  InfiniteQueryObserverResult,
9
- InfiniteQueryObserverSuccessResult,
10
9
  MutateFunction,
11
10
  MutationObserverOptions,
12
11
  MutationObserverResult,
13
12
  QueryKey,
14
13
  QueryObserverOptions,
15
14
  QueryObserverResult,
16
- QueryObserverSuccessResult,
17
15
  WithRequired,
18
16
  } from '@tanstack/query-core'
19
17
 
@@ -105,7 +103,7 @@ export type UseQueryResult<
105
103
  export type UseSuspenseQueryResult<
106
104
  TData = unknown,
107
105
  TError = DefaultError,
108
- > = Omit<QueryObserverSuccessResult<TData, TError>, 'isPlaceholderData'>
106
+ > = Omit<DefinedQueryObserverResult<TData, TError>, 'isPlaceholderData'>
109
107
 
110
108
  export type DefinedUseQueryResult<
111
109
  TData = unknown,
@@ -125,7 +123,7 @@ export type DefinedUseInfiniteQueryResult<
125
123
  export type UseSuspenseInfiniteQueryResult<
126
124
  TData = unknown,
127
125
  TError = DefaultError,
128
- > = Omit<InfiniteQueryObserverSuccessResult<TData, TError>, 'isPlaceholderData'>
126
+ > = Omit<DefinedInfiniteQueryObserverResult<TData, TError>, 'isPlaceholderData'>
129
127
 
130
128
  export interface UseMutationOptions<
131
129
  TData = unknown,
@@ -29,7 +29,6 @@ export function useInfiniteQuery<
29
29
  TQueryFnData,
30
30
  TError,
31
31
  TData,
32
- TQueryFnData,
33
32
  TQueryKey,
34
33
  TPageParam
35
34
  >,
@@ -47,7 +46,6 @@ export function useInfiniteQuery<
47
46
  TQueryFnData,
48
47
  TError,
49
48
  TData,
50
- TQueryFnData,
51
49
  TQueryKey,
52
50
  TPageParam
53
51
  >,
package/src/useQueries.ts CHANGED
@@ -24,10 +24,11 @@ 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`.
30
- // `placeholderData` function does not have a parameter
31
+ // `placeholderData` function always gets undefined passed
31
32
  type UseQueryOptionsForUseQueries<
32
33
  TQueryFnData = unknown,
33
34
  TError = DefaultError,
@@ -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
 
@@ -1,6 +1,7 @@
1
1
  'use client'
2
2
  import { InfiniteQueryObserver } from '@tanstack/query-core'
3
3
  import { useBaseQuery } from './useBaseQuery'
4
+ import { defaultThrowOnError } from './suspense'
4
5
  import type {
5
6
  InfiniteQueryObserverSuccessResult,
6
7
  QueryObserver,
@@ -38,7 +39,7 @@ export function useSuspenseInfiniteQuery<
38
39
  ...options,
39
40
  enabled: true,
40
41
  suspense: true,
41
- throwOnError: true,
42
+ throwOnError: defaultThrowOnError,
42
43
  },
43
44
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
44
45
  InfiniteQueryObserver as typeof QueryObserver,
@@ -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