Skip to content

Commit 785eae6

Browse files
authored
feat: generate input types (#94)
* feat: generate input types * adopting cr comments
1 parent a84a1ca commit 785eae6

File tree

8 files changed

+330
-94
lines changed

8 files changed

+330
-94
lines changed

TODO.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
- [x] Custom table name
7373
- [x] Custom field name
7474
- [ ] Strict undefined checks
75+
- [ ] DbNull vs JsonNull
7576
- [ ] Benchmark
7677
- [ ] Plugin
7778
- [ ] Post-mutation hooks should be called after transaction is committed

packages/runtime/src/client/crud-types.ts

Lines changed: 56 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import type {
3030
NullableIf,
3131
Optional,
3232
OrArray,
33+
Simplify,
3334
ValueOfPotentialTuple,
3435
WrapType,
3536
XOR,
@@ -157,6 +158,14 @@ export type ModelResult<
157158
Array
158159
>;
159160

161+
export type SimplifiedModelResult<
162+
Schema extends SchemaDef,
163+
Model extends GetModels<Schema>,
164+
Args extends SelectIncludeOmit<Schema, Model, boolean>,
165+
Optional = false,
166+
Array = false,
167+
> = Simplify<ModelResult<Schema, Model, Args, Optional, Array>>;
168+
160169
export type BatchResult = { count: number };
161170

162171
//#endregion
@@ -215,11 +224,13 @@ type PrimitiveFilter<T extends string, Nullable extends boolean> = T extends 'St
215224
? BooleanFilter<Nullable>
216225
: T extends 'DateTime'
217226
? DateTimeFilter<Nullable>
218-
: T extends 'Json'
219-
? 'Not implemented yet' // TODO: Json filter
220-
: never;
227+
: T extends 'Bytes'
228+
? BytesFilter<Nullable>
229+
: T extends 'Json'
230+
? 'Not implemented yet' // TODO: Json filter
231+
: never;
221232

222-
export type CommonPrimitiveFilter<DataType, T extends BuiltinType, Nullable extends boolean> = {
233+
type CommonPrimitiveFilter<DataType, T extends BuiltinType, Nullable extends boolean> = {
223234
equals?: NullableIf<DataType, Nullable>;
224235
in?: DataType[];
225236
notIn?: DataType[];
@@ -255,6 +266,7 @@ export type BytesFilter<Nullable extends boolean> =
255266
notIn?: Uint8Array[];
256267
not?: BytesFilter<Nullable>;
257268
};
269+
258270
export type BooleanFilter<Nullable extends boolean> =
259271
| NullableIf<boolean, Nullable>
260272
| {
@@ -321,14 +333,14 @@ export type WhereUniqueInput<Schema extends SchemaDef, Model extends GetModels<S
321333
Extract<keyof GetModel<Schema, Model>['uniqueFields'], string>
322334
>;
323335

324-
type OmitFields<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
336+
export type OmitInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
325337
[Key in NonRelationFields<Schema, Model>]?: true;
326338
};
327339

328340
export type SelectIncludeOmit<Schema extends SchemaDef, Model extends GetModels<Schema>, AllowCount extends boolean> = {
329-
select?: Select<Schema, Model, AllowCount, boolean>;
330-
include?: Include<Schema, Model>;
331-
omit?: OmitFields<Schema, Model>;
341+
select?: SelectInput<Schema, Model, AllowCount, boolean>;
342+
include?: IncludeInput<Schema, Model>;
343+
omit?: OmitInput<Schema, Model>;
332344
};
333345

334346
type Distinct<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
@@ -339,14 +351,14 @@ type Cursor<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
339351
cursor?: WhereUniqueInput<Schema, Model>;
340352
};
341353

342-
type Select<
354+
export type SelectInput<
343355
Schema extends SchemaDef,
344356
Model extends GetModels<Schema>,
345-
AllowCount extends boolean,
357+
AllowCount extends boolean = true,
346358
AllowRelation extends boolean = true,
347359
> = {
348360
[Key in NonRelationFields<Schema, Model>]?: true;
349-
} & (AllowRelation extends true ? Include<Schema, Model> : {}) & // relation fields
361+
} & (AllowRelation extends true ? IncludeInput<Schema, Model> : {}) & // relation fields
350362
// relation count
351363
(AllowCount extends true ? { _count?: SelectCount<Schema, Model> } : {});
352364

@@ -362,7 +374,7 @@ type SelectCount<Schema extends SchemaDef, Model extends GetModels<Schema>> =
362374
};
363375
};
364376

