Skip to content

Commit 9ce9cee

Browse files
committed
fix(tanstack): improve mutation mutateAsync typing
1 parent 9372688 commit 9ce9cee

File tree

9 files changed

+672
-284
lines changed

9 files changed

+672
-284
lines changed

packages/clients/tanstack-query/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@
6767
},
6868
"devDependencies": {
6969
"@tanstack/react-query": "catalog:",
70-
"@tanstack/svelte-query": "5.90.2",
7170
"@tanstack/vue-query": "5.90.6",
71+
"@tanstack/svelte-query": "5.90.2",
7272
"@testing-library/dom": "^10.4.1",
7373
"@testing-library/react": "^16.3.0",
7474
"@types/react": "catalog:",

packages/clients/tanstack-query/src/react.ts

Lines changed: 137 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import type {
3636
GroupByArgs,
3737
GroupByResult,
3838
ModelResult,
39+
SelectIncludeOmit,
3940
SelectSubset,
4041
Subset,
4142
UpdateArgs,
@@ -56,6 +57,7 @@ import {
5657
type ExtraMutationOptions,
5758
type ExtraQueryOptions,
5859
} from './utils/common';
60+
import type { TrimDelegateModelOperations } from './utils/types';
5961

6062
export type { FetchFn } from './utils/common';
6163

@@ -119,126 +121,144 @@ export type ModelMutationOptions<T, TArgs> = Omit<UseMutationOptions<T, DefaultE
119121

120122
export type ModelMutationResult<T, TArgs> = UseMutationResult<T, DefaultError, TArgs>;
121123

122-
export type SchemaHooks<Schema extends SchemaDef> = {
123-
[Model in GetModels<Schema> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model>;
124-
};
125-
126-
export type ModelQueryHooks<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
127-
useFindUnique<T extends FindUniqueArgs<Schema, Model>>(
128-
args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
129-
options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,
130-
): ModelQueryResult<ModelResult<Schema, Model, T> | null>;
131-
132-
useSuspenseFindUnique<T extends FindUniqueArgs<Schema, Model>>(
133-
args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
134-
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T> | null>,
135-
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T> | null>;
136-
137-
useFindFirst<T extends FindArgs<Schema, Model, false>>(
138-
args?: SelectSubset<T, FindArgs<Schema, Model, false>>,
139-
options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,
140-
): ModelQueryResult<ModelResult<Schema, Model, T> | null>;
141-
142-
useSuspenseFindFirst<T extends FindArgs<Schema, Model, false>>(
143-
args?: SelectSubset<T, FindArgs<Schema, Model, false>>,
144-
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T> | null>,
145-
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T> | null>;
146-
147-
useFindMany<T extends FindArgs<Schema, Model, true>>(
148-
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
149-
options?: ModelQueryOptions<ModelResult<Schema, Model, T>[]>,
150-
): ModelQueryResult<ModelResult<Schema, Model, T>[]>;
151-
152-
useSuspenseFindMany<T extends FindArgs<Schema, Model, true>>(
153-
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
154-
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T>[]>,
155-
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T>[]>;
156-
157-
useInfiniteFindMany<T extends FindArgs<Schema, Model, true>>(
158-
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
159-
options?: ModelInfiniteQueryOptions<ModelResult<Schema, Model, T>[]>,
160-
): ModelInfiniteQueryResult<InfiniteData<ModelResult<Schema, Model, T>[]>>;
161-
162-
useSuspenseInfiniteFindMany<T extends FindArgs<Schema, Model, true>>(
163-
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
164-
options?: ModelSuspenseInfiniteQueryOptions<ModelResult<Schema, Model, T>[]>,
165-
): ModelSuspenseInfiniteQueryResult<InfiniteData<ModelResult<Schema, Model, T>[]>>;
166-
167-
useCreate<T extends CreateArgs<Schema, Model>>(
168-
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
169-
): ModelMutationResult<ModelResult<Schema, Model, T>, T>;
170-
171-
useCreateMany<T extends CreateManyArgs<Schema, Model>>(
172-
options?: ModelMutationOptions<BatchResult, T>,
173-
): ModelMutationResult<BatchResult, T>;
174-
175-
useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(
176-
options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,
177-
): ModelMutationResult<ModelResult<Schema, Model, T>[], T>;
178-
179-
useUpdate<T extends UpdateArgs<Schema, Model>>(
180-
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
181-
): ModelMutationResult<ModelResult<Schema, Model, T>, T>;
182-
183-
useUpdateMany<T extends UpdateManyArgs<Schema, Model>>(
184-
options?: ModelMutationOptions<BatchResult, T>,
185-
): ModelMutationResult<BatchResult, T>;
186-
187-
useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(
188-
options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,
189-
): ModelMutationResult<ModelResult<Schema, Model, T>[], T>;
190-
191-
useUpsert<T extends UpsertArgs<Schema, Model>>(
124+
export type ModelMutationModelResult<
125+
Schema extends SchemaDef,
126+
Model extends GetModels<Schema>,
127+
TArgs extends SelectIncludeOmit<Schema, Model, boolean>,
128+
Array extends boolean = false,
129+
> = Omit<ModelMutationResult<ModelResult<Schema, Model, TArgs>, TArgs>, 'mutateAsync'> & {
130+
mutateAsync<T extends TArgs>(
131+
args: T,
192132
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
193-
): ModelMutationResult<ModelResult<Schema, Model, T>, T>;
133+
): Promise<Array extends true ? ModelResult<Schema, Model, T>[] : ModelResult<Schema, Model, T>>;
134+
};
194135

195-
useDelete<T extends DeleteArgs<Schema, Model>>(
196-
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
197-
): ModelMutationResult<ModelResult<Schema, Model, T>, T>;
198-
199-
useDeleteMany<T extends DeleteManyArgs<Schema, Model>>(
200-
options?: ModelMutationOptions<BatchResult, T>,
201-
): ModelMutationResult<BatchResult, T>;
202-
203-
useCount<T extends CountArgs<Schema, Model>>(
204-
args?: Subset<T, CountArgs<Schema, Model>>,
205-
options?: ModelQueryOptions<CountResult<Schema, Model, T>>,
206-
): ModelQueryResult<CountResult<Schema, Model, T>>;
207-
208-
useSuspenseCount<T extends CountArgs<Schema, Model>>(
209-
args?: Subset<T, CountArgs<Schema, Model>>,
210-
options?: ModelSuspenseQueryOptions<CountResult<Schema, Model, T>>,
211-
): ModelSuspenseQueryResult<CountResult<Schema, Model, T>>;
212-
213-
useAggregate<T extends AggregateArgs<Schema, Model>>(
214-
args: Subset<T, AggregateArgs<Schema, Model>>,
215-
options?: ModelQueryOptions<AggregateResult<Schema, Model, T>>,
216-
): ModelQueryResult<AggregateResult<Schema, Model, T>>;
217-
218-
useSuspenseAggregate<T extends AggregateArgs<Schema, Model>>(
219-
args: Subset<T, AggregateArgs<Schema, Model>>,
220-
options?: ModelSuspenseQueryOptions<AggregateResult<Schema, Model, T>>,
221-
): ModelSuspenseQueryResult<AggregateResult<Schema, Model, T>>;
222-
223-
useGroupBy<T extends GroupByArgs<Schema, Model>>(
224-
args: Subset<T, GroupByArgs<Schema, Model>>,
225-
options?: ModelQueryOptions<GroupByResult<Schema, Model, T>>,
226-
): ModelQueryResult<GroupByResult<Schema, Model, T>>;
227-
228-
useSuspenseGroupBy<T extends GroupByArgs<Schema, Model>>(
229-
args: Subset<T, GroupByArgs<Schema, Model>>,
230-
options?: ModelSuspenseQueryOptions<GroupByResult<Schema, Model, T>>,
231-
): ModelSuspenseQueryResult<GroupByResult<Schema, Model, T>>;
136+
export type ClientHooks<Schema extends SchemaDef> = {
137+
[Model in GetModels<Schema> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model>;
232138
};
233139

140+
// Note that we can potentially use TypeScript's mapped type to directly map from ORM contract, but that seems
141+
// to significantly slow down tsc performance ...
142+
export type ModelQueryHooks<Schema extends SchemaDef, Model extends GetModels<Schema>> = TrimDelegateModelOperations<
143+
Schema,
144+
Model,
145+
{
146+
useFindUnique<T extends FindUniqueArgs<Schema, Model>>(
147+
args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
148+
options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,
149+
): ModelQueryResult<ModelResult<Schema, Model, T> | null>;
150+
151+
useSuspenseFindUnique<T extends FindUniqueArgs<Schema, Model>>(
152+
args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
153+
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T> | null>,
154+
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T> | null>;
155+
156+
useFindFirst<T extends FindArgs<Schema, Model, false>>(
157+
args?: SelectSubset<T, FindArgs<Schema, Model, false>>,
158+
options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,
159+
): ModelQueryResult<ModelResult<Schema, Model, T> | null>;
160+
161+
useSuspenseFindFirst<T extends FindArgs<Schema, Model, false>>(
162+
args?: SelectSubset<T, FindArgs<Schema, Model, false>>,
163+
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T> | null>,
164+
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T> | null>;
165+
166+
useFindMany<T extends FindArgs<Schema, Model, true>>(
167+
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
168+
options?: ModelQueryOptions<ModelResult<Schema, Model, T>[]>,
169+
): ModelQueryResult<ModelResult<Schema, Model, T>[]>;
170+
171+
useSuspenseFindMany<T extends FindArgs<Schema, Model, true>>(
172+
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
173+
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T>[]>,
174+
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T>[]>;
175+
176+
useInfiniteFindMany<T extends FindArgs<Schema, Model, true>>(
177+
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
178+
options?: ModelInfiniteQueryOptions<ModelResult<Schema, Model, T>[]>,
179+
): ModelInfiniteQueryResult<InfiniteData<ModelResult<Schema, Model, T>[]>>;
180+
181+
useSuspenseInfiniteFindMany<T extends FindArgs<Schema, Model, true>>(
182+
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
183+
options?: ModelSuspenseInfiniteQueryOptions<ModelResult<Schema, Model, T>[]>,
184+
): ModelSuspenseInfiniteQueryResult<InfiniteData<ModelResult<Schema, Model, T>[]>>;
185+
186+
useCreate<T extends CreateArgs<Schema, Model>>(
187+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
188+
): ModelMutationModelResult<Schema, Model, T>;
189+
190+
useCreateMany<T extends CreateManyArgs<Schema, Model>>(
191+
options?: ModelMutationOptions<BatchResult, T>,
192+
): ModelMutationResult<BatchResult, T>;
193+
194+
useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(
195+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,
196+
): ModelMutationModelResult<Schema, Model, T, true>;
197+
198+
useUpdate<T extends UpdateArgs<Schema, Model>>(
199+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
200+
): ModelMutationModelResult<Schema, Model, T>;
201+
202+
useUpdateMany<T extends UpdateManyArgs<Schema, Model>>(
203+
options?: ModelMutationOptions<BatchResult, T>,
204+
): ModelMutationResult<BatchResult, T>;
205+
206+
useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(
207+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,
208+
): ModelMutationModelResult<Schema, Model, T, true>;
209+
210+
useUpsert<T extends UpsertArgs<Schema, Model>>(
211+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
212+
): ModelMutationModelResult<Schema, Model, T>;
213+
214+
useDelete<T extends DeleteArgs<Schema, Model>>(
215+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
216+
): ModelMutationModelResult<Schema, Model, T>;
217+
218+
useDeleteMany<T extends DeleteManyArgs<Schema, Model>>(
219+
options?: ModelMutationOptions<BatchResult, T>,
220+
): ModelMutationResult<BatchResult, T>;
221+
222+
useCount<T extends CountArgs<Schema, Model>>(
223+
args?: Subset<T, CountArgs<Schema, Model>>,
224+
options?: ModelQueryOptions<CountResult<Schema, Model, T>>,
225+
): ModelQueryResult<CountResult<Schema, Model, T>>;
226+
227+
useSuspenseCount<T extends CountArgs<Schema, Model>>(
228+
args?: Subset<T, CountArgs<Schema, Model>>,
229+
options?: ModelSuspenseQueryOptions<CountResult<Schema, Model, T>>,
230+
): ModelSuspenseQueryResult<CountResult<Schema, Model, T>>;
231+
232+
useAggregate<T extends AggregateArgs<Schema, Model>>(
233+
args: Subset<T, AggregateArgs<Schema, Model>>,
234+
options?: ModelQueryOptions<AggregateResult<Schema, Model, T>>,
235+
): ModelQueryResult<AggregateResult<Schema, Model, T>>;
236+
237+
useSuspenseAggregate<T extends AggregateArgs<Schema, Model>>(
238+
args: Subset<T, AggregateArgs<Schema, Model>>,
239+
options?: ModelSuspenseQueryOptions<AggregateResult<Schema, Model, T>>,
240+
): ModelSuspenseQueryResult<AggregateResult<Schema, Model, T>>;
241+
242+
useGroupBy<T extends GroupByArgs<Schema, Model>>(
243+
args: Subset<T, GroupByArgs<Schema, Model>>,
244+
options?: ModelQueryOptions<GroupByResult<Schema, Model, T>>,
245+
): ModelQueryResult<GroupByResult<Schema, Model, T>>;
246+
247+
useSuspenseGroupBy<T extends GroupByArgs<Schema, Model>>(
248+
args: Subset<T, GroupByArgs<Schema, Model>>,
249+
options?: ModelSuspenseQueryOptions<GroupByResult<Schema, Model, T>>,
250+
): ModelSuspenseQueryResult<GroupByResult<Schema, Model, T>>;
251+
}
252+
>;
253+
234254
/**
235255
* Gets data query hooks for all models in the schema.
236256
*/
237-
export function useClientQueries<Schema extends SchemaDef>(schema: Schema): SchemaHooks<Schema> {
257+
export function useClientQueries<Schema extends SchemaDef>(schema: Schema): ClientHooks<Schema> {
238258
return Object.keys(schema.models).reduce((acc, model) => {
239259
(acc as any)[lowerCaseFirst(model)] = useModelQueries(schema, model as GetModels<Schema>);
240260
return acc;
241-
}, {} as SchemaHooks<Schema>);
261+
}, {} as ClientHooks<Schema>);
242262
}
243263

244264
/**
@@ -401,11 +421,14 @@ export function useInternalInfiniteQuery<TQueryFnData, TData>(
401421
model: string,
402422
operation: string,
403423
args: unknown,
404-
options: Omit<
405-
UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>,
406-
'queryKey' | 'initialPageParam'
407-
>,
424+
options:
425+
| Omit<
426+
UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>,
427+
'queryKey' | 'initialPageParam'
428+
>
429+
| undefined,
408430
) {
431+
options = options ?? { getNextPageParam: () => undefined };
409432
const { endpoint, fetch } = useHooksContext();
410433
const queryKey = getQueryKey(model, operation, args, { infinite: true, optimisticUpdate: false });
411434
return {

0 commit comments

Comments
 (0)