@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
|
@@ -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('
|
|
103
|
-
it('
|
|
116
|
+
describe('custom hook', () => {
|
|
117
|
+
it('should allow custom hooks using UseQueryOptions', () => {
|
|
104
118
|
doNotExecute(() => {
|
|
105
|
-
|
|
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
|
|
118
|
-
|
|
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
|
-
|
|
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<
|
|
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:
|
|
38
|
+
initialData:
|
|
39
|
+
| InfiniteData<TQueryData, TPageParam>
|
|
40
|
+
| (() => InfiniteData<TQueryData, TPageParam>)
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
export function infiniteQueryOptions<
|
package/src/queryOptions.ts
CHANGED
|
@@ -24,18 +24,26 @@ export function queryOptions<
|
|
|
24
24
|
TError = DefaultError,
|
|
25
25
|
TData = TQueryFnData,
|
|
26
26
|
TQueryKey extends QueryKey = QueryKey,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
38
|
-
|
|
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
|
|
37
|
-
|
|
38
|
-
|
|
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' | '
|
|
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
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
'
|
|
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' | '
|
|
92
|
+
'enabled' | 'throwOnError' | 'placeholderData'
|
|
87
93
|
> {}
|
|
88
94
|
|
|
89
95
|
export type UseBaseQueryResult<
|
package/src/useInfiniteQuery.ts
CHANGED
|
@@ -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
|
-
)
|
|
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
|
+
}
|
|
File without changes
|
|
File without changes
|
/package/build/codemods/{transformers → src/utils/transformers}/use-query-like-transformer.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/build/codemods/{remove-overloads → src/v5/remove-overloads}/utils/unknown-usage-error.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|