Skip to content

Commit da3b0af

Browse files
authored
feat: ORM api slicing (#2383)
1 parent f0278ca commit da3b0af

32 files changed

+4332
-972
lines changed

packages/auth-adapters/better-auth/src/adapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ export const zenstackAdapter = <Schema extends SchemaDef>(db: ClientContract<Sch
171171
const whereClause = convertWhereClause(model, where);
172172
return await modelDb.update({
173173
where: whereClause,
174-
data: update as UpdateInput<SchemaDef, GetModels<SchemaDef>>,
174+
data: update as UpdateInput<SchemaDef, GetModels<SchemaDef>, any>,
175175
});
176176
},
177177

packages/clients/tanstack-query/src/common/types.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
import type { Logger, OptimisticDataProvider } from '@zenstackhq/client-helpers';
22
import type { FetchFn } from '@zenstackhq/client-helpers/fetch';
3-
import type { GetProcedureNames, OperationsIneligibleForDelegateModels, ProcedureFunc } from '@zenstackhq/orm';
3+
import type {
4+
GetProcedureNames,
5+
GetSlicedOperations,
6+
OperationsIneligibleForDelegateModels,
7+
ProcedureFunc,
8+
QueryOptions,
9+
} from '@zenstackhq/orm';
410
import type { GetModels, IsDelegateModel, SchemaDef } from '@zenstackhq/schema';
511

612
/**
@@ -57,14 +63,27 @@ type HooksOperationsIneligibleForDelegateModels = OperationsIneligibleForDelegat
5763
? `use${Capitalize<OperationsIneligibleForDelegateModels>}`
5864
: never;
5965

66+
type Modifiers = '' | 'Suspense' | 'Infinite' | 'SuspenseInfinite';
67+
6068
/**
61-
* Trim operations that are ineligible for delegate models from the given model operations type.
69+
* Trim CRUD operation hooks to include only eligible operations.
6270
*/
63-
export type TrimDelegateModelOperations<
71+
export type TrimSlicedOperations<
6472
Schema extends SchemaDef,
6573
Model extends GetModels<Schema>,
74+
Options extends QueryOptions<Schema>,
6675
T extends Record<string, unknown>,
67-
> = IsDelegateModel<Schema, Model> extends true ? Omit<T, HooksOperationsIneligibleForDelegateModels> : T;
76+
> = {
77+
// trim operations based on slicing options
78+
[Key in keyof T as Key extends `use${Modifiers}${Capitalize<GetSlicedOperations<Schema, Model, Options>>}`
79+
? IsDelegateModel<Schema, Model> extends true
80+
? // trim operations ineligible for delegate models
81+
Key extends HooksOperationsIneligibleForDelegateModels
82+
? never
83+
: Key
84+
: Key
85+
: never]: T[Key];
86+
};
6887

6988
type WithOptimisticFlag<T> = T extends object
7089
? T & {

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

Lines changed: 56 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import type {
3939
FindUniqueArgs,
4040
GetProcedure,
4141
GetProcedureNames,
42+
GetSlicedModels,
43+
GetSlicedProcedures,
4244
GroupByArgs,
4345
GroupByResult,
4446
ProcedureEnvelope,
@@ -62,7 +64,7 @@ import type {
6264
ExtraQueryOptions,
6365
ProcedureReturn,
6466
QueryContext,
65-
TrimDelegateModelOperations,
67+
TrimSlicedOperations,
6668
WithOptimistic,
6769
} from './common/types.js';
6870
export type { FetchFn } from '@zenstackhq/client-helpers/fetch';
@@ -148,11 +150,11 @@ export type ModelMutationModelResult<
148150
};
149151

150152
export type ClientHooks<Schema extends SchemaDef, Options extends QueryOptions<Schema> = QueryOptions<Schema>> = {
151-
[Model in GetModels<Schema> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model, Options>;
152-
} & ProcedureHooks<Schema>;
153+
[Model in GetSlicedModels<Schema, Options> as `${Uncapitalize<Model>}`]: ModelQueryHooks<Schema, Model, Options>;
154+
} & ProcedureHooks<Schema, Options>;
153155

154-
type ProcedureHookGroup<Schema extends SchemaDef> = {
155-
[Name in GetProcedureNames<Schema>]: GetProcedure<Schema, Name> extends { mutation: true }
156+
type ProcedureHookGroup<Schema extends SchemaDef, Options extends QueryOptions<Schema>> = {
157+
[Name in GetSlicedProcedures<Schema, Options>]: GetProcedure<Schema, Name> extends { mutation: true }
156158
? {
157159
useMutation(
158160
options?: Omit<
@@ -195,133 +197,135 @@ type ProcedureHookGroup<Schema extends SchemaDef> = {
195197
};
196198
};
197199

198-
export type ProcedureHooks<Schema extends SchemaDef> = Schema['procedures'] extends Record<string, any>
199-
? {
200-
/**
201-
* Custom procedures.
202-
*/
203-
$procs: ProcedureHookGroup<Schema>;
204-
}
205-
: Record<never, never>;
200+
export type ProcedureHooks<Schema extends SchemaDef, Options extends QueryOptions<Schema>> =
201+
Schema['procedures'] extends Record<string, any>
202+
? {
203+
/**
204+
* Custom procedures.
205+
*/
206+
$procs: ProcedureHookGroup<Schema, Options>;
207+
}
208+
: Record<never, never>;
206209

207210
// Note that we can potentially use TypeScript's mapped type to directly map from ORM contract, but that seems
208211
// to significantly slow down tsc performance ...
209212
export type ModelQueryHooks<
210213
Schema extends SchemaDef,
211214
Model extends GetModels<Schema>,
212215
Options extends QueryOptions<Schema> = QueryOptions<Schema>,
213-
> = TrimDelegateModelOperations<
216+
> = TrimSlicedOperations<
214217
Schema,
215218
Model,
219+
Options,
216220
{
217-
useFindUnique<T extends FindUniqueArgs<Schema, Model>>(
218-
args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
221+
useFindUnique<T extends FindUniqueArgs<Schema, Model, Options>>(
222+
args: SelectSubset<T, FindUniqueArgs<Schema, Model, Options>>,
219223
options?: ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options> | null>,
220224
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options> | null>;
221225

222-
useSuspenseFindUnique<T extends FindUniqueArgs<Schema, Model>>(
223-
args: SelectSubset<T, FindUniqueArgs<Schema, Model>>,
226+
useSuspenseFindUnique<T extends FindUniqueArgs<Schema, Model, Options>>(
227+
args: SelectSubset<T, FindUniqueArgs<Schema, Model, Options>>,
224228
options?: ModelSuspenseQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options> | null>,
225229
): ModelSuspenseQueryResult<SimplifiedPlainResult<Schema, Model, T, Options> | null>;
226230

227-
useFindFirst<T extends FindFirstArgs<Schema, Model>>(
228-
args?: SelectSubset<T, FindFirstArgs<Schema, Model>>,
231+
useFindFirst<T extends FindFirstArgs<Schema, Model, Options>>(
232+
args?: SelectSubset<T, FindFirstArgs<Schema, Model, Options>>,
229233
options?: ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options> | null>,
230234
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options> | null>;
231235

232-
useSuspenseFindFirst<T extends FindFirstArgs<Schema, Model>>(
233-
args?: SelectSubset<T, FindFirstArgs<Schema, Model>>,
236+
useSuspenseFindFirst<T extends FindFirstArgs<Schema, Model, Options>>(
237+
args?: SelectSubset<T, FindFirstArgs<Schema, Model, Options>>,
234238
options?: ModelSuspenseQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options> | null>,
235239
): ModelSuspenseQueryResult<SimplifiedPlainResult<Schema, Model, T, Options> | null>;
236240

237-
useExists<T extends ExistsArgs<Schema, Model>>(
238-
args?: Subset<T, ExistsArgs<Schema, Model>>,
241+
useExists<T extends ExistsArgs<Schema, Model, Options>>(
242+
args?: Subset<T, ExistsArgs<Schema, Model, Options>>,
239243
options?: ModelQueryOptions<boolean>,
240244
): ModelQueryResult<boolean>;
241245

242-
useFindMany<T extends FindManyArgs<Schema, Model>>(
243-
args?: SelectSubset<T, FindManyArgs<Schema, Model>>,
246+
useFindMany<T extends FindManyArgs<Schema, Model, Options>>(
247+
args?: SelectSubset<T, FindManyArgs<Schema, Model, Options>>,
244248
options?: ModelQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options>[]>,
245249
): ModelQueryResult<SimplifiedPlainResult<Schema, Model, T, Options>[]>;
246250

247-
useSuspenseFindMany<T extends FindManyArgs<Schema, Model>>(
248-
args?: SelectSubset<T, FindManyArgs<Schema, Model>>,
251+
useSuspenseFindMany<T extends FindManyArgs<Schema, Model, Options>>(
252+
args?: SelectSubset<T, FindManyArgs<Schema, Model, Options>>,
249253
options?: ModelSuspenseQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options>[]>,
250254
): ModelSuspenseQueryResult<SimplifiedPlainResult<Schema, Model, T, Options>[]>;
251255

252-
useInfiniteFindMany<T extends FindManyArgs<Schema, Model>>(
253-
args?: SelectSubset<T, FindManyArgs<Schema, Model>>,
256+
useInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options>>(
257+
args?: SelectSubset<T, FindManyArgs<Schema, Model, Options>>,
254258
options?: ModelInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options>[]>,
255259
): ModelInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options>[]>>;
256260

257-
useSuspenseInfiniteFindMany<T extends FindManyArgs<Schema, Model>>(
258-
args?: SelectSubset<T, FindManyArgs<Schema, Model>>,
261+
useSuspenseInfiniteFindMany<T extends FindManyArgs<Schema, Model, Options>>(
262+
args?: SelectSubset<T, FindManyArgs<Schema, Model, Options>>,
259263
options?: ModelSuspenseInfiniteQueryOptions<SimplifiedPlainResult<Schema, Model, T, Options>[]>,
260264
): ModelSuspenseInfiniteQueryResult<InfiniteData<SimplifiedPlainResult<Schema, Model, T, Options>[]>>;
261265

262-
useCreate<T extends CreateArgs<Schema, Model>>(
266+
useCreate<T extends CreateArgs<Schema, Model, Options>>(
263267
options?: ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>, T>,
264268
): ModelMutationModelResult<Schema, Model, T, false, Options>;
265269

266270
useCreateMany<T extends CreateManyArgs<Schema, Model>>(
267271
options?: ModelMutationOptions<BatchResult, T>,
268272
): ModelMutationResult<BatchResult, T>;
269273

270-
useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(
274+
useCreateManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model, Options>>(
271275
options?: ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>[], T>,
272276
): ModelMutationModelResult<Schema, Model, T, true, Options>;
273277

274-
useUpdate<T extends UpdateArgs<Schema, Model>>(
278+
useUpdate<T extends UpdateArgs<Schema, Model, Options>>(
275279
options?: ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>, T>,
276280
): ModelMutationModelResult<Schema, Model, T, false, Options>;
277281

278-
useUpdateMany<T extends UpdateManyArgs<Schema, Model>>(
282+
useUpdateMany<T extends UpdateManyArgs<Schema, Model, Options>>(
279283
options?: ModelMutationOptions<BatchResult, T>,
280284
): ModelMutationResult<BatchResult, T>;
281285

282-
useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(
286+
useUpdateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model, Options>>(
283287
options?: ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>[], T>,
284288
): ModelMutationModelResult<Schema, Model, T, true, Options>;
285289

286-
useUpsert<T extends UpsertArgs<Schema, Model>>(
290+
useUpsert<T extends UpsertArgs<Schema, Model, Options>>(
287291
options?: ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>, T>,
288292
): ModelMutationModelResult<Schema, Model, T, false, Options>;
289293

290-
useDelete<T extends DeleteArgs<Schema, Model>>(
294+
useDelete<T extends DeleteArgs<Schema, Model, Options>>(
291295
options?: ModelMutationOptions<SimplifiedPlainResult<Schema, Model, T, Options>, T>,
292296
): ModelMutationModelResult<Schema, Model, T, false, Options>;
293297

294-
useDeleteMany<T extends DeleteManyArgs<Schema, Model>>(
298+
useDeleteMany<T extends DeleteManyArgs<Schema, Model, Options>>(
295299
options?: ModelMutationOptions<BatchResult, T>,
296300
): ModelMutationResult<BatchResult, T>;
297301

298-
useCount<T extends CountArgs<Schema, Model>>(
299-
args?: Subset<T, CountArgs<Schema, Model>>,
302+
useCount<T extends CountArgs<Schema, Model, Options>>(
303+
args?: Subset<T, CountArgs<Schema, Model, Options>>,
300304
options?: ModelQueryOptions<CountResult<Schema, Model, T>>,
301305
): ModelQueryResult<CountResult<Schema, Model, T>>;
302306

303-
useSuspenseCount<T extends CountArgs<Schema, Model>>(
304-
args?: Subset<T, CountArgs<Schema, Model>>,
307+
useSuspenseCount<T extends CountArgs<Schema, Model, Options>>(
308+
args?: Subset<T, CountArgs<Schema, Model, Options>>,
305309
options?: ModelSuspenseQueryOptions<CountResult<Schema, Model, T>>,
306310
): ModelSuspenseQueryResult<CountResult<Schema, Model, T>>;
307311

308-
useAggregate<T extends AggregateArgs<Schema, Model>>(
309-
args: Subset<T, AggregateArgs<Schema, Model>>,
312+
useAggregate<T extends AggregateArgs<Schema, Model, Options>>(
313+
args: Subset<T, AggregateArgs<Schema, Model, Options>>,
310314
options?: ModelQueryOptions<AggregateResult<Schema, Model, T>>,
311315
): ModelQueryResult<AggregateResult<Schema, Model, T>>;
312316

313-
useSuspenseAggregate<T extends AggregateArgs<Schema, Model>>(
314-
args: Subset<T, AggregateArgs<Schema, Model>>,
317+
useSuspenseAggregate<T extends AggregateArgs<Schema, Model, Options>>(
318+
args: Subset<T, AggregateArgs<Schema, Model, Options>>,
315319
options?: ModelSuspenseQueryOptions<AggregateResult<Schema, Model, T>>,
316320
): ModelSuspenseQueryResult<AggregateResult<Schema, Model, T>>;
317321

318-
useGroupBy<T extends GroupByArgs<Schema, Model>>(
319-
args: Subset<T, GroupByArgs<Schema, Model>>,
322+
useGroupBy<T extends GroupByArgs<Schema, Model, Options>>(
323+
args: Subset<T, GroupByArgs<Schema, Model, Options>>,
320324
options?: ModelQueryOptions<GroupByResult<Schema, Model, T>>,
321325
): ModelQueryResult<GroupByResult<Schema, Model, T>>;
322326

323-
useSuspenseGroupBy<T extends GroupByArgs<Schema, Model>>(
324-
args: Subset<T, GroupByArgs<Schema, Model>>,
327+
useSuspenseGroupBy<T extends GroupByArgs<Schema, Model, Options>>(
328+
args: Subset<T, GroupByArgs<Schema, Model, Options>>,
325329
options?: ModelSuspenseQueryOptions<GroupByResult<Schema, Model, T>>,
326330
): ModelSuspenseQueryResult<GroupByResult<Schema, Model, T>>;
327331
}

0 commit comments

Comments
 (0)