365-
type Include<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
377+
export type IncludeInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
366378
[Key in RelationFields<Schema, Model>]?:
367379
| boolean
368380
| FindArgs<
@@ -431,7 +443,7 @@ type RelationFilter<
431443

432444
//#region Field utils
433445

434-
export type MapFieldType<
446+
type MapFieldType<
435447
Schema extends SchemaDef,
436448
Model extends GetModels<Schema>,
437449
Field extends GetFields<Schema, Model>,
@@ -443,7 +455,7 @@ type MapFieldDefType<Schema extends SchemaDef, T extends Pick<FieldDef, 'type' |
443455
T['array']
444456
>;
445457

446-
export type OptionalFieldsForCreate<Schema extends SchemaDef, Model extends GetModels<Schema>> = keyof {
458+
type OptionalFieldsForCreate<Schema extends SchemaDef, Model extends GetModels<Schema>> = keyof {
447459
[Key in GetFields<Schema, Model> as FieldIsOptional<Schema, Model, Key> extends true
448460
? Key
449461
: FieldHasDefault<Schema, Model, Key> extends true
@@ -475,14 +487,14 @@ type OppositeRelation<
475487
: never
476488
: never;
477489

478-
export type OppositeRelationFields<
490+
type OppositeRelationFields<
479491
Schema extends SchemaDef,
480492
Model extends GetModels<Schema>,
481493
Field extends GetFields<Schema, Model>,
482494
Opposite = OppositeRelation<Schema, Model, Field>,
483495
> = Opposite extends RelationInfo ? (Opposite['fields'] extends string[] ? Opposite['fields'] : []) : [];
484496

485-
export type OppositeRelationAndFK<
497+
type OppositeRelationAndFK<
486498
Schema extends SchemaDef,
487499
Model extends GetModels<Schema>,
488500
Field extends GetFields<Schema, Model>,
@@ -521,6 +533,9 @@ export type FindArgs<
521533
Distinct<Schema, Model> &
522534
Cursor<Schema, Model>;
523535

536+
export type FindManyArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = FindArgs<Schema, Model, true>;
537+
export type FindFirstArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = FindArgs<Schema, Model, false>;
538+
524539
export type FindUniqueArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
525540
where?: WhereUniqueInput<Schema, Model>;
526541
} & SelectIncludeOmit<Schema, Model, true>;
@@ -531,9 +546,9 @@ export type FindUniqueArgs<Schema extends SchemaDef, Model extends GetModels<Sch
531546

532547
export type CreateArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
533548
data: CreateInput<Schema, Model>;
534-
select?: Select<Schema, Model, true>;
535-
include?: Include<Schema, Model>;
536-
omit?: OmitFields<Schema, Model>;
549+
select?: SelectInput<Schema, Model, true>;
550+
include?: IncludeInput<Schema, Model>;
551+
omit?: OmitInput<Schema, Model>;
537552
};
538553

539554
export type CreateManyArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = CreateManyInput<Schema, Model>;
@@ -542,8 +557,8 @@ export type CreateManyAndReturnArgs<Schema extends SchemaDef, Model extends GetM
542557
Schema,
543558
Model
544559
> & {
545-
select?: Select<Schema, Model, false, false>;
546-
omit?: OmitFields<Schema, Model>;
560+
select?: SelectInput<Schema, Model, false, false>;
561+
omit?: OmitInput<Schema, Model>;
547562
};
548563

549564
type OptionalWrap<Schema extends SchemaDef, Model extends GetModels<Schema>, T extends object> = Optional<
@@ -633,20 +648,15 @@ type ConnectOrCreatePayload<
633648
create: CreateInput<Schema, Model, Without>;
634649
};
635650

