|
1 | 1 | import { useQueryClient } from './QueryClientProvider'
|
2 | 2 |
|
3 |
| -import type { |
4 |
| - FetchQueryOptions, |
5 |
| - QueryClient, |
6 |
| - QueryFunction, |
7 |
| - ThrowOnError, |
8 |
| -} from '@tanstack/query-core' |
| 3 | +import type { FetchQueryOptions, QueryClient } from '@tanstack/query-core' |
9 | 4 |
|
10 |
| -// Avoid TS depth-limit error in case of large array literal |
11 |
| -type MAXIMUM_DEPTH = 20 |
12 |
| - |
13 |
| -// Widen the type of the symbol to enable type inference even if skipToken is not immutable. |
14 |
| -type SkipTokenForFetchQuery = symbol |
15 |
| - |
16 |
| -type GetFetchQueryOptions<T> = |
17 |
| - // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData } |
18 |
| - T extends { |
19 |
| - queryFnData: infer TQueryFnData |
20 |
| - error?: infer TError |
21 |
| - data: infer TData |
22 |
| - } |
23 |
| - ? FetchQueryOptions<TQueryFnData, TError, TData> |
24 |
| - : T extends { queryFnData: infer TQueryFnData; error?: infer TError } |
25 |
| - ? FetchQueryOptions<TQueryFnData, TError> |
26 |
| - : T extends { data: infer TData; error?: infer TError } |
27 |
| - ? FetchQueryOptions<unknown, TError, TData> |
28 |
| - : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData] |
29 |
| - T extends [infer TQueryFnData, infer TError, infer TData] |
30 |
| - ? FetchQueryOptions<TQueryFnData, TError, TData> |
31 |
| - : T extends [infer TQueryFnData, infer TError] |
32 |
| - ? FetchQueryOptions<TQueryFnData, TError> |
33 |
| - : T extends [infer TQueryFnData] |
34 |
| - ? FetchQueryOptions<TQueryFnData> |
35 |
| - : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided |
36 |
| - T extends { |
37 |
| - queryFn?: |
38 |
| - | QueryFunction<infer TQueryFnData, infer TQueryKey> |
39 |
| - | SkipTokenForFetchQuery |
40 |
| - select?: (data: any) => infer TData |
41 |
| - throwOnError?: ThrowOnError<any, infer TError, any, any> |
42 |
| - } |
43 |
| - ? FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey> |
44 |
| - : T extends { |
45 |
| - queryFn?: |
46 |
| - | QueryFunction<infer TQueryFnData, infer TQueryKey> |
47 |
| - | SkipTokenForFetchQuery |
48 |
| - throwOnError?: ThrowOnError<any, infer TError, any, any> |
49 |
| - } |
50 |
| - ? FetchQueryOptions< |
51 |
| - TQueryFnData, |
52 |
| - TError, |
53 |
| - TQueryFnData, |
54 |
| - TQueryKey |
55 |
| - > |
56 |
| - : // Fallback |
57 |
| - FetchQueryOptions |
58 |
| - |
59 |
| -/** |
60 |
| - * PrefetchQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param |
61 |
| - */ |
62 |
| -export type PrefetchQueriesOptions< |
63 |
| - T extends Array<any>, |
64 |
| - TResults extends Array<any> = [], |
65 |
| - TDepth extends ReadonlyArray<number> = [], |
66 |
| -> = TDepth['length'] extends MAXIMUM_DEPTH |
67 |
| - ? Array<FetchQueryOptions> |
68 |
| - : T extends [] |
69 |
| - ? [] |
70 |
| - : T extends [infer Head] |
71 |
| - ? [...TResults, GetFetchQueryOptions<Head>] |
72 |
| - : T extends [infer Head, ...infer Tails] |
73 |
| - ? PrefetchQueriesOptions< |
74 |
| - [...Tails], |
75 |
| - [...TResults, GetFetchQueryOptions<Head>], |
76 |
| - [...TDepth, 1] |
77 |
| - > |
78 |
| - : Array<unknown> extends T |
79 |
| - ? T |
80 |
| - : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type! |
81 |
| - // use this to infer the param types in the case of Array.map() argument |
82 |
| - T extends Array< |
83 |
| - FetchQueryOptions< |
84 |
| - infer TQueryFnData, |
85 |
| - infer TError, |
86 |
| - infer TData, |
87 |
| - infer TQueryKey |
88 |
| - > |
89 |
| - > |
90 |
| - ? Array<FetchQueryOptions<TQueryFnData, TError, TData, TQueryKey>> |
91 |
| - : // Fallback |
92 |
| - Array<FetchQueryOptions> |
93 |
| - |
94 |
| -export function usePrefetchQueries<T extends Array<any>>( |
| 5 | +export function usePrefetchQueries( |
95 | 6 | options: {
|
96 |
| - queries: |
97 |
| - | readonly [...PrefetchQueriesOptions<T>] |
98 |
| - | readonly [...{ [K in keyof T]: GetFetchQueryOptions<T[K]> }] |
| 7 | + queries: ReadonlyArray<FetchQueryOptions> |
99 | 8 | },
|
100 | 9 | queryClient?: QueryClient,
|
101 | 10 | ) {
|
102 | 11 | const client = useQueryClient(queryClient)
|
103 |
| - const queries = options.queries as ReadonlyArray<FetchQueryOptions> |
104 | 12 |
|
105 |
| - for (const query of queries) { |
| 13 | + for (const query of options.queries) { |
106 | 14 | if (!client.getQueryState(query.queryKey)) {
|
107 | 15 | client.prefetchQuery(query)
|
108 | 16 | }
|
|
0 commit comments