@tanstack/react-query 5.0.0-beta.0 → 5.0.0-beta.14

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 +11 -6
  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
@@ -2410,6 +2410,9 @@ describe('useQuery', () => {
2410
2410
  )
2411
2411
  fireEvent.click(rendered.getByRole('button', { name: 'refetch' }))
2412
2412
 
2413
+ await waitFor(() => {
2414
+ rendered.getByText('fetch counter: 3')
2415
+ })
2413
2416
  // sleep is required to make sure no additional renders happen after click
2414
2417
  await sleep(20)
2415
2418
 
@@ -1,6 +1,7 @@
1
1
  import { useQuery } from '../useQuery'
2
2
  import { queryOptions } from '../queryOptions'
3
3
  import { doNotExecute } from './utils'
4
+ import type { UseQueryOptions } from '../types'
4
5
  import type { Equal, Expect } from './utils'
5
6
 
6
7
  describe('initialData', () => {
@@ -44,6 +45,19 @@ describe('initialData', () => {
44
45
  })
45
46
  })
46
47
 
48
+ it('it should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQuery', () => {
49
+ doNotExecute(() => {
50
+ const options = queryOptions({
51
+ queryKey: ['key'],
52
+ queryFn: () => Promise.resolve(1),
53
+ })
54
+ useQuery({
55
+ ...options,
56
+ select: (data) => data > 1,
57
+ })
58
+ })
59
+ })
60
+
47
61
  it('TData should always be defined when initialData is provided as a function which ALWAYS returns the data', () => {
48
62
  doNotExecute(() => {
49
63
  const { data } = useQuery({
@@ -99,77 +113,24 @@ describe('initialData', () => {
99
113
  })
100
114
  })
101
115
 
102
- describe('Query key overload', () => {
103
- it('TData should always be defined when initialData is provided', () => {
116
+ describe('custom hook', () => {
117
+ it('should allow custom hooks using UseQueryOptions', () => {
104
118
  doNotExecute(() => {
105
- const { data } = useQuery({
106
- queryKey: ['key'],
107
- queryFn: () => {
108
- return {
109
- wow: true,
110
- }
111
- },
112
- initialData: {
113
- wow: true,
114
- },
115
- })
119
+ type Data = string
116
120
 
117
- const result: Expect<Equal<{ wow: boolean }, typeof data>> = true
118
- return result
119
- })
120
- })
121
+ const useCustomQuery = (
122
+ options?: Omit<UseQueryOptions<Data>, 'queryKey' | 'queryFn'>,
123
+ ) => {
124
+ return useQuery({
125
+ ...options,
126
+ queryKey: ['todos-key'],
127
+ queryFn: () => Promise.resolve('data'),
128
+ })
129
+ }
121
130
 
122
- it('TData should have undefined in the union when initialData is NOT provided', () => {
123
- doNotExecute(() => {
124
- const { data } = useQuery({
125
- queryKey: ['key'],
126
- queryFn: () => {
127
- return {
128
- wow: true,
129
- }
130
- },
131
- })
131
+ const { data } = useCustomQuery()
132
132
 
133
- const result: Expect<Equal<{ wow: boolean } | undefined, typeof data>> =
134
- true
135
- return result
136
- })
137
- })
138
- })
139
-
140
- describe('Query key and func', () => {
141
- it('TData should always be defined when initialData is provided', () => {
142
- doNotExecute(() => {
143
- const { data } = useQuery({
144
- queryKey: ['key'],
145
- queryFn: () => {
146
- return {
147
- wow: true,
148
- }
149
- },
150
- initialData: {
151
- wow: true,
152
- },
153
- })
154
-
155
- const result: Expect<Equal<{ wow: boolean }, typeof data>> = true
156
- return result
157
- })
158
- })
159
-
160
- it('TData should have undefined in the union when initialData is NOT provided', () => {
161
- doNotExecute(() => {
162
- const { data } = useQuery({
163
- queryKey: ['key'],
164
- queryFn: () => {
165
- return {
166
- wow: true,
167
- }
168
- },
169
- })
170
-
171
- const result: Expect<Equal<{ wow: boolean } | undefined, typeof data>> =
172
- true
133
+ const result: Expect<Equal<Data | undefined, typeof data>> = true
173
134
  return result
174
135
  })
175
136
  })
package/src/index.ts CHANGED
@@ -10,8 +10,21 @@ export type { QueriesResults, QueriesOptions } from './useQueries'
10
10
  export { useQuery } from './useQuery'
11
11
  export { useSuspenseQuery } from './useSuspenseQuery'
12
12
  export { useSuspenseInfiniteQuery } from './useSuspenseInfiniteQuery'
13
+ export { useSuspenseQueries } from './useSuspenseQueries'
14
+ export type {
15
+ SuspenseQueriesResults,
16
+ SuspenseQueriesOptions,
17
+ } from './useSuspenseQueries'
13
18
  export { queryOptions } from './queryOptions'
19
+ export type {
20
+ DefinedInitialDataOptions,
21
+ UndefinedInitialDataOptions,
22
+ } from './queryOptions'
14
23
  export { infiniteQueryOptions } from './infiniteQueryOptions'
24
+ export type {
25
+ DefinedInitialDataInfiniteOptions,
26
+ UndefinedInitialDataInfiniteOptions,
27
+ } from './infiniteQueryOptions'
15
28
  export {
16
29
  QueryClientContext,
17
30
  QueryClientProvider,
@@ -35,7 +35,9 @@ export type DefinedInitialDataInfiniteOptions<
35
35
  TQueryKey,
36
36
  TPageParam
37
37
  > & {
38
- initialData: InfiniteData<TQueryData> | (() => InfiniteData<TQueryData>)
38
+ initialData:
39
+ | InfiniteData<TQueryData, TPageParam>
40
+ | (() => InfiniteData<TQueryData, TPageParam>)
39
41
  }
40
42
 
41
43
  export function infiniteQueryOptions<
@@ -24,18 +24,26 @@ export function queryOptions<
24
24
  TError = DefaultError,
25
25
  TData = TQueryFnData,
26
26
  TQueryKey extends QueryKey = QueryKey,
27
- >(
28
- options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
29
- ): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
27
+ TOptions extends UndefinedInitialDataOptions<
28
+ TQueryFnData,
29
+ TError,
30
+ TData,
31
+ TQueryKey
32
+ > = UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
33
+ >(options: TOptions): TOptions
30
34
 
31
35
  export function queryOptions<
32
36
  TQueryFnData = unknown,
33
37
  TError = DefaultError,
34
38
  TData = TQueryFnData,
35
39
  TQueryKey extends QueryKey = QueryKey,
36
- >(
37
- options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
38
- ): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>
40
+ TOptions extends DefinedInitialDataOptions<
41
+ TQueryFnData,
42
+ TError,
43
+ TData,
44
+ TQueryKey
45
+ > = DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
46
+ >(options: TOptions): TOptions
39
47
 
40
48
  export function queryOptions(options: unknown) {
41
49
  return options
package/src/types.ts CHANGED
@@ -33,9 +33,12 @@ export interface UseQueryOptions<
33
33
  TError = DefaultError,
34
34
  TData = TQueryFnData,
35
35
  TQueryKey extends QueryKey = QueryKey,
36
- > extends WithRequired<
37
- UseBaseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>,
38
- 'queryKey'
36
+ > extends Omit<
37
+ WithRequired<
38
+ UseBaseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>,
39
+ 'queryKey'
40
+ >,
41
+ 'suspense'
39
42
  > {}
40
43
 
41
44
  export interface UseSuspenseQueryOptions<
@@ -45,7 +48,7 @@ export interface UseSuspenseQueryOptions<
45
48
  TQueryKey extends QueryKey = QueryKey,
46
49
  > extends Omit<
47
50
  UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
48
- 'enabled' | 'suspense' | 'throwOnError' | 'placeholderData'
51
+ 'enabled' | 'throwOnError' | 'placeholderData'
49
52
  > {}
50
53
 
51
54
  export interface UseInfiniteQueryOptions<
@@ -55,16 +58,19 @@ export interface UseInfiniteQueryOptions<
55
58
  TQueryData = TQueryFnData,
56
59
  TQueryKey extends QueryKey = QueryKey,
57
60
  TPageParam = unknown,
58
- > extends WithRequired<
59
- InfiniteQueryObserverOptions<
60
- TQueryFnData,
61
- TError,
62
- TData,
63
- TQueryData,
64
- TQueryKey,
65
- TPageParam
61
+ > extends Omit<
62
+ WithRequired<
63
+ InfiniteQueryObserverOptions<
64
+ TQueryFnData,
65
+ TError,
66
+ TData,
67
+ TQueryData,
68
+ TQueryKey,
69
+ TPageParam
70
+ >,
71
+ 'queryKey'
66
72
  >,
67
- 'queryKey'
73
+ 'suspense'
68
74
  > {}
69
75
 
70
76
  export interface UseSuspenseInfiniteQueryOptions<
@@ -83,7 +89,7 @@ export interface UseSuspenseInfiniteQueryOptions<
83
89
  TQueryKey,
84
90
  TPageParam
85
91
  >,
86
- 'enabled' | 'suspense' | 'throwOnError' | 'placeholderData'
92
+ 'enabled' | 'throwOnError' | 'placeholderData'
87
93
  > {}
88
94
 
89
95
  export type UseBaseQueryResult<
@@ -70,11 +70,16 @@ export function useInfiniteQuery<
70
70
  TPageParam
71
71
  >,
72
72
  queryClient?: QueryClient,
73
- ): UseInfiniteQueryResult<TData, TError> {
73
+ ): UseInfiniteQueryResult<TData, TError>
74
+
75
+ export function useInfiniteQuery(
76
+ options: UseInfiniteQueryOptions,
77
+ queryClient?: QueryClient,
78
+ ) {
74
79
  return useBaseQuery(
75
80
  options,
76
81
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
77
82
  InfiniteQueryObserver as typeof QueryObserver,
78
83
  queryClient,
79
- ) as UseInfiniteQueryResult<TData, TError>
84
+ )
80
85
  }
package/src/useQueries.ts CHANGED
@@ -35,7 +35,7 @@ type UseQueryOptionsForUseQueries<
35
35
  TQueryKey extends QueryKey = QueryKey,
36
36
  > = Omit<
37
37
  UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
38
- 'placeholderData'
38
+ 'placeholderData' | 'suspense'
39
39
  > & {
40
40
  placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>
41
41
  }
package/src/useQuery.ts CHANGED
@@ -40,6 +40,8 @@ export function useQuery<
40
40
  >(
41
41
  options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
42
42
  queryClient?: QueryClient,
43
- ) {
43
+ ): UseQueryResult<TData, TError>
44
+
45
+ export function useQuery(options: UseQueryOptions, queryClient?: QueryClient) {
44
46
  return useBaseQuery(options, QueryObserver, queryClient)
45
47
  }
@@ -0,0 +1,157 @@
1
+ 'use client'
2
+ import { useQueries } from './useQueries'
3
+ import type { UseSuspenseQueryOptions, UseSuspenseQueryResult } from './types'
4
+ import type {
5
+ DefaultError,
6
+ QueryClient,
7
+ QueryFunction,
8
+ } from '@tanstack/query-core'
9
+
10
+ // Avoid TS depth-limit error in case of large array literal
11
+ type MAXIMUM_DEPTH = 20
12
+
13
+ type GetSuspenseOptions<T> =
14
+ // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }
15
+ T extends {
16
+ queryFnData: infer TQueryFnData
17
+ error?: infer TError
18
+ data: infer TData
19
+ }
20
+ ? UseSuspenseQueryOptions<TQueryFnData, TError, TData>
21
+ : T extends { queryFnData: infer TQueryFnData; error?: infer TError }
22
+ ? UseSuspenseQueryOptions<TQueryFnData, TError>
23
+ : T extends { data: infer TData; error?: infer TError }
24
+ ? UseSuspenseQueryOptions<unknown, TError, TData>
25
+ : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]
26
+ T extends [infer TQueryFnData, infer TError, infer TData]
27
+ ? UseSuspenseQueryOptions<TQueryFnData, TError, TData>
28
+ : T extends [infer TQueryFnData, infer TError]
29
+ ? UseSuspenseQueryOptions<TQueryFnData, TError>
30
+ : T extends [infer TQueryFnData]
31
+ ? UseSuspenseQueryOptions<TQueryFnData>
32
+ : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided
33
+ T extends {
34
+ queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>
35
+ select: (data: any) => infer TData
36
+ }
37
+ ? UseSuspenseQueryOptions<TQueryFnData, Error, TData, TQueryKey>
38
+ : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }
39
+ ? UseSuspenseQueryOptions<TQueryFnData, Error, TQueryFnData, TQueryKey>
40
+ : // Fallback
41
+ UseSuspenseQueryOptions
42
+
43
+ type GetSuspenseResults<T> =
44
+ // Part 1: responsible for mapping explicit type parameter to function result, if object
45
+ T extends { queryFnData: any; error?: infer TError; data: infer TData }
46
+ ? UseSuspenseQueryResult<TData, TError>
47
+ : T extends { queryFnData: infer TQueryFnData; error?: infer TError }
48
+ ? UseSuspenseQueryResult<TQueryFnData, TError>
49
+ : T extends { data: infer TData; error?: infer TError }
50
+ ? UseSuspenseQueryResult<TData, TError>
51
+ : // Part 2: responsible for mapping explicit type parameter to function result, if tuple
52
+ T extends [any, infer TError, infer TData]
53
+ ? UseSuspenseQueryResult<TData, TError>
54
+ : T extends [infer TQueryFnData, infer TError]
55
+ ? UseSuspenseQueryResult<TQueryFnData, TError>
56
+ : T extends [infer TQueryFnData]
57
+ ? UseSuspenseQueryResult<TQueryFnData>
58
+ : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided
59
+ T extends {
60
+ queryFn?: QueryFunction<unknown, any>
61
+ select: (data: any) => infer TData
62
+ }
63
+ ? UseSuspenseQueryResult<TData>
64
+ : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }
65
+ ? UseSuspenseQueryResult<TQueryFnData>
66
+ : // Fallback
67
+ UseSuspenseQueryResult
68
+
69
+ /**
70
+ * SuspenseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
71
+ */
72
+ export type SuspenseQueriesOptions<
73
+ T extends any[],
74
+ Result extends any[] = [],
75
+ Depth extends ReadonlyArray<number> = [],
76
+ > = Depth['length'] extends MAXIMUM_DEPTH
77
+ ? UseSuspenseQueryOptions[]
78
+ : T extends []
79
+ ? []
80
+ : T extends [infer Head]
81
+ ? [...Result, GetSuspenseOptions<Head>]
82
+ : T extends [infer Head, ...infer Tail]
83
+ ? SuspenseQueriesOptions<
84
+ [...Tail],
85
+ [...Result, GetSuspenseOptions<Head>],
86
+ [...Depth, 1]
87
+ >
88
+ : unknown[] extends T
89
+ ? T
90
+ : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!
91
+ // use this to infer the param types in the case of Array.map() argument
92
+ T extends UseSuspenseQueryOptions<
93
+ infer TQueryFnData,
94
+ infer TError,
95
+ infer TData,
96
+ infer TQueryKey
97
+ >[]
98
+ ? UseSuspenseQueryOptions<TQueryFnData, TError, TData, TQueryKey>[]
99
+ : // Fallback
100
+ UseSuspenseQueryOptions[]
101
+
102
+ /**
103
+ * SuspenseQueriesResults reducer recursively maps type param to results
104
+ */
105
+ export type SuspenseQueriesResults<
106
+ T extends any[],
107
+ Result extends any[] = [],
108
+ Depth extends ReadonlyArray<number> = [],
109
+ > = Depth['length'] extends MAXIMUM_DEPTH
110
+ ? UseSuspenseQueryResult[]
111
+ : T extends []
112
+ ? []
113
+ : T extends [infer Head]
114
+ ? [...Result, GetSuspenseResults<Head>]
115
+ : T extends [infer Head, ...infer Tail]
116
+ ? SuspenseQueriesResults<
117
+ [...Tail],
118
+ [...Result, GetSuspenseResults<Head>],
119
+ [...Depth, 1]
120
+ >
121
+ : T extends UseSuspenseQueryOptions<
122
+ infer TQueryFnData,
123
+ infer TError,
124
+ infer TData,
125
+ any
126
+ >[]
127
+ ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results
128
+ UseSuspenseQueryResult<
129
+ unknown extends TData ? TQueryFnData : TData,
130
+ unknown extends TError ? DefaultError : TError
131
+ >[]
132
+ : // Fallback
133
+ UseSuspenseQueryResult[]
134
+
135
+ export function useSuspenseQueries<
136
+ T extends any[],
137
+ TCombinedResult = SuspenseQueriesResults<T>,
138
+ >(
139
+ options: {
140
+ queries: readonly [...SuspenseQueriesOptions<T>]
141
+ combine?: (result: SuspenseQueriesResults<T>) => TCombinedResult
142
+ },
143
+ queryClient?: QueryClient,
144
+ ): TCombinedResult {
145
+ return useQueries(
146
+ {
147
+ ...options,
148
+ queries: options.queries.map((query) => ({
149
+ ...query,
150
+ suspense: true,
151
+ throwOnError: true,
152
+ enabled: true,
153
+ })),
154
+ } as any,
155
+ queryClient,
156
+ )
157
+ }