636-
export type CreateManyInput<
637-
Schema extends SchemaDef,
638-
Model extends GetModels<Schema>,
639-
Without extends string = never,
640-
> = {
651+
type CreateManyInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Without extends string = never> = {
641652
data: OrArray<Omit<CreateScalarPayload<Schema, Model>, Without> & Omit<CreateFKPayload<Schema, Model>, Without>>;
642653
skipDuplicates?: boolean;
643654
};
644655

645-
export type CreateInput<
646-
Schema extends SchemaDef,
647-
Model extends GetModels<Schema>,
648-
Without extends string = never,
649-
> = XOR<Omit<CreateWithFKInput<Schema, Model>, Without>, Omit<CreateWithRelationInput<Schema, Model>, Without>>;
656+
type CreateInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Without extends string = never> = XOR<
657+
Omit<CreateWithFKInput<Schema, Model>, Without>,
658+
Omit<CreateWithRelationInput<Schema, Model>, Without>
659+
>;
650660

651661
type NestedCreateInput<
652662
Schema extends SchemaDef,
@@ -670,9 +680,9 @@ type NestedCreateManyInput<
670680
export type UpdateArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
671681
data: UpdateInput<Schema, Model>;
672682
where: WhereUniqueInput<Schema, Model>;
673-
select?: Select<Schema, Model, true>;
674-
include?: Include<Schema, Model>;
675-
omit?: OmitFields<Schema, Model>;
683+
select?: SelectInput<Schema, Model, true>;
684+
include?: IncludeInput<Schema, Model>;
685+
omit?: OmitInput<Schema, Model>;
676686
};
677687

678688
export type UpdateManyArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = UpdateManyPayload<
@@ -684,8 +694,8 @@ export type UpdateManyAndReturnArgs<Schema extends SchemaDef, Model extends GetM
684694
Schema,
685695
Model
686696
> & {
687-
select?: Select<Schema, Model, false, false>;
688-
omit?: OmitFields<Schema, Model>;
697+
select?: SelectInput<Schema, Model, false, false>;
698+
omit?: OmitInput<Schema, Model>;
689699
};
690700

691701
type UpdateManyPayload<Schema extends SchemaDef, Model extends GetModels<Schema>, Without extends string = never> = {
@@ -698,12 +708,12 @@ export type UpsertArgs<Schema extends SchemaDef, Model extends GetModels<Schema>
698708
create: CreateInput<Schema, Model>;
699709
update: UpdateInput<Schema, Model>;
700710
where: WhereUniqueInput<Schema, Model>;
701-
select?: Select<Schema, Model, true>;
702-
include?: Include<Schema, Model>;
703-
omit?: OmitFields<Schema, Model>;
711+
select?: SelectInput<Schema, Model, true>;
712+
include?: IncludeInput<Schema, Model>;
713+
omit?: OmitInput<Schema, Model>;
704714
};
705715

706-
export type UpdateScalarInput<
716+
type UpdateScalarInput<
707717
Schema extends SchemaDef,
708718
Model extends GetModels<Schema>,
709719
Without extends string = never,
@@ -736,7 +746,7 @@ type ScalarUpdatePayload<
736746
}
737747
: never);
738748

739-
export type UpdateRelationInput<
749+
type UpdateRelationInput<
740750
Schema extends SchemaDef,
741751
Model extends GetModels<Schema>,
742752
Without extends string = never,
@@ -747,7 +757,7 @@ export type UpdateRelationInput<
747757
Without
748758
>;
749759

