@zenstackhq/tanstack-query 2.21.0 → 3.0.0-beta.16
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/.turbo/turbo-build.log +32 -0
- package/.turbo/turbo-lint.log +5 -0
- package/LICENSE +1 -1
- package/dist/react.cjs +1238 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +696 -0
- package/dist/react.d.ts +696 -0
- package/dist/react.js +1195 -0
- package/dist/react.js.map +1 -0
- package/eslint.config.js +4 -0
- package/package.json +56 -109
- package/scripts/generate.ts +27 -0
- package/src/react.ts +531 -0
- package/src/utils/common.ts +457 -0
- package/src/utils/mutator.ts +441 -0
- package/src/utils/nested-read-visitor.ts +61 -0
- package/src/utils/nested-write-visitor.ts +359 -0
- package/src/utils/query-analysis.ts +116 -0
- package/src/utils/serialization.ts +39 -0
- package/src/utils/types.ts +19 -0
- package/test/react-query.test.tsx +1787 -0
- package/test/schemas/basic/input.ts +70 -0
- package/test/schemas/basic/models.ts +12 -0
- package/test/schemas/basic/schema-lite.ts +124 -0
- package/test/schemas/basic/schema.zmodel +25 -0
- package/tsconfig.json +7 -0
- package/tsconfig.test.json +8 -0
- package/tsup.config.ts +13 -0
- package/vitest.config.ts +11 -0
- package/README.md +0 -5
- package/generator.d.ts +0 -6
- package/generator.js +0 -578
- package/generator.js.map +0 -1
- package/index.d.ts +0 -4
- package/index.js +0 -22
- package/index.js.map +0 -1
- package/runtime/common-CXlL7vTW.d.mts +0 -121
- package/runtime/common-CXlL7vTW.d.ts +0 -121
- package/runtime/index.d.mts +0 -20
- package/runtime/index.d.ts +0 -20
- package/runtime/index.js +0 -44
- package/runtime/index.js.map +0 -1
- package/runtime/index.mjs +0 -21
- package/runtime/index.mjs.map +0 -1
- package/runtime/react.d.mts +0 -322
- package/runtime/react.d.ts +0 -322
- package/runtime/react.js +0 -408
- package/runtime/react.js.map +0 -1
- package/runtime/react.mjs +0 -380
- package/runtime/react.mjs.map +0 -1
- package/runtime/svelte.d.mts +0 -322
- package/runtime/svelte.d.ts +0 -322
- package/runtime/svelte.js +0 -407
- package/runtime/svelte.js.map +0 -1
- package/runtime/svelte.mjs +0 -379
- package/runtime/svelte.mjs.map +0 -1
- package/runtime/vue.d.mts +0 -330
- package/runtime/vue.d.ts +0 -330
- package/runtime/vue.js +0 -418
- package/runtime/vue.js.map +0 -1
- package/runtime/vue.mjs +0 -390
- package/runtime/vue.mjs.map +0 -1
- package/runtime-v5/angular.d.mts +0 -59
- package/runtime-v5/angular.d.ts +0 -59
- package/runtime-v5/angular.js +0 -425
- package/runtime-v5/angular.js.map +0 -1
- package/runtime-v5/angular.mjs +0 -397
- package/runtime-v5/angular.mjs.map +0 -1
- package/runtime-v5/common-CXlL7vTW.d.mts +0 -121
- package/runtime-v5/common-CXlL7vTW.d.ts +0 -121
- package/runtime-v5/index.d.mts +0 -20
- package/runtime-v5/index.d.ts +0 -20
- package/runtime-v5/index.js +0 -44
- package/runtime-v5/index.js.map +0 -1
- package/runtime-v5/index.mjs +0 -21
- package/runtime-v5/index.mjs.map +0 -1
- package/runtime-v5/react.d.mts +0 -474
- package/runtime-v5/react.d.ts +0 -474
- package/runtime-v5/react.js +0 -440
- package/runtime-v5/react.js.map +0 -1
- package/runtime-v5/react.mjs +0 -412
- package/runtime-v5/react.mjs.map +0 -1
- package/runtime-v5/svelte.d.mts +0 -386
- package/runtime-v5/svelte.d.ts +0 -386
- package/runtime-v5/svelte.js +0 -436
- package/runtime-v5/svelte.js.map +0 -1
- package/runtime-v5/svelte.mjs +0 -408
- package/runtime-v5/svelte.mjs.map +0 -1
- package/runtime-v5/vue.d.mts +0 -330
- package/runtime-v5/vue.d.ts +0 -330
- package/runtime-v5/vue.js +0 -420
- package/runtime-v5/vue.js.map +0 -1
- package/runtime-v5/vue.mjs +0 -392
- package/runtime-v5/vue.mjs.map +0 -1
package/src/react.ts
ADDED
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useInfiniteQuery,
|
|
3
|
+
useMutation,
|
|
4
|
+
useQuery,
|
|
5
|
+
useQueryClient,
|
|
6
|
+
useSuspenseInfiniteQuery,
|
|
7
|
+
useSuspenseQuery,
|
|
8
|
+
type DefaultError,
|
|
9
|
+
type InfiniteData,
|
|
10
|
+
type QueryKey,
|
|
11
|
+
type UseInfiniteQueryOptions,
|
|
12
|
+
type UseInfiniteQueryResult,
|
|
13
|
+
type UseMutationOptions,
|
|
14
|
+
type UseMutationResult,
|
|
15
|
+
type UseQueryOptions,
|
|
16
|
+
type UseQueryResult,
|
|
17
|
+
type UseSuspenseInfiniteQueryOptions,
|
|
18
|
+
type UseSuspenseInfiniteQueryResult,
|
|
19
|
+
type UseSuspenseQueryOptions,
|
|
20
|
+
type UseSuspenseQueryResult,
|
|
21
|
+
} from '@tanstack/react-query';
|
|
22
|
+
import { lowerCaseFirst } from '@zenstackhq/common-helpers';
|
|
23
|
+
import type {
|
|
24
|
+
AggregateArgs,
|
|
25
|
+
AggregateResult,
|
|
26
|
+
BatchResult,
|
|
27
|
+
CountArgs,
|
|
28
|
+
CountResult,
|
|
29
|
+
CreateArgs,
|
|
30
|
+
CreateManyAndReturnArgs,
|
|
31
|
+
CreateManyArgs,
|
|
32
|
+
DeleteArgs,
|
|
33
|
+
DeleteManyArgs,
|
|
34
|
+
FindArgs,
|
|
35
|
+
FindUniqueArgs,
|
|
36
|
+
GroupByArgs,
|
|
37
|
+
GroupByResult,
|
|
38
|
+
ModelResult,
|
|
39
|
+
SelectSubset,
|
|
40
|
+
UpdateArgs,
|
|
41
|
+
UpdateManyAndReturnArgs,
|
|
42
|
+
UpdateManyArgs,
|
|
43
|
+
UpsertArgs,
|
|
44
|
+
} from '@zenstackhq/orm';
|
|
45
|
+
import type { GetModels, SchemaDef } from '@zenstackhq/schema';
|
|
46
|
+
import { createContext, useContext } from 'react';
|
|
47
|
+
import {
|
|
48
|
+
fetcher,
|
|
49
|
+
getQueryKey,
|
|
50
|
+
makeUrl,
|
|
51
|
+
marshal,
|
|
52
|
+
setupInvalidation,
|
|
53
|
+
setupOptimisticUpdate,
|
|
54
|
+
type APIContext,
|
|
55
|
+
type ExtraMutationOptions,
|
|
56
|
+
type ExtraQueryOptions,
|
|
57
|
+
} from './utils/common';
|
|
58
|
+
|
|
59
|
+
export type { FetchFn } from './utils/common';
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The default query endpoint.
|
|
63
|
+
*/
|
|
64
|
+
export const DEFAULT_QUERY_ENDPOINT = '/api/model';
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* React context for query settings.
|
|
68
|
+
*/
|
|
69
|
+
export const QuerySettingsContext = createContext<APIContext>({
|
|
70
|
+
endpoint: DEFAULT_QUERY_ENDPOINT,
|
|
71
|
+
fetch: undefined,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* React context provider for configuring query settings.
|
|
76
|
+
*/
|
|
77
|
+
export const QuerySettingsProvider = QuerySettingsContext.Provider;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* React context provider for configuring query settings.
|
|
81
|
+
*
|
|
82
|
+
* @deprecated Use `QuerySettingsProvider` instead.
|
|
83
|
+
*/
|
|
84
|
+
export const Provider = QuerySettingsProvider;
|
|
85
|
+
|
|
86
|
+
function useHooksContext() {
|
|
87
|
+
const { endpoint, ...rest } = useContext(QuerySettingsContext);
|
|
88
|
+
return { endpoint: endpoint ?? DEFAULT_QUERY_ENDPOINT, ...rest };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export type ModelQueryOptions<T> = Omit<UseQueryOptions<T, DefaultError>, 'queryKey'> & ExtraQueryOptions;
|
|
92
|
+
|
|
93
|
+
export type ModelQueryResult<T> = UseQueryResult<T, DefaultError> & { queryKey: QueryKey };
|
|
94
|
+
|
|
95
|
+
export type ModelSuspenseQueryOptions<T> = Omit<UseSuspenseQueryOptions<T, DefaultError>, 'queryKey'> &
|
|
96
|
+
ExtraQueryOptions;
|
|
97
|
+
|
|
98
|
+
export type ModelSuspenseQueryResult<T> = UseSuspenseQueryResult<T, DefaultError> & { queryKey: QueryKey };
|
|
99
|
+
|
|
100
|
+
export type ModelInfiniteQueryOptions<T> = Omit<
|
|
101
|
+
UseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>,
|
|
102
|
+
'queryKey' | 'initialPageParam'
|
|
103
|
+
>;
|
|
104
|
+
|
|
105
|
+
export type ModelInfiniteQueryResult<T> = UseInfiniteQueryResult<T, DefaultError> & { queryKey: QueryKey };
|
|
106
|
+
|
|
107
|
+
export type ModelSuspenseInfiniteQueryOptions<T> = Omit<
|
|
108
|
+
UseSuspenseInfiniteQueryOptions<T, DefaultError, InfiniteData<T>>,
|
|
109
|
+
'queryKey' | 'initialPageParam'
|
|
110
|
+
>;
|
|
111
|
+
|
|
112
|
+
export type ModelSuspenseInfiniteQueryResult<T> = UseSuspenseInfiniteQueryResult<T, DefaultError> & {
|
|
113
|
+
queryKey: QueryKey;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export type ModelMutationOptions<T, TArgs> = Omit<UseMutationOptions<T, DefaultError, TArgs>, 'mutationFn'> &
|
|
117
|
+
ExtraMutationOptions;
|
|
118
|
+
|
|
119
|
+
export type ModelMutationResult<T, TArgs> = UseMutationResult<T, DefaultError, TArgs>;
|
|
120
|
+
|
|
121
|
+
export type SchemaHooks<Schema extends SchemaDef> = {
|
|
122
|
+
[Model in GetModels<Schema> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model>;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export type ModelQueryHooks<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
|
|
126
|
+
useFindUnique<T extends FindUniqueArgs<Schema, Model>>(
|
|
127
|
+
args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
|
|
128
|
+
options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,
|
|
129
|
+
): ModelQueryResult<ModelResult<Schema, Model, T> | null>;
|
|
130
|
+
|
|
131
|
+
useSuspenseFindUnique<T extends FindUniqueArgs<Schema, Model>>(
|
|
132
|
+
args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
|
|
133
|
+
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T> | null>,
|
|
134
|
+
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T> | null>;
|
|
135
|
+
|
|
136
|
+
useFindFirst<T extends FindArgs<Schema, Model, false>>(
|
|
137
|
+
args?: SelectSubset<T, FindArgs<Schema, Model, false>>,
|
|
138
|
+
options?: ModelQueryOptions<ModelResult<Schema, Model, T> | null>,
|
|
139
|
+
): ModelQueryResult<ModelResult<Schema, Model, T> | null>;
|
|
140
|
+
|
|
141
|
+
useSuspenseFindFirst<T extends FindArgs<Schema, Model, false>>(
|
|
142
|
+
args?: SelectSubset<T, FindArgs<Schema, Model, false>>,
|
|
143
|
+
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T> | null>,
|
|
144
|
+
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T> | null>;
|
|
145
|
+
|
|
146
|
+
useFindMany<T extends FindArgs<Schema, Model, true>>(
|
|
147
|
+
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
|
|
148
|
+
options?: ModelQueryOptions<ModelResult<Schema, Model, T>[]>,
|
|
149
|
+
): ModelQueryResult<ModelResult<Schema, Model, T>[]>;
|
|
150
|
+
|
|
151
|
+
useSuspenseFindMany<T extends FindArgs<Schema, Model, true>>(
|
|
152
|
+
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
|
|
153
|
+
options?: ModelSuspenseQueryOptions<ModelResult<Schema, Model, T>[]>,
|
|
154
|
+
): ModelSuspenseQueryResult<ModelResult<Schema, Model, T>[]>;
|
|
155
|
+
|
|
156
|
+
useInfiniteFindMany<T extends FindArgs<Schema, Model, true>>(
|
|
157
|
+
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
|
|
158
|
+
options?: ModelInfiniteQueryOptions<ModelResult<Schema, Model, T>[]>,
|
|
159
|
+
): ModelInfiniteQueryResult<InfiniteData<ModelResult<Schema, Model, T>[]>>;
|
|
160
|
+
|
|
161
|
+
useSuspenseInfiniteFindMany<T extends FindArgs<Schema, Model, true>>(
|
|
162
|
+
args?: SelectSubset<T, FindArgs<Schema, Model, true>>,
|
|
163
|
+
options?: ModelSuspenseInfiniteQueryOptions<ModelResult<Schema, Model, T>[]>,
|
|
164
|
+
): ModelSuspenseInfiniteQueryResult<InfiniteData<ModelResult<Schema, Model, T>[]>>;
|
|
165
|
+
|
|
166
|
+
useCreate<T extends CreateArgs<Schema, Model>>(
|
|
167
|
+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
|
|
168
|
+
): ModelMutationResult<ModelResult<Schema, Model, T>, T>;
|
|
169
|
+
|
|
170
|
+
useCreateMany<T extends CreateManyArgs<Schema, Model>>(
|
|
171
|
+
options?: ModelMutationOptions<BatchResult, T>,
|
|
172
|
+
): ModelMutationResult<BatchResult, T>;
|
|
173
|
+
|
|
174
|
+
useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(
|
|
175
|
+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,
|
|
176
|
+
): ModelMutationResult<ModelResult<Schema, Model, T>[], T>;
|
|
177
|
+
|
|
178
|
+
useUpdate<T extends UpdateArgs<Schema, Model>>(
|
|
179
|
+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
|
|
180
|
+
): ModelMutationResult<ModelResult<Schema, Model, T>, T>;
|
|
181
|
+
|
|
182
|
+
useUpdateMany<T extends UpdateManyArgs<Schema, Model>>(
|
|
183
|
+
options?: ModelMutationOptions<BatchResult, T>,
|
|
184
|
+
): ModelMutationResult<BatchResult, T>;
|
|
185
|
+
|
|
186
|
+
useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(
|
|
187
|
+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>[], T>,
|
|
188
|
+
): ModelMutationResult<ModelResult<Schema, Model, T>[], T>;
|
|
189
|
+
|
|
190
|
+
useUpsert<T extends UpsertArgs<Schema, Model>>(
|
|
191
|
+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
|
|
192
|
+
): ModelMutationResult<ModelResult<Schema, Model, T>, T>;
|
|
193
|
+
|
|
194
|
+
useDelete<T extends DeleteArgs<Schema, Model>>(
|
|
195
|
+
options?: ModelMutationOptions<ModelResult<Schema, Model, T>, T>,
|
|
196
|
+
): ModelMutationResult<ModelResult<Schema, Model, T>, T>;
|
|
197
|
+
|
|
198
|
+
useDeleteMany<T extends DeleteManyArgs<Schema, Model>>(
|
|
199
|
+
options?: ModelMutationOptions<BatchResult, T>,
|
|
200
|
+
): ModelMutationResult<BatchResult, T>;
|
|
201
|
+
|
|
202
|
+
useCount<T extends CountArgs<Schema, Model>>(
|
|
203
|
+
options?: ModelQueryOptions<CountResult<Schema, Model, T>>,
|
|
204
|
+
): ModelQueryResult<CountResult<Schema, Model, T>>;
|
|
205
|
+
|
|
206
|
+
useSuspenseCount<T extends CountArgs<Schema, Model>>(
|
|
207
|
+
options?: ModelSuspenseQueryOptions<CountResult<Schema, Model, T>>,
|
|
208
|
+
): ModelSuspenseQueryResult<CountResult<Schema, Model, T>>;
|
|
209
|
+
|
|
210
|
+
useAggregate<T extends AggregateArgs<Schema, Model>>(
|
|
211
|
+
options?: ModelQueryOptions<AggregateResult<Schema, Model, T>>,
|
|
212
|
+
): ModelQueryResult<AggregateResult<Schema, Model, T>>;
|
|
213
|
+
|
|
214
|
+
useSuspenseAggregate<T extends AggregateArgs<Schema, Model>>(
|
|
215
|
+
options?: ModelSuspenseQueryOptions<AggregateResult<Schema, Model, T>>,
|
|
216
|
+
): ModelSuspenseQueryResult<AggregateResult<Schema, Model, T>>;
|
|
217
|
+
|
|
218
|
+
useGroupBy<T extends GroupByArgs<Schema, Model>>(
|
|
219
|
+
options?: ModelQueryOptions<GroupByResult<Schema, Model, T>>,
|
|
220
|
+
): ModelQueryResult<GroupByResult<Schema, Model, T>>;
|
|
221
|
+
|
|
222
|
+
useSuspenseGroupBy<T extends GroupByArgs<Schema, Model>>(
|
|
223
|
+
options?: ModelSuspenseQueryOptions<GroupByResult<Schema, Model, T>>,
|
|
224
|
+
): ModelSuspenseQueryResult<GroupByResult<Schema, Model, T>>;
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Gets data query hooks for all models in the schema.
|
|
229
|
+
*/
|
|
230
|
+
export function useClientQueries<Schema extends SchemaDef>(schema: Schema): SchemaHooks<Schema> {
|
|
231
|
+
return Object.keys(schema.models).reduce((acc, model) => {
|
|
232
|
+
(acc as any)[lowerCaseFirst(model)] = useModelQueries(schema, model as GetModels<Schema>);
|
|
233
|
+
return acc;
|
|
234
|
+
}, {} as SchemaHooks<Schema>);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Gets data query hooks for a specific model in the schema.
|
|
239
|
+
*/
|
|
240
|
+
export function useModelQueries<Schema extends SchemaDef, Model extends GetModels<Schema>>(
|
|
241
|
+
schema: Schema,
|
|
242
|
+
model: Model,
|
|
243
|
+
): ModelQueryHooks<Schema, Model> {
|
|
244
|
+
const modelDef = Object.values(schema.models).find((m) => m.name.toLowerCase() === model.toLowerCase());
|
|
245
|
+
if (!modelDef) {
|
|
246
|
+
throw new Error(`Model "${model}" not found in schema`);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const modelName = modelDef.name;
|
|
250
|
+
|
|
251
|
+
return {
|
|
252
|
+
useFindUnique: (args: any, options?: any) => {
|
|
253
|
+
return useInternalQuery(schema, modelName, 'findUnique', args, options);
|
|
254
|
+
},
|
|
255
|
+
|
|
256
|
+
useSuspenseFindUnique: (args: any, options?: any) => {
|
|
257
|
+
return useInternalSuspenseQuery(schema, modelName, 'findUnique', args, options);
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
useFindFirst: (args: any, options?: any) => {
|
|
261
|
+
return useInternalQuery(schema, modelName, 'findFirst', args, options);
|
|
262
|
+
},
|
|
263
|
+
|
|
264
|
+
useSuspenseFindFirst: (args: any, options?: any) => {
|
|
265
|
+
return useInternalSuspenseQuery(schema, modelName, 'findFirst', args, options);
|
|
266
|
+
},
|
|
267
|
+
|
|
268
|
+
useFindMany: (args: any, options?: any) => {
|
|
269
|
+
return useInternalQuery(schema, modelName, 'findMany', args, options);
|
|
270
|
+
},
|
|
271
|
+
|
|
272
|
+
useSuspenseFindMany: (args: any, options?: any) => {
|
|
273
|
+
return useInternalSuspenseQuery(schema, modelName, 'findMany', args, options);
|
|
274
|
+
},
|
|
275
|
+
|
|
276
|
+
useInfiniteFindMany: (args: any, options?: any) => {
|
|
277
|
+
return useInternalInfiniteQuery(schema, modelName, 'findMany', args, options);
|
|
278
|
+
},
|
|
279
|
+
|
|
280
|
+
useSuspenseInfiniteFindMany: (args: any, options?: any) => {
|
|
281
|
+
return useInternalSuspenseInfiniteQuery(schema, modelName, 'findMany', args, options);
|
|
282
|
+
},
|
|
283
|
+
|
|
284
|
+
useCreate: (options?: any) => {
|
|
285
|
+
return useInternalMutation(schema, modelName, 'POST', 'create', options, true);
|
|
286
|
+
},
|
|
287
|
+
|
|
288
|
+
useCreateMany: (options?: any) => {
|
|
289
|
+
return useInternalMutation(schema, modelName, 'POST', 'createMany', options, false);
|
|
290
|
+
},
|
|
291
|
+
|
|
292
|
+
useCreateManyAndReturn: (options?: any) => {
|
|
293
|
+
return useInternalMutation(schema, modelName, 'POST', 'createManyAndReturn', options, true);
|
|
294
|
+
},
|
|
295
|
+
|
|
296
|
+
useUpdate: (options?: any) => {
|
|
297
|
+
return useInternalMutation(schema, modelName, 'PUT', 'update', options, true);
|
|
298
|
+
},
|
|
299
|
+
|
|
300
|
+
useUpdateMany: (options?: any) => {
|
|
301
|
+
return useInternalMutation(schema, modelName, 'PUT', 'updateMany', options, false);
|
|
302
|
+
},
|
|
303
|
+
|
|
304
|
+
useUpdateManyAndReturn: (options?: any) => {
|
|
305
|
+
return useInternalMutation(schema, modelName, 'PUT', 'updateManyAndReturn', options, true);
|
|
306
|
+
},
|
|
307
|
+
|
|
308
|
+
useUpsert: (options?: any) => {
|
|
309
|
+
return useInternalMutation(schema, modelName, 'POST', 'upsert', options, true);
|
|
310
|
+
},
|
|
311
|
+
|
|
312
|
+
useDelete: (options?: any) => {
|
|
313
|
+
return useInternalMutation(schema, modelName, 'DELETE', 'delete', options, true);
|
|
314
|
+
},
|
|
315
|
+
|
|
316
|
+
useDeleteMany: (options?: any) => {
|
|
317
|
+
return useInternalMutation(schema, modelName, 'DELETE', 'deleteMany', options, false);
|
|
318
|
+
},
|
|
319
|
+
|
|
320
|
+
useCount: (options?: any) => {
|
|
321
|
+
return useInternalQuery(schema, modelName, 'count', undefined, options);
|
|
322
|
+
},
|
|
323
|
+
|
|
324
|
+
useSuspenseCount: (options?: any) => {
|
|
325
|
+
return useInternalSuspenseQuery(schema, modelName, 'count', undefined, options);
|
|
326
|
+
},
|
|
327
|
+
|
|
328
|
+
useAggregate: (options?: any) => {
|
|
329
|
+
return useInternalQuery(schema, modelName, 'aggregate', undefined, options);
|
|
330
|
+
},
|
|
331
|
+
|
|
332
|
+
useSuspenseAggregate: (options?: any) => {
|
|
333
|
+
return useInternalSuspenseQuery(schema, modelName, 'aggregate', undefined, options);
|
|
334
|
+
},
|
|
335
|
+
|
|
336
|
+
useGroupBy: (options?: any) => {
|
|
337
|
+
return useInternalQuery(schema, modelName, 'groupBy', undefined, options);
|
|
338
|
+
},
|
|
339
|
+
|
|
340
|
+
useSuspenseGroupBy: (options?: any) => {
|
|
341
|
+
return useInternalSuspenseQuery(schema, modelName, 'groupBy', undefined, options);
|
|
342
|
+
},
|
|
343
|
+
} as ModelQueryHooks<Schema, Model>;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export function useInternalQuery<TQueryFnData, TData>(
|
|
347
|
+
_schema: SchemaDef,
|
|
348
|
+
model: string,
|
|
349
|
+
operation: string,
|
|
350
|
+
args?: unknown,
|
|
351
|
+
options?: Omit<UseQueryOptions<TQueryFnData, DefaultError, TData>, 'queryKey'> & ExtraQueryOptions,
|
|
352
|
+
) {
|
|
353
|
+
const { endpoint, fetch } = useHooksContext();
|
|
354
|
+
const reqUrl = makeUrl(endpoint, model, operation, args);
|
|
355
|
+
const queryKey = getQueryKey(model, operation, args, {
|
|
356
|
+
infinite: false,
|
|
357
|
+
optimisticUpdate: options?.optimisticUpdate !== false,
|
|
358
|
+
});
|
|
359
|
+
return {
|
|
360
|
+
queryKey,
|
|
361
|
+
...useQuery({
|
|
362
|
+
queryKey,
|
|
363
|
+
queryFn: ({ signal }) => fetcher<TQueryFnData, false>(reqUrl, { signal }, fetch, false),
|
|
364
|
+
...options,
|
|
365
|
+
}),
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export function useInternalSuspenseQuery<TQueryFnData, TData>(
|
|
370
|
+
_schema: SchemaDef,
|
|
371
|
+
model: string,
|
|
372
|
+
operation: string,
|
|
373
|
+
args?: unknown,
|
|
374
|
+
options?: Omit<UseSuspenseQueryOptions<TQueryFnData, DefaultError, TData>, 'queryKey'> & ExtraQueryOptions,
|
|
375
|
+
) {
|
|
376
|
+
const { endpoint, fetch } = useHooksContext();
|
|
377
|
+
const reqUrl = makeUrl(endpoint, model, operation, args);
|
|
378
|
+
const queryKey = getQueryKey(model, operation, args, {
|
|
379
|
+
infinite: false,
|
|
380
|
+
optimisticUpdate: options?.optimisticUpdate !== false,
|
|
381
|
+
});
|
|
382
|
+
return {
|
|
383
|
+
queryKey,
|
|
384
|
+
...useSuspenseQuery({
|
|
385
|
+
queryKey,
|
|
386
|
+
queryFn: ({ signal }) => fetcher<TQueryFnData, false>(reqUrl, { signal }, fetch, false),
|
|
387
|
+
...options,
|
|
388
|
+
}),
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
export function useInternalInfiniteQuery<TQueryFnData, TData>(
|
|
393
|
+
_schema: SchemaDef,
|
|
394
|
+
model: string,
|
|
395
|
+
operation: string,
|
|
396
|
+
args: unknown,
|
|
397
|
+
options: Omit<
|
|
398
|
+
UseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>,
|
|
399
|
+
'queryKey' | 'initialPageParam'
|
|
400
|
+
>,
|
|
401
|
+
) {
|
|
402
|
+
const { endpoint, fetch } = useHooksContext();
|
|
403
|
+
const queryKey = getQueryKey(model, operation, args, { infinite: true, optimisticUpdate: false });
|
|
404
|
+
return {
|
|
405
|
+
queryKey,
|
|
406
|
+
...useInfiniteQuery({
|
|
407
|
+
queryKey,
|
|
408
|
+
queryFn: ({ pageParam, signal }) => {
|
|
409
|
+
return fetcher<TQueryFnData, false>(
|
|
410
|
+
makeUrl(endpoint, model, operation, pageParam ?? args),
|
|
411
|
+
{ signal },
|
|
412
|
+
fetch,
|
|
413
|
+
false,
|
|
414
|
+
);
|
|
415
|
+
},
|
|
416
|
+
initialPageParam: args,
|
|
417
|
+
...options,
|
|
418
|
+
}),
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
export function useInternalSuspenseInfiniteQuery<TQueryFnData, TData>(
|
|
423
|
+
_schema: SchemaDef,
|
|
424
|
+
model: string,
|
|
425
|
+
operation: string,
|
|
426
|
+
args: unknown,
|
|
427
|
+
options: Omit<
|
|
428
|
+
UseSuspenseInfiniteQueryOptions<TQueryFnData, DefaultError, InfiniteData<TData>>,
|
|
429
|
+
'queryKey' | 'initialPageParam'
|
|
430
|
+
>,
|
|
431
|
+
) {
|
|
432
|
+
const { endpoint, fetch } = useHooksContext();
|
|
433
|
+
const queryKey = getQueryKey(model, operation, args, { infinite: true, optimisticUpdate: false });
|
|
434
|
+
return {
|
|
435
|
+
queryKey,
|
|
436
|
+
...useSuspenseInfiniteQuery({
|
|
437
|
+
queryKey,
|
|
438
|
+
queryFn: ({ pageParam, signal }) => {
|
|
439
|
+
return fetcher<TQueryFnData, false>(
|
|
440
|
+
makeUrl(endpoint, model, operation, pageParam ?? args),
|
|
441
|
+
{ signal },
|
|
442
|
+
fetch,
|
|
443
|
+
false,
|
|
444
|
+
);
|
|
445
|
+
},
|
|
446
|
+
initialPageParam: args,
|
|
447
|
+
...options,
|
|
448
|
+
}),
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Creates a react-query mutation
|
|
454
|
+
*
|
|
455
|
+
* @private
|
|
456
|
+
*
|
|
457
|
+
* @param model The name of the model under mutation.
|
|
458
|
+
* @param method The HTTP method.
|
|
459
|
+
* @param operation The mutation operation (e.g. `create`).
|
|
460
|
+
* @param options The react-query options.
|
|
461
|
+
* @param checkReadBack Whether to check for read back errors and return undefined if found.
|
|
462
|
+
*/
|
|
463
|
+
export function useInternalMutation<
|
|
464
|
+
TArgs,
|
|
465
|
+
R = any,
|
|
466
|
+
C extends boolean = boolean,
|
|
467
|
+
Result = C extends true ? R | undefined : R,
|
|
468
|
+
>(
|
|
469
|
+
schema: SchemaDef,
|
|
470
|
+
model: string,
|
|
471
|
+
method: 'POST' | 'PUT' | 'DELETE',
|
|
472
|
+
operation: string,
|
|
473
|
+
options?: Omit<UseMutationOptions<Result, DefaultError, TArgs>, 'mutationFn'> & ExtraMutationOptions,
|
|
474
|
+
checkReadBack?: C,
|
|
475
|
+
) {
|
|
476
|
+
const { endpoint, fetch } = useHooksContext();
|
|
477
|
+
const queryClient = useQueryClient();
|
|
478
|
+
const mutationFn = (data: any) => {
|
|
479
|
+
const reqUrl =
|
|
480
|
+
method === 'DELETE' ? makeUrl(endpoint, model, operation, data) : makeUrl(endpoint, model, operation);
|
|
481
|
+
const fetchInit: RequestInit = {
|
|
482
|
+
method,
|
|
483
|
+
...(method !== 'DELETE' && {
|
|
484
|
+
headers: {
|
|
485
|
+
'content-type': 'application/json',
|
|
486
|
+
},
|
|
487
|
+
body: marshal(data),
|
|
488
|
+
}),
|
|
489
|
+
};
|
|
490
|
+
return fetcher<R, C>(reqUrl, fetchInit, fetch, checkReadBack) as Promise<Result>;
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
const finalOptions = { ...options, mutationFn };
|
|
494
|
+
const invalidateQueries = options?.invalidateQueries !== false;
|
|
495
|
+
const optimisticUpdate = !!options?.optimisticUpdate;
|
|
496
|
+
const { logging } = useContext(QuerySettingsContext);
|
|
497
|
+
|
|
498
|
+
if (operation) {
|
|
499
|
+
if (invalidateQueries) {
|
|
500
|
+
setupInvalidation(
|
|
501
|
+
model,
|
|
502
|
+
operation,
|
|
503
|
+
schema,
|
|
504
|
+
finalOptions,
|
|
505
|
+
(predicate) => queryClient.invalidateQueries({ predicate }),
|
|
506
|
+
logging,
|
|
507
|
+
);
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
if (optimisticUpdate) {
|
|
511
|
+
setupOptimisticUpdate(
|
|
512
|
+
model,
|
|
513
|
+
operation,
|
|
514
|
+
schema,
|
|
515
|
+
finalOptions,
|
|
516
|
+
queryClient.getQueryCache().getAll(),
|
|
517
|
+
(queryKey, data) => {
|
|
518
|
+
// update query cache
|
|
519
|
+
queryClient.setQueryData<unknown>(queryKey, data);
|
|
520
|
+
// cancel on-flight queries to avoid redundant cache updates,
|
|
521
|
+
// the settlement of the current mutation will trigger a new revalidation
|
|
522
|
+
queryClient.cancelQueries({ queryKey }, { revert: false, silent: true });
|
|
523
|
+
},
|
|
524
|
+
invalidateQueries ? (predicate) => queryClient.invalidateQueries({ predicate }) : undefined,
|
|
525
|
+
logging,
|
|
526
|
+
);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
return useMutation(finalOptions);
|
|
531
|
+
}
|