Skip to content

Commit f9e4f6b

Browse files
authored
fix(angular-query): align query options with react-query (#9084)
1 parent eb5816e commit f9e4f6b

File tree

4 files changed

+186
-37
lines changed

4 files changed

+186
-37
lines changed

packages/angular-query-experimental/src/index.ts

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,57 @@ export * from './types'
88
export type {
99
DefinedInitialDataOptions,
1010
UndefinedInitialDataOptions,
11+
UnusedSkipTokenOptions,
1112
} from './query-options'
1213
export { queryOptions } from './query-options'
13-
export { mutationOptions } from './mutation-options'
14+
1415
export type { CreateMutationOptions } from './mutation-options'
16+
export { mutationOptions } from './mutation-options'
1517

1618
export type {
1719
DefinedInitialDataInfiniteOptions,
1820
UndefinedInitialDataInfiniteOptions,
21+
UnusedSkipTokenInfiniteOptions,
1922
} from './infinite-query-options'
2023
export { infiniteQueryOptions } from './infinite-query-options'
2124

22-
export * from './inject-infinite-query'
23-
export * from './inject-is-fetching'
24-
export * from './inject-is-mutating'
25-
export * from './inject-is-restoring'
26-
export * from './inject-mutation'
27-
export * from './inject-mutation-state'
28-
export * from './inject-queries'
29-
export * from './inject-query'
30-
export * from './inject-query-client'
31-
export * from './providers'
25+
export type { InjectInfiniteQueryOptions } from './inject-infinite-query'
26+
export { injectInfiniteQuery } from './inject-infinite-query'
27+
28+
export type { InjectIsFetchingOptions } from './inject-is-fetching'
29+
export { injectIsFetching } from './inject-is-fetching'
30+
31+
export type { InjectIsMutatingOptions } from './inject-is-mutating'
32+
export { injectIsMutating } from './inject-is-mutating'
33+
34+
export { injectIsRestoring, provideIsRestoring } from './inject-is-restoring'
35+
36+
export type { InjectMutationOptions } from './inject-mutation'
37+
export { injectMutation } from './inject-mutation'
38+
39+
export type { InjectMutationStateOptions } from './inject-mutation-state'
40+
export { injectMutationState } from './inject-mutation-state'
41+
42+
export type { QueriesOptions, QueriesResults } from './inject-queries'
43+
export { injectQueries } from './inject-queries'
44+
45+
export type { InjectQueryOptions } from './inject-query'
46+
export { injectQuery } from './inject-query'
47+
48+
export { injectQueryClient } from './inject-query-client'
49+
50+
export type {
51+
DeveloperToolsFeature,
52+
DevtoolsOptions,
53+
PersistQueryClientFeature,
54+
QueryFeature,
55+
QueryFeatureKind,
56+
QueryFeatures,
57+
} from './providers'
58+
export {
59+
provideQueryClient,
60+
provideTanStackQuery,
61+
queryFeature,
62+
queryFeatures,
63+
withDevtools,
64+
} from './providers'

packages/angular-query-experimental/src/infinite-query-options.ts

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import type {
22
DataTag,
33
DefaultError,
44
InfiniteData,
5+
InitialDataFunction,
6+
OmitKeyof,
57
QueryKey,
8+
SkipToken,
69
} from '@tanstack/query-core'
7-
import type { CreateInfiniteQueryOptions, NonUndefinedGuard } from './types'
10+
import type { CreateInfiniteQueryOptions } from './types'
811

9-
/**
10-
* @public
11-
*/
1212
export type UndefinedInitialDataInfiniteOptions<
1313
TQueryFnData,
1414
TError = DefaultError,
@@ -23,12 +23,46 @@ export type UndefinedInitialDataInfiniteOptions<
2323
TQueryKey,
2424
TPageParam
2525
> & {
26-
initialData?: undefined
26+
initialData?:
27+
| undefined
28+
| NonUndefinedGuard<InfiniteData<TQueryFnData, TPageParam>>
29+
| InitialDataFunction<
30+
NonUndefinedGuard<InfiniteData<TQueryFnData, TPageParam>>
31+
>
2732
}
2833

29-
/**
30-
* @public
31-
*/
34+
export type UnusedSkipTokenInfiniteOptions<
35+
TQueryFnData,
36+
TError = DefaultError,
37+
TData = InfiniteData<TQueryFnData>,
38+
TQueryKey extends QueryKey = QueryKey,
39+
TPageParam = unknown,
40+
> = OmitKeyof<
41+
CreateInfiniteQueryOptions<
42+
TQueryFnData,
43+
TError,
44+
TData,
45+
TQueryFnData,
46+
TQueryKey,
47+
TPageParam
48+
>,
49+
'queryFn'
50+
> & {
51+
queryFn?: Exclude<
52+
CreateInfiniteQueryOptions<
53+
TQueryFnData,
54+
TError,
55+
TData,
56+
TQueryFnData,
57+
TQueryKey,
58+
TPageParam
59+
>['queryFn'],
60+
SkipToken | undefined
61+
>
62+
}
63+
64+
type NonUndefinedGuard<T> = T extends undefined ? never : T
65+
3266
export type DefinedInitialDataInfiniteOptions<
3367
TQueryFnData,
3468
TError = DefaultError,
@@ -46,6 +80,7 @@ export type DefinedInitialDataInfiniteOptions<
4680
initialData:
4781
| NonUndefinedGuard<InfiniteData<TQueryFnData, TPageParam>>
4882
| (() => NonUndefinedGuard<InfiniteData<TQueryFnData, TPageParam>>)
83+
| undefined
4984
}
5085