750-
export type UpdateInput<
760+
type UpdateInput<
751761
Schema extends SchemaDef,
752762
Model extends GetModels<Schema>,
753763
Without extends string = never,
@@ -803,9 +813,9 @@ type ToOneRelationUpdateInput<
803813

804814
export type DeleteArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
805815
where: WhereUniqueInput<Schema, Model>;
806-
select?: Select<Schema, Model, true>;
807-
include?: Include<Schema, Model>;
808-
omit?: OmitFields<Schema, Model>;
816+
select?: SelectInput<Schema, Model, true>;
817+
include?: IncludeInput<Schema, Model>;
818+
omit?: OmitInput<Schema, Model>;
809819
};
810820

811821
export type DeleteManyArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
@@ -824,7 +834,7 @@ export type CountArgs<Schema extends SchemaDef, Model extends GetModels<Schema>>
824834
select?: CountAggregateInput<Schema, Model> | true;
825835
};
826836

827-
export type CountAggregateInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
837+
type CountAggregateInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
828838
[Key in NonRelationFields<Schema, Model>]?: true;
829839
} & { _all?: true };
830840

packages/runtime/src/client/crud/operations/base.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -181,17 +181,18 @@ export abstract class BaseOperationHandler<Schema extends SchemaDef> {
181181
}
182182

183183
// select
184-
if (args?.select) {
184+
if (args && 'select' in args && args.select) {
185185
// select is mutually exclusive with omit
186-
query = this.buildFieldSelection(model, query, args?.select, model);
186+
query = this.buildFieldSelection(model, query, args.select, model);
187187
} else {
188188
// include all scalar fields except those in omit
189-
query = this.buildSelectAllScalarFields(model, query, args?.omit);
189+
query = this.buildSelectAllScalarFields(model, query, (args as any)?.omit);
190190
}
191191

192192
// include
193-
if (args?.include) {
194-
query = this.buildFieldSelection(model, query, args?.include, model);
193+
if (args && 'include' in args && args.include) {
194+
// note that 'omit' is handled above already
195+
query = this.buildFieldSelection(model, query, args.include, model);
195196
}
196197

197198
if (args?.cursor) {
@@ -1878,7 +1879,7 @@ export abstract class BaseOperationHandler<Schema extends SchemaDef> {
18781879
}
18791880

18801881
protected trimResult(data: any, args: SelectIncludeOmit<Schema, GetModels<Schema>, boolean>) {
1881-
if (!args.select) {
1882+
if (!('select' in args) || !args.select) {
18821883
return data;
18831884
}
18841885
return Object.keys(args.select).reduce((acc, field) => {
@@ -1890,9 +1891,9 @@ export abstract class BaseOperationHandler<Schema extends SchemaDef> {
18901891
protected needReturnRelations(model: string, args: SelectIncludeOmit<Schema, GetModels<Schema>, boolean>) {
18911892
let returnRelation = false;
18921893

1893-
if (args.include) {
1894+
if ('include' in args && args.include) {
18941895
returnRelation = Object.keys(args.include).length > 0;
1895-
} else if (args.select) {
1896+
} else if ('select' in args && args.select) {
18961897
returnRelation = Object.entries(args.select).some(([K, v]) => {
18971898
const fieldDef = this.requireField(model, K);
18981899
return fieldDef.relation && v;

packages/runtime/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export * from './client';
2+
export type { JsonArray, JsonObject, JsonValue } from './utils/type-utils';

packages/runtime/src/utils/type-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export type NullableIf<T, Condition extends boolean> = Condition extends true ?
66

77
export type PartialRecord<K extends string | number | symbol, T> = Partial<Record<K, T>>;
88

9-
type _Preserve = Date | Function | Decimal | Uint8Array;
9+
type _Preserve = Date | Function | Decimal | Uint8Array | JsonObject | JsonValue;
1010
type _Depth = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
1111
export type Simplify<T, D extends number = 6> = D extends 0
1212
? T

0 commit comments

Comments
 (0)