5186
/**
@@ -77,7 +112,39 @@ export function infiniteQueryOptions<
77112
TQueryKey,
78113
TPageParam
79114
> & {
80-
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>>
115+
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
116+
}
117+
118+
/**
119+
* Allows to share and re-use infinite query options in a type-safe way.
120+
*
121+
* The `queryKey` will be tagged with the type from `queryFn`.
122+
* @param options - The infinite query options to tag with the type from `queryFn`.
123+
* @returns The tagged infinite query options.
124+
* @public
125+
*/
126+
export function infiniteQueryOptions<
127+
TQueryFnData,
128+
TError = DefaultError,
129+
TData = InfiniteData<TQueryFnData>,
130+
TQueryKey extends QueryKey = QueryKey,
131+
TPageParam = unknown,
132+
>(
133+
options: UnusedSkipTokenInfiniteOptions<
134+
TQueryFnData,
135+
TError,
136+
TData,
137+
TQueryKey,
138+
TPageParam
139+
>,
140+
): UnusedSkipTokenInfiniteOptions<
141+
TQueryFnData,
142+
TError,
143+
TData,
144+
TQueryKey,
145+
TPageParam
146+
> & {
147+
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
81148
}
82149

83150
/**
@@ -109,7 +176,7 @@ export function infiniteQueryOptions<
109176
TQueryKey,
110177
TPageParam
111178
> & {
112-
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>>
179+
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
113180
}
114181

115182
/**

packages/angular-query-experimental/src/query-options.ts

Lines changed: 65 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,55 @@ import type {
22
DataTag,
33
DefaultError,
44
InitialDataFunction,
5+
OmitKeyof,
6+
QueryFunction,
57
QueryKey,
8+
SkipToken,
69
} from '@tanstack/query-core'
7-
import type { CreateQueryOptions, NonUndefinedGuard } from './types'
10+
import type { CreateQueryOptions } from './types'
811

9-
/**
10-
* @public
11-
*/
1212
export type UndefinedInitialDataOptions<
1313
TQueryFnData = unknown,
1414
TError = DefaultError,
1515
TData = TQueryFnData,
1616
TQueryKey extends QueryKey = QueryKey,
1717
> = CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
18-
initialData?: undefined | InitialDataFunction<NonUndefinedGuard<TQueryFnData>>
18+
initialData?:
19+
| undefined
20+
| InitialDataFunction<NonUndefinedGuard<TQueryFnData>>
21+
| NonUndefinedGuard<TQueryFnData>
1922
}
2023

21-
/**
22-
* @public
23-
*/
24+
export type UnusedSkipTokenOptions<
25+
TQueryFnData = unknown,
26+
TError = DefaultError,
27+
TData = TQueryFnData,
28+
TQueryKey extends QueryKey = QueryKey,
29+
> = OmitKeyof<
30+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
31+
'queryFn'
32+
> & {
33+
queryFn?: Exclude<
34+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>['queryFn'],
35+
SkipToken | undefined
36+
>
37+
}
38+
39+
type NonUndefinedGuard<T> = T extends undefined ? never : T
40+
2441
export type DefinedInitialDataOptions<
2542
TQueryFnData = unknown,
2643
TError = DefaultError,
2744
TData = TQueryFnData,
2845
TQueryKey extends QueryKey = QueryKey,
29-
> = CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
46+
> = Omit<
47+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
48+
'queryFn'
49+
> & {
3050
initialData:
3151
| NonUndefinedGuard<TQueryFnData>
3252
| (() => NonUndefinedGuard<TQueryFnData>)
53+
queryFn?: QueryFunction<TQueryFnData, TQueryKey>
3354
}
3455

3556
/**
@@ -62,7 +83,40 @@ export function queryOptions<
6283
>(
6384
options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
6485
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
65-
queryKey: DataTag<TQueryKey, TQueryFnData>
86+
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
87+
}
88+
89+
/**
90+
* Allows to share and re-use query options in a type-safe way.
91+
*
92+
* The `queryKey` will be tagged with the type from `queryFn`.
93+
*
94+
* **Example**
95+
*
96+
* ```ts
97+
* const { queryKey } = queryOptions({
98+
* queryKey: ['key'],
99+
* queryFn: () => Promise.resolve(5),
100+
* // ^? Promise<number>
101+
* })
102+
*
103+
* const queryClient = new QueryClient()
104+
* const data = queryClient.getQueryData(queryKey)
105+
* // ^? number | undefined
106+
* ```
107+
* @param options - The query options to tag with the type from `queryFn`.
108+
* @returns The tagged query options.
109+
* @public
110+
*/
111+
export function queryOptions<
112+
TQueryFnData = unknown,
113+
TError = DefaultError,
114+
TData = TQueryFnData,
115+
TQueryKey extends QueryKey = QueryKey,
116+
>(
117+
options: UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>,
118+
): UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> & {
119+
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
66120
}
67121

68122
/**
@@ -95,7 +149,7 @@ export function queryOptions<
95149
>(
96150
options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
97151
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
98-
queryKey: DataTag<TQueryKey, TQueryFnData>
152+
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
99153
}
100154

101155
/**

packages/angular-query-experimental/src/types.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,3 @@ export type CreateMutationResult<
308308
>,
309309
> = BaseMutationNarrowing<TData, TError, TVariables, TContext> &
310310
MapToSignals<OmitKeyof<TState, keyof BaseMutationNarrowing, 'safely'>>
311-
312-
/**
313-
* @public
314-
*/
315-
export type NonUndefinedGuard<T> = T extends undefined ? never : T

0 commit comments

Comments
 (0)