@zenstackhq/runtime 3.0.0-alpha.9 → 3.0.0-beta.2

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.
@@ -1,11 +1,27 @@
1
1
  import Decimal, { Decimal as Decimal$1 } from 'decimal.js';
2
- import { SchemaDef, GetModels, ScalarFields, ForeignKeyFields, GetFields, FieldHasDefault, GetFieldType, FieldIsOptional, NonRelationFields, RelationFields, FieldIsArray, RelationFieldType, GetField, FieldIsRelation, GetEnums, GetEnum, BuiltinType, GetModel, FieldDef, FieldIsRelationArray, FieldType, RelationInfo, DataSourceProviderType, DataSourceProvider, ProcedureDef } from '@zenstackhq/sdk/schema';
3
- import { Generated, Kysely, ExpressionBuilder, OperandExpression, SqlBool, SelectQueryBuilder, Expression, ExpressionWrapper, RootOperationNode, QueryResult, UnknownRow, OperationNode, SqliteDialectConfig, PostgresDialectConfig, KyselyConfig } from 'kysely';
2
+ import { SchemaDef, GetModels, ScalarFields, ForeignKeyFields, GetModelFields, FieldHasDefault, GetModelFieldType, ModelFieldIsOptional, GetModelField, NonRelationFields, RelationFields, FieldIsArray, RelationFieldType, FieldIsRelation, GetModel, FieldDef, GetEnums, GetEnum, GetTypeDefs, GetTypeDefFields, GetTypeDefField, TypeDefFieldIsOptional, BuiltinType, IsDelegateModel, GetModelDiscriminator, GetSubModels, FieldIsDelegateDiscriminator, FieldType, RelationInfo, FieldIsDelegateRelation, ModelDef, DataSourceProviderType, ProcedureDef } from '@zenstackhq/sdk/schema';
3
+ import { Generated, Kysely, ExpressionBuilder, OperandExpression, SqlBool, SelectQueryBuilder, Expression, ExpressionWrapper, OperationNode, RootOperationNode, QueryResult, UnknownRow, Dialect, KyselyConfig } from 'kysely';
4
4
 
5
5
  type Optional<T extends object, K extends keyof T = keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
6
6
  type NullableIf<T, Condition extends boolean> = Condition extends true ? T | null : T;
7
+ type _Preserve = Date | Function | Decimal | Uint8Array | JsonObject | JsonValue;
8
+ type _Depth = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
9
+ type Simplify<T, D extends number = 6> = D extends 0 ? T : T extends object ? T extends _Preserve ? T : {
10
+ [K in keyof T]: Simplify<T[K], _Depth[D]>;
11
+ } & {} : T;
7
12
  type WrapType<T, Optional = false, Array = false> = Optional extends true ? T | null : Array extends true ? T[] : T;
8
- type MapBaseType$1<T> = T extends 'String' ? string : T extends 'Boolean' ? boolean : T extends 'Int' | 'Float' ? number : T extends 'BigInt' ? bigint : T extends 'Decimal' ? Decimal : T extends 'DateTime' ? Date : T extends 'Json' ? JsonValue : unknown;
13
+ type TypeMap = {
14
+ String: string;
15
+ Boolean: boolean;
16
+ Int: number;
17
+ Float: number;
18
+ BigInt: bigint;
19
+ Decimal: Decimal;
20
+ DateTime: Date;
21
+ Bytes: Uint8Array;
22
+ Json: JsonValue;
23
+ };
24
+ type MapBaseType$1<T extends string> = T extends keyof TypeMap ? TypeMap[T] : unknown;
9
25
  type JsonValue = string | number | boolean | null | JsonObject | JsonArray;
10
26
  type JsonObject = {
11
27
  [key: string]: JsonValue;
@@ -36,18 +52,21 @@ type ToKyselySchema<Schema extends SchemaDef> = {
36
52
  };
37
53
  type ToKysely<Schema extends SchemaDef> = Kysely<ToKyselySchema<Schema>>;
38
54
  type ToKyselyTable<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
39
- [Field in ScalarFields<Schema, Model, false> | ForeignKeyFields<Schema, Model>]: toKyselyFieldType<Schema, Model, Field>;
55
+ [Field in ScalarFields<Schema, Model, false> | ForeignKeyFields<Schema, Model> as GetModelField<Schema, Model, Field>['originModel'] extends string ? never : Field]: toKyselyFieldType<Schema, Model, Field>;
40
56
  };
41
57
  type MapBaseType<T> = T extends 'String' ? string : T extends 'Boolean' ? boolean : T extends 'Int' | 'Float' ? number : T extends 'BigInt' ? bigint : T extends 'Decimal' ? Decimal : T extends 'DateTime' ? string : unknown;
42
58
  type WrapNull<T, Null> = Null extends true ? T | null : T;
43
- type MapType$1<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetFields<Schema, Model>> = WrapNull<MapBaseType<GetFieldType<Schema, Model, Field>>, FieldIsOptional<Schema, Model, Field>>;
44
- type toKyselyFieldType<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetFields<Schema, Model>> = FieldHasDefault<Schema, Model, Field> extends true ? Generated<MapType$1<Schema, Model, Field>> : MapType$1<Schema, Model, Field>;
59
+ type MapType$1<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = WrapNull<MapBaseType<GetModelFieldType<Schema, Model, Field>>, ModelFieldIsOptional<Schema, Model, Field>>;
60
+ type toKyselyFieldType<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = FieldHasDefault<Schema, Model, Field> extends true ? Generated<MapType$1<Schema, Model, Field>> : MapType$1<Schema, Model, Field>;
45
61
 
46
- type DefaultModelResult<Schema extends SchemaDef, Model extends GetModels<Schema>, Omit = undefined, Optional = false, Array = false> = WrapType<{
47
- [Key in NonRelationFields<Schema, Model> as Key extends keyof Omit ? Omit[Key] extends true ? never : Key : Key]: MapFieldType<Schema, Model, Key>;
62
+ type DefaultModelResult<Schema extends SchemaDef, Model extends GetModels<Schema>, Omit = undefined, Optional = false, Array = false> = WrapType<IsDelegateModel<Schema, Model> extends true ? DelegateUnionResult<Schema, Model, GetSubModels<Schema, Model>, Omit> : {
63
+ [Key in NonRelationFields<Schema, Model> as Key extends keyof Omit ? Omit[Key] extends true ? never : Key : Key]: MapModelFieldType<Schema, Model, Key>;
48
64
  }, Optional, Array>;
65
+ type DelegateUnionResult<Schema extends SchemaDef, Model extends GetModels<Schema>, SubModel extends GetModels<Schema>, Omit = undefined> = SubModel extends string ? DefaultModelResult<Schema, SubModel, Omit> & {
66
+ [K in GetModelDiscriminator<Schema, Model>]: SubModel;
67
+ } : never;
49
68
  type ModelSelectResult<Schema extends SchemaDef, Model extends GetModels<Schema>, Select, Omit> = {
50
- [Key in keyof Select as Select[Key] extends false | undefined ? never : Key extends keyof Omit ? Omit[Key] extends true ? never : Key : Key extends '_count' ? Select[Key] extends SelectCount<Schema, Model> ? Key : never : Key]: Key extends '_count' ? SelectCountResult<Schema, Model, Select[Key]> : Key extends NonRelationFields<Schema, Model> ? MapFieldType<Schema, Model, Key> : Key extends RelationFields<Schema, Model> ? Select[Key] extends FindArgs<Schema, RelationFieldType<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> ? ModelResult<Schema, RelationFieldType<Schema, Model, Key>, Select[Key], FieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> : DefaultModelResult<Schema, RelationFieldType<Schema, Model, Key>, Omit, FieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> : never;
69
+ [Key in keyof Select as Select[Key] extends false | undefined ? never : Key extends keyof Omit ? Omit[Key] extends true ? never : Key : Key extends '_count' ? Select[Key] extends SelectCount<Schema, Model> ? Key : never : Key]: Key extends '_count' ? SelectCountResult<Schema, Model, Select[Key]> : Key extends NonRelationFields<Schema, Model> ? MapModelFieldType<Schema, Model, Key> : Key extends RelationFields<Schema, Model> ? Select[Key] extends FindArgs<Schema, RelationFieldType<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> ? 'select' extends keyof Select[Key] ? ModelResult<Schema, RelationFieldType<Schema, Model, Key>, Pick<Select[Key], 'select'>, ModelFieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> : ModelResult<Schema, RelationFieldType<Schema, Model, Key>, Pick<Select[Key], 'include' | 'omit'>, ModelFieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> : DefaultModelResult<Schema, RelationFieldType<Schema, Model, Key>, Omit, ModelFieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> : never;
51
70
  };
52
71
  type SelectCountResult<Schema extends SchemaDef, Model extends GetModels<Schema>, C> = C extends true ? {
53
72
  [Key in RelationFields<Schema, Model> as FieldIsArray<Schema, Model, Key> extends true ? Key : never]: number;
@@ -63,15 +82,21 @@ type ModelResult<Schema extends SchemaDef, Model extends GetModels<Schema>, Args
63
82
  include: infer I;
64
83
  omit?: infer O;
65
84
  } ? DefaultModelResult<Schema, Model, O> & {
66
- [Key in keyof I & RelationFields<Schema, Model> as I[Key] extends false | undefined ? never : Key]: I[Key] extends FindArgs<Schema, RelationFieldType<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> ? ModelResult<Schema, RelationFieldType<Schema, Model, Key>, I[Key], FieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> : DefaultModelResult<Schema, RelationFieldType<Schema, Model, Key>, undefined, FieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>>;
85
+ [Key in keyof I & RelationFields<Schema, Model> as I[Key] extends false | undefined ? never : Key]: I[Key] extends FindArgs<Schema, RelationFieldType<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> ? ModelResult<Schema, RelationFieldType<Schema, Model, Key>, I[Key], ModelFieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>> : DefaultModelResult<Schema, RelationFieldType<Schema, Model, Key>, undefined, ModelFieldIsOptional<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>>;
67
86
  } : Args extends {
68
87
  omit: infer O;
69
88
  } ? DefaultModelResult<Schema, Model, O> : DefaultModelResult<Schema, Model>, Optional, Array>;
89
+ type SimplifiedModelResult<Schema extends SchemaDef, Model extends GetModels<Schema>, Args extends SelectIncludeOmit<Schema, Model, boolean> = {}, Optional = false, Array = false> = Simplify<ModelResult<Schema, Model, Args, Optional, Array>>;
90
+ type TypeDefResult<Schema extends SchemaDef, TypeDef extends GetTypeDefs<Schema>> = Optional<{
91
+ [Key in GetTypeDefFields<Schema, TypeDef>]: MapTypeDefFieldType<Schema, TypeDef, Key>;
92
+ }, keyof {
93
+ [Key in GetTypeDefFields<Schema, TypeDef> as TypeDefFieldIsOptional<Schema, TypeDef, Key> extends true ? Key : never]: true;
94
+ }>;
70
95
  type BatchResult = {
71
96
  count: number;
72
97
  };
73
- type WhereInput<Schema extends SchemaDef, Model extends GetModels<Schema>, ScalarOnly extends boolean = false> = {
74
- [Key in GetFields<Schema, Model> as ScalarOnly extends true ? Key extends RelationFields<Schema, Model> ? never : Key : Key]?: Key extends RelationFields<Schema, Model> ? RelationFilter<Schema, Model, Key> : GetFieldType<Schema, Model, Key> extends GetEnums<Schema> ? EnumFilter<Schema, GetFieldType<Schema, Model, Key>, FieldIsOptional<Schema, Model, Key>> : FieldIsArray<Schema, Model, Key> extends true ? ArrayFilter<GetFieldType<Schema, Model, Key>> : PrimitiveFilter<GetFieldType<Schema, Model, Key>, FieldIsOptional<Schema, Model, Key>>;
98
+ type WhereInput<Schema extends SchemaDef, Model extends GetModels<Schema>, ScalarOnly extends boolean = false, WithAggregations extends boolean = false> = {
99
+ [Key in GetModelFields<Schema, Model> as ScalarOnly extends true ? Key extends RelationFields<Schema, Model> ? never : Key : Key]?: Key extends RelationFields<Schema, Model> ? RelationFilter<Schema, Model, Key> : FieldIsArray<Schema, Model, Key> extends true ? ArrayFilter<Schema, GetModelFieldType<Schema, Model, Key>> : GetModelFieldType<Schema, Model, Key> extends GetEnums<Schema> ? EnumFilter<Schema, GetModelFieldType<Schema, Model, Key>, ModelFieldIsOptional<Schema, Model, Key>, WithAggregations> : PrimitiveFilter<Schema, GetModelFieldType<Schema, Model, Key>, ModelFieldIsOptional<Schema, Model, Key>, WithAggregations>;
75
100
  } & {
76
101
  $expr?: (eb: ExpressionBuilder<ToKyselySchema<Schema>, Model>) => OperandExpression<SqlBool>;
77
102
  } & {
@@ -79,21 +104,26 @@ type WhereInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Scala
79
104
  OR?: WhereInput<Schema, Model, ScalarOnly>[];
80
105
  NOT?: OrArray<WhereInput<Schema, Model, ScalarOnly>>;
81
106
  };
82
- type EnumFilter<Schema extends SchemaDef, T extends GetEnums<Schema>, Nullable extends boolean> = NullableIf<keyof GetEnum<Schema, T>, Nullable> | {
107
+ type EnumFilter<Schema extends SchemaDef, T extends GetEnums<Schema>, Nullable extends boolean, WithAggregations extends boolean> = NullableIf<keyof GetEnum<Schema, T>, Nullable> | ({
83
108
  equals?: NullableIf<keyof GetEnum<Schema, T>, Nullable>;
84
109
  in?: (keyof GetEnum<Schema, T>)[];
85
110
  notIn?: (keyof GetEnum<Schema, T>)[];
86
- not?: EnumFilter<Schema, T, Nullable>;
87
- };
88
- type ArrayFilter<T extends string> = {
89
- equals?: MapBaseType$1<T>[];
90
- has?: MapBaseType$1<T>;
91
- hasEvery?: MapBaseType$1<T>[];
92
- hasSome?: MapBaseType$1<T>[];
111
+ not?: EnumFilter<Schema, T, Nullable, WithAggregations>;
112
+ } & (WithAggregations extends true ? {
113
+ _count?: NumberFilter<Schema, 'Int', false, false>;
114
+ _min?: EnumFilter<Schema, T, false, false>;
115
+ _max?: EnumFilter<Schema, T, false, false>;
116
+ } : {}));
117
+ type ArrayFilter<Schema extends SchemaDef, T extends string> = {
118
+ equals?: MapScalarType<Schema, T>[] | null;
119
+ has?: MapScalarType<Schema, T> | null;
120
+ hasEvery?: MapScalarType<Schema, T>[];
121
+ hasSome?: MapScalarType<Schema, T>[];
93
122
  isEmpty?: boolean;
94
123
  };
95
- type PrimitiveFilter<T extends string, Nullable extends boolean> = T extends 'String' ? StringFilter<Nullable> : T extends 'Int' | 'Float' | 'Decimal' | 'BigInt' ? NumberFilter<T, Nullable> : T extends 'Boolean' ? BooleanFilter<Nullable> : T extends 'DateTime' ? DateTimeFilter<Nullable> : T extends 'Json' ? 'Not implemented yet' : never;
96
- type CommonPrimitiveFilter<DataType, T extends BuiltinType, Nullable extends boolean> = {
124
+ type MapScalarType<Schema extends SchemaDef, T extends string> = T extends GetEnums<Schema> ? keyof GetEnum<Schema, T> : MapBaseType$1<T>;
125
+ type PrimitiveFilter<Schema extends SchemaDef, T extends string, Nullable extends boolean, WithAggregations extends boolean> = T extends 'String' ? StringFilter<Schema, Nullable, WithAggregations> : T extends 'Int' | 'Float' | 'Decimal' | 'BigInt' ? NumberFilter<Schema, T, Nullable, WithAggregations> : T extends 'Boolean' ? BooleanFilter<Schema, Nullable, WithAggregations> : T extends 'DateTime' ? DateTimeFilter<Schema, Nullable, WithAggregations> : T extends 'Bytes' ? BytesFilter<Schema, Nullable, WithAggregations> : T extends 'Json' ? 'Not implemented yet' : never;
126
+ type CommonPrimitiveFilter<Schema extends SchemaDef, DataType, T extends BuiltinType, Nullable extends boolean, WithAggregations extends boolean> = {
97
127
  equals?: NullableIf<DataType, Nullable>;
98
128
  in?: DataType[];
99
129
  notIn?: DataType[];
@@ -101,30 +131,53 @@ type CommonPrimitiveFilter<DataType, T extends BuiltinType, Nullable extends boo
101
131
  lte?: DataType;
102
132
  gt?: DataType;
103
133
  gte?: DataType;
104
- not?: PrimitiveFilter<T, Nullable>;
134
+ not?: PrimitiveFilter<Schema, T, Nullable, WithAggregations>;
105
135
  };
106
- type StringFilter<Nullable extends boolean> = NullableIf<string, Nullable> | (CommonPrimitiveFilter<string, 'String', Nullable> & {
136
+ type StringFilter<Schema extends SchemaDef, Nullable extends boolean, WithAggregations extends boolean> = NullableIf<string, Nullable> | (CommonPrimitiveFilter<Schema, string, 'String', Nullable, WithAggregations> & {
107
137
  contains?: string;
108
138
  startsWith?: string;
109
139
  endsWith?: string;
140
+ } & (WithAggregations extends true ? {
141
+ _count?: NumberFilter<Schema, 'Int', false, false>;
142
+ _min?: StringFilter<Schema, false, false>;
143
+ _max?: StringFilter<Schema, false, false>;
144
+ } : {}) & (ProviderSupportsCaseSensitivity<Schema> extends true ? {
110
145
  mode?: 'default' | 'insensitive';
111
- });
112
- type NumberFilter<T extends 'Int' | 'Float' | 'Decimal' | 'BigInt', Nullable extends boolean> = NullableIf<number | bigint, Nullable> | CommonPrimitiveFilter<number, T, Nullable>;
113
- type DateTimeFilter<Nullable extends boolean> = NullableIf<Date | string, Nullable> | CommonPrimitiveFilter<Date | string, 'DateTime', Nullable>;
114
- type BytesFilter<Nullable extends boolean> = NullableIf<Uint8Array | Buffer, Nullable> | {
146
+ } : {}));
147
+ type NumberFilter<Schema extends SchemaDef, T extends 'Int' | 'Float' | 'Decimal' | 'BigInt', Nullable extends boolean, WithAggregations extends boolean> = NullableIf<number | bigint, Nullable> | (CommonPrimitiveFilter<Schema, number, T, Nullable, WithAggregations> & (WithAggregations extends true ? {
148
+ _count?: NumberFilter<Schema, 'Int', false, false>;
149
+ _avg?: NumberFilter<Schema, T, false, false>;
150
+ _sum?: NumberFilter<Schema, T, false, false>;
151
+ _min?: NumberFilter<Schema, T, false, false>;
152
+ _max?: NumberFilter<Schema, T, false, false>;
153
+ } : {}));
154
+ type DateTimeFilter<Schema extends SchemaDef, Nullable extends boolean, WithAggregations extends boolean> = NullableIf<Date | string, Nullable> | (CommonPrimitiveFilter<Schema, Date | string, 'DateTime', Nullable, WithAggregations> & (WithAggregations extends true ? {
155
+ _count?: NumberFilter<Schema, 'Int', false, false>;
156
+ _min?: DateTimeFilter<Schema, false, false>;
157
+ _max?: DateTimeFilter<Schema, false, false>;
158
+ } : {}));
159
+ type BytesFilter<Schema extends SchemaDef, Nullable extends boolean, WithAggregations extends boolean> = NullableIf<Uint8Array | Buffer, Nullable> | ({
115
160
  equals?: NullableIf<Uint8Array, Nullable>;
116
161
  in?: Uint8Array[];
117
162
  notIn?: Uint8Array[];
118
- not?: BytesFilter<Nullable>;
119
- };
120
- type BooleanFilter<Nullable extends boolean> = NullableIf<boolean, Nullable> | {
163
+ not?: BytesFilter<Schema, Nullable, WithAggregations>;
164
+ } & (WithAggregations extends true ? {
165
+ _count?: NumberFilter<Schema, 'Int', false, false>;
166
+ _min?: BytesFilter<Schema, false, false>;
167
+ _max?: BytesFilter<Schema, false, false>;
168
+ } : {}));
169
+ type BooleanFilter<Schema extends SchemaDef, Nullable extends boolean, WithAggregations extends boolean> = NullableIf<boolean, Nullable> | ({
121
170
  equals?: NullableIf<boolean, Nullable>;
122
- not?: BooleanFilter<Nullable>;
123
- };
171
+ not?: BooleanFilter<Schema, Nullable, WithAggregations>;
172
+ } & (WithAggregations extends true ? {
173
+ _count?: NumberFilter<Schema, 'Int', false, false>;
174
+ _min?: BooleanFilter<Schema, false, false>;
175
+ _max?: BooleanFilter<Schema, false, false>;
176
+ } : {}));
124
177
  type SortOrder = 'asc' | 'desc';
125
178
  type NullsOrder = 'first' | 'last';
126
179
  type OrderBy<Schema extends SchemaDef, Model extends GetModels<Schema>, WithRelation extends boolean, WithAggregation extends boolean> = {
127
- [Key in NonRelationFields<Schema, Model>]?: FieldIsOptional<Schema, Model, Key> extends true ? SortOrder | {
180
+ [Key in NonRelationFields<Schema, Model>]?: ModelFieldIsOptional<Schema, Model, Key> extends true ? SortOrder | {
128
181
  sort: SortOrder;
129
182
  nulls?: NullsOrder;
130
183
  } : SortOrder;
@@ -133,47 +186,41 @@ type OrderBy<Schema extends SchemaDef, Model extends GetModels<Schema>, WithRela
133
186
  _count?: SortOrder;
134
187
  } : OrderBy<Schema, RelationFieldType<Schema, Model, Key>, WithRelation, WithAggregation>;
135
188
  } : {}) & (WithAggregation extends true ? {
136
- _count?: OrderBy<Schema, Model, WithRelation, false>;
189
+ _count?: OrderBy<Schema, Model, false, false>;
190
+ _min?: MinMaxInput<Schema, Model, SortOrder>;
191
+ _max?: MinMaxInput<Schema, Model, SortOrder>;
137
192
  } & (NumericFields<Schema, Model> extends never ? {} : {
138
- _avg?: SumAvgInput<Schema, Model>;
139
- _sum?: SumAvgInput<Schema, Model>;
140
- _min?: MinMaxInput<Schema, Model>;
141
- _max?: MinMaxInput<Schema, Model>;
193
+ _avg?: SumAvgInput<Schema, Model, SortOrder>;
194
+ _sum?: SumAvgInput<Schema, Model, SortOrder>;
142
195
  }) : {});
143
196
  type WhereUniqueInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = AtLeast<{
144
197
  [Key in keyof GetModel<Schema, Model>['uniqueFields']]?: GetModel<Schema, Model>['uniqueFields'][Key] extends Pick<FieldDef, 'type'> ? MapFieldDefType<Schema, GetModel<Schema, Model>['uniqueFields'][Key]> : {
145
198
  [Key1 in keyof GetModel<Schema, Model>['uniqueFields'][Key]]: GetModel<Schema, Model>['uniqueFields'][Key][Key1] extends Pick<FieldDef, 'type'> ? MapFieldDefType<Schema, GetModel<Schema, Model>['uniqueFields'][Key][Key1]> : never;
146
199
  };
147
200
  } & WhereInput<Schema, Model>, Extract<keyof GetModel<Schema, Model>['uniqueFields'], string>>;
148
- type OmitFields<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
149
- [Key in NonRelationFields<Schema, Model>]?: true;
201
+ type OmitInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
202
+ [Key in NonRelationFields<Schema, Model>]?: boolean;
150
203
  };
151
204
  type SelectIncludeOmit<Schema extends SchemaDef, Model extends GetModels<Schema>, AllowCount extends boolean> = {
152
- select?: Select<Schema, Model, AllowCount, boolean>;
153
- include?: Include<Schema, Model>;
154
- omit?: OmitFields<Schema, Model>;
205
+ select?: SelectInput<Schema, Model, AllowCount, boolean>;
206
+ include?: IncludeInput<Schema, Model>;
207
+ omit?: OmitInput<Schema, Model>;
155
208
  };
156
- type Distinct<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
157
- distinct?: OrArray<NonRelationFields<Schema, Model>>;
158
- };
159
- type Cursor<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
160
- cursor?: WhereUniqueInput<Schema, Model>;
161
- };
162
- type Select<Schema extends SchemaDef, Model extends GetModels<Schema>, AllowCount extends boolean, AllowRelation extends boolean = true> = {
163
- [Key in NonRelationFields<Schema, Model>]?: true;
164
- } & (AllowRelation extends true ? Include<Schema, Model> : {}) & // relation fields
165
- (AllowCount extends true ? {
209
+ type SelectInput<Schema extends SchemaDef, Model extends GetModels<Schema>, AllowCount extends boolean = true, AllowRelation extends boolean = true> = {
210
+ [Key in NonRelationFields<Schema, Model>]?: boolean;
211
+ } & (AllowRelation extends true ? IncludeInput<Schema, Model> : {}) & // relation fields
212
+ (AllowCount extends true ? HasToManyRelations<Schema, Model> extends true ? {
166
213
  _count?: SelectCount<Schema, Model>;
167
- } : {});
168
- type SelectCount<Schema extends SchemaDef, Model extends GetModels<Schema>> = true | {
214
+ } : {} : {});
215
+ type SelectCount<Schema extends SchemaDef, Model extends GetModels<Schema>> = boolean | {
169
216
  select: {
170
- [Key in RelationFields<Schema, Model> as FieldIsArray<Schema, Model, Key> extends true ? Key : never]: true | {
217
+ [Key in RelationFields<Schema, Model> as FieldIsArray<Schema, Model, Key> extends true ? Key : never]?: boolean | {
171
218
  where: WhereInput<Schema, RelationFieldType<Schema, Model, Key>, false>;
172
219
  };
173
220
  };
174
221
  };
175
- type Include<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
176
- [Key in RelationFields<Schema, Model>]?: boolean | FindArgs<Schema, RelationFieldType<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>, FieldIsArray<Schema, Model, Key> extends true ? true : FieldIsOptional<Schema, Model, Key> extends true ? true : false>;
222
+ type IncludeInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
223
+ [Key in RelationFields<Schema, Model>]?: boolean | FindArgs<Schema, RelationFieldType<Schema, Model, Key>, FieldIsArray<Schema, Model, Key>, FieldIsArray<Schema, Model, Key> extends true ? true : ModelFieldIsOptional<Schema, Model, Key> extends true ? true : false>;
177
224
  };
178
225
  type Subset<T, U> = {
179
226
  [key in keyof T]: key extends keyof U ? T[key] : never;
@@ -193,56 +240,64 @@ type ToManyRelationFilter<Schema extends SchemaDef, Model extends GetModels<Sche
193
240
  none?: WhereInput<Schema, RelationFieldType<Schema, Model, Field>>;
194
241
  };
195
242
  type ToOneRelationFilter<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = NullableIf<WhereInput<Schema, RelationFieldType<Schema, Model, Field>> & {
196
- is?: NullableIf<WhereInput<Schema, RelationFieldType<Schema, Model, Field>>, FieldIsOptional<Schema, Model, Field>>;
197
- isNot?: NullableIf<WhereInput<Schema, RelationFieldType<Schema, Model, Field>>, FieldIsOptional<Schema, Model, Field>>;
198
- }, FieldIsOptional<Schema, Model, Field>>;
243
+ is?: NullableIf<WhereInput<Schema, RelationFieldType<Schema, Model, Field>>, ModelFieldIsOptional<Schema, Model, Field>>;
244
+ isNot?: NullableIf<WhereInput<Schema, RelationFieldType<Schema, Model, Field>>, ModelFieldIsOptional<Schema, Model, Field>>;
245
+ }, ModelFieldIsOptional<Schema, Model, Field>>;
199
246
  type RelationFilter<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = FieldIsArray<Schema, Model, Field> extends true ? ToManyRelationFilter<Schema, Model, Field> : ToOneRelationFilter<Schema, Model, Field>;
200
- type MapFieldType<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetFields<Schema, Model>> = MapFieldDefType<Schema, GetField<Schema, Model, Field>>;
201
- type MapFieldDefType<Schema extends SchemaDef, T extends Pick<FieldDef, 'type' | 'optional' | 'array'>> = WrapType<T['type'] extends GetEnums<Schema> ? keyof GetEnum<Schema, T['type']> : MapBaseType$1<T['type']>, T['optional'], T['array']>;
247
+ type MapModelFieldType<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = MapFieldDefType<Schema, GetModelField<Schema, Model, Field>>;
248
+ type MapTypeDefFieldType<Schema extends SchemaDef, TypeDef extends GetTypeDefs<Schema>, Field extends GetTypeDefFields<Schema, TypeDef>> = MapFieldDefType<Schema, GetTypeDefField<Schema, TypeDef, Field>>;
249
+ type MapFieldDefType<Schema extends SchemaDef, T extends Pick<FieldDef, 'type' | 'optional' | 'array'>> = WrapType<T['type'] extends GetEnums<Schema> ? keyof GetEnum<Schema, T['type']> : T['type'] extends GetTypeDefs<Schema> ? TypeDefResult<Schema, T['type']> & Record<string, unknown> : MapBaseType$1<T['type']>, T['optional'], T['array']>;
202
250
  type OptionalFieldsForCreate<Schema extends SchemaDef, Model extends GetModels<Schema>> = keyof {
203
- [Key in GetFields<Schema, Model> as FieldIsOptional<Schema, Model, Key> extends true ? Key : FieldHasDefault<Schema, Model, Key> extends true ? Key : GetField<Schema, Model, Key>['updatedAt'] extends true ? Key : FieldIsRelationArray<Schema, Model, Key> extends true ? Key : never]: GetField<Schema, Model, Key>;
251
+ [Key in GetModelFields<Schema, Model> as ModelFieldIsOptional<Schema, Model, Key> extends true ? Key : FieldHasDefault<Schema, Model, Key> extends true ? Key : FieldIsArray<Schema, Model, Key> extends true ? Key : GetModelField<Schema, Model, Key>['updatedAt'] extends true ? Key : never]: GetModelField<Schema, Model, Key>;
252
+ };
253
+ type GetRelation<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['relation'];
254
+ type OppositeRelation<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>, FT = FieldType<Schema, Model, Field>> = FT extends GetModels<Schema> ? GetRelation<Schema, Model, Field> extends RelationInfo ? GetRelation<Schema, Model, Field>['opposite'] extends GetModelFields<Schema, FT> ? Schema['models'][FT]['fields'][GetRelation<Schema, Model, Field>['opposite']]['relation'] : never : never : never;
255
+ type OppositeRelationFields<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>, Opposite = OppositeRelation<Schema, Model, Field>> = Opposite extends RelationInfo ? (Opposite['fields'] extends string[] ? Opposite['fields'] : []) : [];
256
+ type OppositeRelationAndFK<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>, FT = FieldType<Schema, Model, Field>, Relation = GetModelField<Schema, Model, Field>['relation'], Opposite = Relation extends RelationInfo ? Relation['opposite'] : never> = FT extends GetModels<Schema> ? Opposite extends GetModelFields<Schema, FT> ? Opposite | OppositeRelationFields<Schema, Model, Field>[number] : never : never;
257
+ type FilterArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
258
+ where?: WhereInput<Schema, Model>;
204
259
  };
205
- type GetRelation<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetFields<Schema, Model>> = GetField<Schema, Model, Field>['relation'];
206
- type OppositeRelation<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetFields<Schema, Model>, FT = FieldType<Schema, Model, Field>> = FT extends GetModels<Schema> ? GetRelation<Schema, Model, Field> extends RelationInfo ? GetRelation<Schema, Model, Field>['opposite'] extends GetFields<Schema, FT> ? Schema['models'][FT]['fields'][GetRelation<Schema, Model, Field>['opposite']]['relation'] : never : never : never;
207
- type OppositeRelationFields<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetFields<Schema, Model>, Opposite = OppositeRelation<Schema, Model, Field>> = Opposite extends RelationInfo ? (Opposite['fields'] extends string[] ? Opposite['fields'] : []) : [];
208
- type OppositeRelationAndFK<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetFields<Schema, Model>, FT = FieldType<Schema, Model, Field>, Relation = GetField<Schema, Model, Field>['relation'], Opposite = Relation extends RelationInfo ? Relation['opposite'] : never> = FT extends GetModels<Schema> ? Opposite extends GetFields<Schema, FT> ? Opposite | OppositeRelationFields<Schema, Model, Field>[number] : never : never;
209
- type FindArgs<Schema extends SchemaDef, Model extends GetModels<Schema>, Collection extends boolean, AllowFilter extends boolean = true> = (Collection extends true ? {
260
+ type SortAndTakeArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
210
261
  skip?: number;
211
262
  take?: number;
212
263
  orderBy?: OrArray<OrderBy<Schema, Model, true, false>>;
213
- } : {}) & (AllowFilter extends true ? {
214
- where?: WhereInput<Schema, Model>;
215
- } : {}) & SelectIncludeOmit<Schema, Model, Collection> & Distinct<Schema, Model> & Cursor<Schema, Model>;
264
+ cursor?: WhereUniqueInput<Schema, Model>;
265
+ };
266
+ type FindArgs<Schema extends SchemaDef, Model extends GetModels<Schema>, Collection extends boolean, AllowFilter extends boolean = true> = ProviderSupportsDistinct<Schema> extends true ? (Collection extends true ? SortAndTakeArgs<Schema, Model> & {
267
+ distinct?: OrArray<NonRelationFields<Schema, Model>>;
268
+ } : {}) & (AllowFilter extends true ? FilterArgs<Schema, Model> : {}) & SelectIncludeOmit<Schema, Model, Collection> : (Collection extends true ? SortAndTakeArgs<Schema, Model> : {}) & (AllowFilter extends true ? FilterArgs<Schema, Model> : {}) & SelectIncludeOmit<Schema, Model, Collection>;
269
+ type FindManyArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = FindArgs<Schema, Model, true>;
270
+ type FindFirstArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = FindArgs<Schema, Model, false>;
216
271
  type FindUniqueArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
217
272
  where?: WhereUniqueInput<Schema, Model>;
218
273
  } & SelectIncludeOmit<Schema, Model, true>;
219
274
  type CreateArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
220
275
  data: CreateInput<Schema, Model>;
221
- select?: Select<Schema, Model, true>;
222
- include?: Include<Schema, Model>;
223
- omit?: OmitFields<Schema, Model>;
276
+ select?: SelectInput<Schema, Model, true>;
277
+ include?: IncludeInput<Schema, Model>;
278
+ omit?: OmitInput<Schema, Model>;
224
279
  };
225
280
  type CreateManyArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = CreateManyInput<Schema, Model>;
226
281
  type CreateManyAndReturnArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = CreateManyInput<Schema, Model> & {
227
- select?: Select<Schema, Model, false, false>;
228
- omit?: OmitFields<Schema, Model>;
282
+ select?: SelectInput<Schema, Model, false, false>;
283
+ omit?: OmitInput<Schema, Model>;
229
284
  };
230
285
  type OptionalWrap<Schema extends SchemaDef, Model extends GetModels<Schema>, T extends object> = Optional<T, keyof T & OptionalFieldsForCreate<Schema, Model>>;
231
286
  type CreateScalarPayload<Schema extends SchemaDef, Model extends GetModels<Schema>> = OptionalWrap<Schema, Model, {
232
- [Key in ScalarFields<Schema, Model, false>]: ScalarCreatePayload<Schema, Model, Key>;
287
+ [Key in ScalarFields<Schema, Model, false> as FieldIsDelegateDiscriminator<Schema, Model, Key> extends true ? never : Key]: ScalarCreatePayload<Schema, Model, Key>;
233
288
  }>;
234
- type ScalarCreatePayload<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends ScalarFields<Schema, Model, false>> = MapFieldType<Schema, Model, Field> | (FieldIsArray<Schema, Model, Field> extends true ? {
235
- set?: MapFieldType<Schema, Model, Field>[];
289
+ type ScalarCreatePayload<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends ScalarFields<Schema, Model, false>> = MapModelFieldType<Schema, Model, Field> | (FieldIsArray<Schema, Model, Field> extends true ? {
290
+ set?: MapModelFieldType<Schema, Model, Field>;
236
291
  } : never);
237
292
  type CreateFKPayload<Schema extends SchemaDef, Model extends GetModels<Schema>> = OptionalWrap<Schema, Model, {
238
- [Key in ForeignKeyFields<Schema, Model>]: MapFieldType<Schema, Model, Key>;
293
+ [Key in ForeignKeyFields<Schema, Model>]: MapModelFieldType<Schema, Model, Key>;
239
294
  }>;
240
295
  type CreateRelationFieldPayload<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = Omit<{
296
+ connectOrCreate?: ConnectOrCreateInput<Schema, Model, Field>;
241
297
  create?: NestedCreateInput<Schema, Model, Field>;
242
298
  createMany?: NestedCreateManyInput<Schema, Model, Field>;
243
299
  connect?: ConnectInput<Schema, Model, Field>;
244
- connectOrCreate?: ConnectOrCreateInput<Schema, Model, Field>;
245
- }, FieldIsArray<Schema, Model, Field> extends true ? never : 'createMany'>;
300
+ }, (FieldIsArray<Schema, Model, Field> extends true ? never : 'createMany') | (FieldIsDelegateRelation<Schema, Model, Field> extends true ? 'create' | 'createMany' | 'connectOrCreate' : never)>;
246
301
  type CreateRelationPayload<Schema extends SchemaDef, Model extends GetModels<Schema>> = OptionalWrap<Schema, Model, {
247
302
  [Key in RelationFields<Schema, Model>]: CreateRelationFieldPayload<Schema, Model, Key>;
248
303
  }>;
@@ -265,14 +320,14 @@ type NestedCreateManyInput<Schema extends SchemaDef, Model extends GetModels<Sch
265
320
  type UpdateArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
266
321
  data: UpdateInput<Schema, Model>;
267
322
  where: WhereUniqueInput<Schema, Model>;
268
- select?: Select<Schema, Model, true>;
269
- include?: Include<Schema, Model>;
270
- omit?: OmitFields<Schema, Model>;
323
+ select?: SelectInput<Schema, Model, true>;
324
+ include?: IncludeInput<Schema, Model>;
325
+ omit?: OmitInput<Schema, Model>;
271
326
  };
272
327
  type UpdateManyArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = UpdateManyPayload<Schema, Model>;
273
328
  type UpdateManyAndReturnArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = UpdateManyPayload<Schema, Model> & {
274
- select?: Select<Schema, Model, false, false>;
275
- omit?: OmitFields<Schema, Model>;
329
+ select?: SelectInput<Schema, Model, false, false>;
330
+ omit?: OmitInput<Schema, Model>;
276
331
  };
277
332
  type UpdateManyPayload<Schema extends SchemaDef, Model extends GetModels<Schema>, Without extends string = never> = {
278
333
  data: OrArray<UpdateScalarInput<Schema, Model, Without>>;
@@ -283,29 +338,29 @@ type UpsertArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
283
338
  create: CreateInput<Schema, Model>;
284
339
  update: UpdateInput<Schema, Model>;
285
340
  where: WhereUniqueInput<Schema, Model>;
286
- select?: Select<Schema, Model, true>;
287
- include?: Include<Schema, Model>;
288
- omit?: OmitFields<Schema, Model>;
341
+ select?: SelectInput<Schema, Model, true>;
342
+ include?: IncludeInput<Schema, Model>;
343
+ omit?: OmitInput<Schema, Model>;
289
344
  };
290
345
  type UpdateScalarInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Without extends string = never> = Omit<{
291
- [Key in NonRelationFields<Schema, Model>]?: ScalarUpdatePayload<Schema, Model, Key>;
346
+ [Key in NonRelationFields<Schema, Model> as FieldIsDelegateDiscriminator<Schema, Model, Key> extends true ? never : Key]?: ScalarUpdatePayload<Schema, Model, Key>;
292
347
  }, Without>;
293
- type ScalarUpdatePayload<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends NonRelationFields<Schema, Model>> = MapFieldType<Schema, Model, Field> | (Field extends NumericFields<Schema, Model> ? {
294
- set?: NullableIf<number, FieldIsOptional<Schema, Model, Field>>;
348
+ type ScalarUpdatePayload<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends NonRelationFields<Schema, Model>> = MapModelFieldType<Schema, Model, Field> | (Field extends NumericFields<Schema, Model> ? {
349
+ set?: NullableIf<number, ModelFieldIsOptional<Schema, Model, Field>>;
295
350
  increment?: number;
296
351
  decrement?: number;
297
352
  multiply?: number;
298
353
  divide?: number;
299
354
  } : never) | (FieldIsArray<Schema, Model, Field> extends true ? {
300
- set?: MapFieldType<Schema, Model, Field>[];
301
- push?: OrArray<MapFieldType<Schema, Model, Field>, true>;
355
+ set?: MapModelFieldType<Schema, Model, Field>[];
356
+ push?: OrArray<MapModelFieldType<Schema, Model, Field>, true>;
302
357
  } : never);
303
358
  type UpdateRelationInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Without extends string = never> = Omit<{
304
359
  [Key in RelationFields<Schema, Model>]?: UpdateRelationFieldPayload<Schema, Model, Key>;
305
360
  }, Without>;
306
361
  type UpdateInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Without extends string = never> = UpdateScalarInput<Schema, Model, Without> & UpdateRelationInput<Schema, Model, Without>;
307
362
  type UpdateRelationFieldPayload<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = FieldIsArray<Schema, Model, Field> extends true ? ToManyRelationUpdateInput<Schema, Model, Field> : ToOneRelationUpdateInput<Schema, Model, Field>;
308
- type ToManyRelationUpdateInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = {
363
+ type ToManyRelationUpdateInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = Omit<{
309
364
  create?: NestedCreateInput<Schema, Model, Field>;
310
365
  createMany?: NestedCreateManyInput<Schema, Model, Field>;
311
366
  connect?: ConnectInput<Schema, Model, Field>;
@@ -317,22 +372,22 @@ type ToManyRelationUpdateInput<Schema extends SchemaDef, Model extends GetModels
317
372
  delete?: NestedDeleteInput<Schema, Model, Field>;
318
373
  deleteMany?: NestedDeleteManyInput<Schema, Model, Field>;
319
374
  set?: SetRelationInput<Schema, Model, Field>;
320
- };
321
- type ToOneRelationUpdateInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = {
375
+ }, FieldIsDelegateRelation<Schema, Model, Field> extends true ? 'create' | 'createMany' | 'connectOrCreate' | 'upsert' : never>;
376
+ type ToOneRelationUpdateInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = Omit<{
322
377
  create?: NestedCreateInput<Schema, Model, Field>;
323
378
  connect?: ConnectInput<Schema, Model, Field>;
324
379
  connectOrCreate?: ConnectOrCreateInput<Schema, Model, Field>;
325
380
  update?: NestedUpdateInput<Schema, Model, Field>;
326
381
  upsert?: NestedUpsertInput<Schema, Model, Field>;
327
- } & (FieldIsOptional<Schema, Model, Field> extends true ? {
382
+ } & (ModelFieldIsOptional<Schema, Model, Field> extends true ? {
328
383
  disconnect?: DisconnectInput<Schema, Model, Field>;
329
384
  delete?: NestedDeleteInput<Schema, Model, Field>;
330
- } : {});
385
+ } : {}), FieldIsDelegateRelation<Schema, Model, Field> extends true ? 'create' | 'connectOrCreate' | 'upsert' : never>;
331
386
  type DeleteArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
332
387
  where: WhereUniqueInput<Schema, Model>;
333
- select?: Select<Schema, Model, true>;
334
- include?: Include<Schema, Model>;
335
- omit?: OmitFields<Schema, Model>;
388
+ select?: SelectInput<Schema, Model, true>;
389
+ include?: IncludeInput<Schema, Model>;
390
+ omit?: OmitInput<Schema, Model>;
336
391
  };
337
392
  type DeleteManyArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
338
393
  where?: WhereInput<Schema, Model>;
@@ -358,20 +413,20 @@ type AggregateArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> =
358
413
  orderBy?: OrArray<OrderBy<Schema, Model, true, false>>;
359
414
  } & {
360
415
  _count?: true | CountAggregateInput<Schema, Model>;
416
+ _min?: MinMaxInput<Schema, Model, true>;
417
+ _max?: MinMaxInput<Schema, Model, true>;
361
418
  } & (NumericFields<Schema, Model> extends never ? {} : {
362
- _avg?: SumAvgInput<Schema, Model>;
363
- _sum?: SumAvgInput<Schema, Model>;
364
- _min?: MinMaxInput<Schema, Model>;
365
- _max?: MinMaxInput<Schema, Model>;
419
+ _avg?: SumAvgInput<Schema, Model, true>;
420
+ _sum?: SumAvgInput<Schema, Model, true>;
366
421
  });
367
422
  type NumericFields<Schema extends SchemaDef, Model extends GetModels<Schema>> = keyof {
368
- [Key in GetFields<Schema, Model> as GetFieldType<Schema, Model, Key> extends 'Int' | 'Float' | 'BigInt' | 'Decimal' ? FieldIsArray<Schema, Model, Key> extends true ? never : Key : never]: GetField<Schema, Model, Key>;
423
+ [Key in GetModelFields<Schema, Model> as GetModelFieldType<Schema, Model, Key> extends 'Int' | 'Float' | 'BigInt' | 'Decimal' ? FieldIsArray<Schema, Model, Key> extends true ? never : Key : never]: GetModelField<Schema, Model, Key>;
369
424
  };
370
- type SumAvgInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
371
- [Key in NumericFields<Schema, Model>]?: true;
425
+ type SumAvgInput<Schema extends SchemaDef, Model extends GetModels<Schema>, ValueType> = {
426
+ [Key in NumericFields<Schema, Model>]?: ValueType;
372
427
  };
373
- type MinMaxInput<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
374
- [Key in GetFields<Schema, Model> as FieldIsArray<Schema, Model, Key> extends true ? never : FieldIsRelation<Schema, Model, Key> extends true ? never : Key]?: true;
428
+ type MinMaxInput<Schema extends SchemaDef, Model extends GetModels<Schema>, ValueType> = {
429
+ [Key in GetModelFields<Schema, Model> as FieldIsArray<Schema, Model, Key> extends true ? never : FieldIsRelation<Schema, Model, Key> extends true ? never : Key]?: ValueType;
375
430
  };
376
431
  type AggregateResult<Schema extends SchemaDef, Model extends GetModels<Schema>, Args extends AggregateArgs<Schema, Model>> = (Args extends {
377
432
  _count: infer Count;
@@ -397,22 +452,23 @@ type AggregateResult<Schema extends SchemaDef, Model extends GetModels<Schema>,
397
452
  type AggCommonOutput<Input> = Input extends true ? number : Input extends {} ? {
398
453
  [Key in keyof Input]: number;
399
454
  } : never;
455
+ type GroupByHaving<Schema extends SchemaDef, Model extends GetModels<Schema>> = Omit<WhereInput<Schema, Model, true, true>, '$expr'>;
400
456
  type GroupByArgs<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
401
457
  where?: WhereInput<Schema, Model>;
402
458
  orderBy?: OrArray<OrderBy<Schema, Model, false, true>>;
403
459
  by: NonRelationFields<Schema, Model> | NonEmptyArray<NonRelationFields<Schema, Model>>;
404
- having?: WhereInput<Schema, Model, true>;
460
+ having?: GroupByHaving<Schema, Model>;
405
461
  take?: number;
406
462
  skip?: number;
407
463
  _count?: true | CountAggregateInput<Schema, Model>;
464
+ _min?: MinMaxInput<Schema, Model, true>;
465
+ _max?: MinMaxInput<Schema, Model, true>;
408
466
  } & (NumericFields<Schema, Model> extends never ? {} : {
409
- _avg?: SumAvgInput<Schema, Model>;
410
- _sum?: SumAvgInput<Schema, Model>;
411
- _min?: MinMaxInput<Schema, Model>;
412
- _max?: MinMaxInput<Schema, Model>;
467
+ _avg?: SumAvgInput<Schema, Model, true>;
468
+ _sum?: SumAvgInput<Schema, Model, true>;
413
469
  });
414
470
  type GroupByResult<Schema extends SchemaDef, Model extends GetModels<Schema>, Args extends GroupByArgs<Schema, Model>> = Array<{
415
- [Key in NonRelationFields<Schema, Model> as Key extends ValueOfPotentialTuple<Args['by']> ? Key : never]: MapFieldType<Schema, Model, Key>;
471
+ [Key in NonRelationFields<Schema, Model> as Key extends ValueOfPotentialTuple<Args['by']> ? Key : never]: MapModelFieldType<Schema, Model, Key>;
416
472
  } & (Args extends {
417
473
  _count: infer Count;
418
474
  } ? {
@@ -446,7 +502,7 @@ type NestedUpdateInput<Schema extends SchemaDef, Model extends GetModels<Schema>
446
502
  data: UpdateInput<Schema, RelationFieldType<Schema, Model, Field>, OppositeRelationAndFK<Schema, Model, Field>>;
447
503
  }, UpdateInput<Schema, RelationFieldType<Schema, Model, Field>, OppositeRelationAndFK<Schema, Model, Field>>>;
448
504
  type NestedUpsertInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = OrArray<{
449
- where: WhereUniqueInput<Schema, Model>;
505
+ where: WhereUniqueInput<Schema, RelationFieldType<Schema, Model, Field>>;
450
506
  create: CreateInput<Schema, RelationFieldType<Schema, Model, Field>, OppositeRelationAndFK<Schema, Model, Field>>;
451
507
  update: UpdateInput<Schema, RelationFieldType<Schema, Model, Field>, OppositeRelationAndFK<Schema, Model, Field>>;
452
508
  }, FieldIsArray<Schema, Model, Field>>;
@@ -454,10 +510,15 @@ type NestedUpdateManyInput<Schema extends SchemaDef, Model extends GetModels<Sch
454
510
  type NestedDeleteInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = FieldIsArray<Schema, Model, Field> extends true ? OrArray<WhereUniqueInput<Schema, RelationFieldType<Schema, Model, Field>>, true> : boolean | WhereInput<Schema, RelationFieldType<Schema, Model, Field>>;
455
511
  type NestedDeleteManyInput<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = OrArray<WhereInput<Schema, RelationFieldType<Schema, Model, Field>, true>>;
456
512
  type NonOwnedRelationFields<Schema extends SchemaDef, Model extends GetModels<Schema>> = keyof {
457
- [Key in RelationFields<Schema, Model> as GetField<Schema, Model, Key>['relation'] extends {
513
+ [Key in RelationFields<Schema, Model> as GetModelField<Schema, Model, Key>['relation'] extends {
458
514
  references: unknown[];
459
- } ? never : Key]: Key;
515
+ } ? never : Key]: true;
460
516
  };
517
+ type HasToManyRelations<Schema extends SchemaDef, Model extends GetModels<Schema>> = keyof {
518
+ [Key in RelationFields<Schema, Model> as FieldIsArray<Schema, Model, Key> extends true ? Key : never]: true;
519
+ } extends never ? false : true;
520
+ type ProviderSupportsCaseSensitivity<Schema extends SchemaDef> = Schema['provider']['type'] extends 'postgresql' ? true : false;
521
+ type ProviderSupportsDistinct<Schema extends SchemaDef> = Schema['provider']['type'] extends 'postgresql' ? true : false;
461
522
 
462
523
  type AuthType<Schema extends SchemaDef> = string extends GetModels<Schema> ? Record<string, unknown> : Schema['authType'] extends GetModels<Schema> ? Partial<ModelResult<Schema, Schema['authType']>> : never;
463
524
 
@@ -465,22 +526,27 @@ type AuthType<Schema extends SchemaDef> = string extends GetModels<Schema> ? Rec
465
526
  * Client API methods that are not supported in transactions.
466
527
  */
467
528
  declare const TRANSACTION_UNSUPPORTED_METHODS: readonly ["$transaction", "$disconnect", "$use"];
529
+ /**
530
+ * Logical combinators used in filters.
531
+ */
532
+ declare const LOGICAL_COMBINATORS: readonly ["AND", "OR", "NOT"];
468
533
 
469
534
  declare abstract class BaseCrudDialect<Schema extends SchemaDef> {
470
535
  protected readonly schema: Schema;
471
536
  protected readonly options: ClientOptions<Schema>;
472
537
  constructor(schema: Schema, options: ClientOptions<Schema>);
473
- abstract get provider(): DataSourceProviderType;
474
538
  transformPrimitive(value: unknown, _type: BuiltinType, _forArrayField: boolean): unknown;
475
- abstract buildRelationSelection(query: SelectQueryBuilder<any, any, any>, model: string, relationField: string, parentAlias: string, payload: true | FindArgs<Schema, GetModels<Schema>, true>): SelectQueryBuilder<any, any, any>;
476
- abstract buildSkipTake(query: SelectQueryBuilder<any, any, any>, skip: number | undefined, take: number | undefined): SelectQueryBuilder<any, any, any>;
539
+ buildSelectModel(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string): SelectQueryBuilder<any, any, {}>;
540
+ buildFilterSortTake(model: GetModels<Schema>, args: FindArgs<Schema, GetModels<Schema>, true>, query: SelectQueryBuilder<any, any, {}>, modelAlias: string): SelectQueryBuilder<any, any, {}>;
477
541
  buildFilter(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string, where: boolean | object | undefined): Expression<SqlBool>;
478
- protected buildCompositeFilter(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string, key: 'AND' | 'OR' | 'NOT', payload: any): Expression<SqlBool>;
542
+ private buildCursorFilter;
543
+ private isLogicalCombinator;
544
+ protected buildCompositeFilter(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string, key: (typeof LOGICAL_COMBINATORS)[number], payload: any): Expression<SqlBool>;
479
545
  private buildRelationFilter;
480
546
  private buildToOneRelationFilter;
481
547
  private buildToManyRelationFilter;
482
548
  private buildArrayFilter;
483
- buildPrimitiveFilter(eb: ExpressionBuilder<any, any>, model: string, modelAlias: string, field: string, fieldDef: FieldDef, payload: any): Expression<SqlBool>;
549
+ buildPrimitiveFilter(eb: ExpressionBuilder<any, any>, fieldRef: Expression<any>, fieldDef: FieldDef, payload: any): Expression<SqlBool>;
484
550
  private buildLiteralFilter;
485
551
  private buildStandardFilter;
486
552
  private buildStringFilter;
@@ -491,6 +557,11 @@ declare abstract class BaseCrudDialect<Schema extends SchemaDef> {
491
557
  private buildBytesFilter;
492
558
  private buildEnumFilter;
493
559
  buildOrderBy(query: SelectQueryBuilder<any, any, any>, model: string, modelAlias: string, orderBy: OrArray<OrderBy<Schema, GetModels<Schema>, boolean, boolean>> | undefined, useDefaultIfEmpty: boolean, negated: boolean): SelectQueryBuilder<any, any, any>;
560
+ buildSelectAllFields(model: string, query: SelectQueryBuilder<any, any, any>, omit: Record<string, boolean | undefined> | undefined, modelAlias: string): SelectQueryBuilder<any, any, any>;
561
+ protected buildModelSelect(eb: ExpressionBuilder<any, any>, model: GetModels<Schema>, subQueryAlias: string, payload: true | FindArgs<Schema, GetModels<Schema>, true>, selectAllFields: boolean): SelectQueryBuilder<any, any, {}>;
562
+ buildSelectField(query: SelectQueryBuilder<any, any, any>, model: string, modelAlias: string, field: string): SelectQueryBuilder<any, any, any>;
563
+ buildDelegateJoin(thisModel: string, thisModelAlias: string, otherModelAlias: string, query: SelectQueryBuilder<any, any, any>): SelectQueryBuilder<any, any, any>;
564
+ buildCountJson(model: string, eb: ExpressionBuilder<any, any>, parentAlias: string, payload: any): ExpressionWrapper<any, any, unknown>;
494
565
  private negateSort;
495
566
  true(eb: ExpressionBuilder<any, any>): Expression<SqlBool>;
496
567
  false(eb: ExpressionBuilder<any, any>): Expression<SqlBool>;
@@ -499,6 +570,17 @@ declare abstract class BaseCrudDialect<Schema extends SchemaDef> {
499
570
  protected and(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]): Expression<SqlBool>;
500
571
  protected or(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]): Expression<SqlBool>;
501
572
  protected not(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]): ExpressionWrapper<any, any, SqlBool>;
573
+ fieldRef(model: string, field: string, eb: ExpressionBuilder<any, any>, modelAlias?: string, inlineComputedField?: boolean): ExpressionWrapper<any, any, unknown>;
574
+ protected canJoinWithoutNestedSelect(modelDef: ModelDef, payload: boolean | FindArgs<Schema, GetModels<Schema>, true>): boolean;
575
+ abstract get provider(): DataSourceProviderType;
576
+ /**
577
+ * Builds selection for a relation field.
578
+ */
579
+ abstract buildRelationSelection(query: SelectQueryBuilder<any, any, any>, model: string, relationField: string, parentAlias: string, payload: true | FindArgs<Schema, GetModels<Schema>, true>): SelectQueryBuilder<any, any, any>;
580
+ /**
581
+ * Builds skip and take clauses.
582
+ */
583
+ abstract buildSkipTake(query: SelectQueryBuilder<any, any, any>, skip: number | undefined, take: number | undefined): SelectQueryBuilder<any, any, any>;
502
584
  /**
503
585
  * Builds an Kysely expression that returns a JSON object for the given key-value pairs.
504
586
  */
@@ -523,146 +605,157 @@ declare abstract class BaseCrudDialect<Schema extends SchemaDef> {
523
605
  * Whether the dialect supports DISTINCT ON.
524
606
  */
525
607
  abstract get supportsDistinctOn(): boolean;
608
+ /**
609
+ * Whether the dialect support inserting with `DEFAULT` as field value.
610
+ */
611
+ abstract get supportInsertWithDefault(): boolean;
526
612
  }
527
613
 
528
- type CrudOperation = 'findMany' | 'findUnique' | 'findFirst' | 'create' | 'createMany' | 'createManyAndReturn' | 'update' | 'updateMany' | 'updateManyAndReturn' | 'upsert' | 'delete' | 'deleteMany' | 'count' | 'aggregate' | 'groupBy';
614
+ type CoreCrudOperation = 'findMany' | 'findUnique' | 'findFirst' | 'create' | 'createMany' | 'createManyAndReturn' | 'update' | 'updateMany' | 'updateManyAndReturn' | 'upsert' | 'delete' | 'deleteMany' | 'count' | 'aggregate' | 'groupBy';
615
+ type AllCrudOperation = CoreCrudOperation | 'findUniqueOrThrow' | 'findFirstOrThrow';
529
616
 
530
617
  /**
531
- * The result of the hooks interception filter.
618
+ * ZenStack runtime plugin.
532
619
  */
533
- type MutationInterceptionFilterResult = {
620
+ interface RuntimePlugin<Schema extends SchemaDef = SchemaDef> {
534
621
  /**
535
- * Whether to intercept the mutation or not.
622
+ * Plugin ID.
536
623
  */
537
- intercept: boolean;
624
+ id: string;
538
625
  /**
539
- * Whether entities should be loaded before the mutation.
626
+ * Plugin display name.
540
627
  */
541
- loadBeforeMutationEntity?: boolean;
628
+ name?: string;
542
629
  /**
543
- * Whether entities should be loaded after the mutation.
630
+ * Plugin description.
544
631
  */
545
- loadAfterMutationEntity?: boolean;
546
- };
547
- type MutationHooksArgs<Schema extends SchemaDef> = {
632
+ description?: string;
548
633
  /**
549
- * The model that is being mutated.
634
+ * Intercepts an ORM query.
550
635
  */
551
- model: GetModels<Schema>;
636
+ onQuery?: OnQueryCallback<Schema>;
552
637
  /**
553
- * The mutation action that is being performed.
638
+ * Intercepts an entity mutation.
554
639
  */
555
- action: 'create' | 'update' | 'delete';
640
+ onEntityMutation?: EntityMutationHooksDef<Schema>;
556
641
  /**
557
- * The mutation data. Only available for create and update actions.
642
+ * Intercepts a Kysely query.
558
643
  */
559
- queryNode: OperationNode;
560
- };
561
- type PluginBeforeEntityMutationArgs<Schema extends SchemaDef> = MutationHooksArgs<Schema> & {
562
- entities?: Record<string, unknown>[];
563
- };
564
- type PluginAfterEntityMutationArgs<Schema extends SchemaDef> = MutationHooksArgs<Schema> & {
565
- beforeMutationEntities?: Record<string, unknown>[];
566
- afterMutationEntities?: Record<string, unknown>[];
567
- };
568
- type OnKyselyQueryArgs<Schema extends SchemaDef> = {
569
- kysely: ToKysely<Schema>;
570
- schema: SchemaDef;
571
- client: ClientContract<Schema>;
572
- query: RootOperationNode;
573
- proceed: ProceedKyselyQueryFunction;
574
- };
575
- type ProceedKyselyQueryFunction = (query: RootOperationNode) => Promise<QueryResult<any>>;
644
+ onKyselyQuery?: OnKyselyQueryCallback<Schema>;
645
+ }
576
646
  /**
577
- * ZenStack runtime plugin.
647
+ * Defines a ZenStack runtime plugin.
578
648
  */
579
- interface RuntimePlugin<Schema extends SchemaDef = SchemaDef> {
649
+ declare function definePlugin<Schema extends SchemaDef>(plugin: RuntimePlugin<Schema>): RuntimePlugin<Schema>;
650
+
651
+ type OnQueryCallback<Schema extends SchemaDef> = (ctx: OnQueryHookContext<Schema>) => Promise<unknown>;
652
+ type OnQueryHookContext<Schema extends SchemaDef> = {
580
653
  /**
581
- * Plugin ID.
654
+ * The model that is being queried.
582
655
  */
583
- id: string;
656
+ model: GetModels<Schema>;
584
657
  /**
585
- * Plugin display name.
658
+ * The operation that is being performed.
586
659
  */
587
- name?: string;
660
+ operation: AllCrudOperation;
588
661
  /**
589
- * Plugin description.
662
+ * The query arguments.
590
663
  */
591
- description?: string;
664
+ args: unknown;
592
665
  /**
593
- * Intercepts an ORM query.
666
+ * The function to proceed with the original query.
667
+ * It takes the same arguments as the operation method.
668
+ *
669
+ * @param args The query arguments.
594
670
  */
595
- onQuery?: OnQueryHooks<Schema>;
671
+ proceed: (args: unknown) => Promise<unknown>;
596
672
  /**
597
- * Intercepts a Kysely query.
673
+ * The ZenStack client that is performing the operation.
598
674
  */
599
- onKyselyQuery?: (args: OnKyselyQueryArgs<Schema>) => Promise<QueryResult<UnknownRow>>;
675
+ client: ClientContract<Schema>;
676
+ };
677
+ type EntityMutationHooksDef<Schema extends SchemaDef> = {
600
678
  /**
601
- * This callback determines whether a mutation should be intercepted, and if so,
602
- * what data should be loaded before and after the mutation.
679
+ * Called before entities are mutated.
603
680
  */
604
- mutationInterceptionFilter?: (args: MutationHooksArgs<Schema>) => MaybePromise<MutationInterceptionFilterResult>;
681
+ beforeEntityMutation?: BeforeEntityMutationCallback<Schema>;
605
682
  /**
606
- * Called before an entity is mutated.
607
- * @param args.entity Only available if `loadBeforeMutationEntity` is set to true in the
608
- * return value of {@link RuntimePlugin.mutationInterceptionFilter}.
683
+ * Called after entities are mutated.
609
684
  */
610
- beforeEntityMutation?: (args: PluginBeforeEntityMutationArgs<Schema>) => MaybePromise<void>;
685
+ afterEntityMutation?: AfterEntityMutationCallback<Schema>;
611
686
  /**
612
- * Called after an entity is mutated.
613
- * @param args.beforeMutationEntity Only available if `loadBeforeMutationEntity` is set to true in the
614
- * return value of {@link RuntimePlugin.mutationInterceptionFilter}.
615
- * @param args.afterMutationEntity Only available if `loadAfterMutationEntity` is set to true in the
616
- * return value of {@link RuntimePlugin.mutationInterceptionFilter}.
687
+ * Whether to run after-mutation hooks within the transaction that performs the mutation.
688
+ *
689
+ * If set to `true`, if the mutation already runs inside a transaction, the callbacks are
690
+ * executed immediately after the mutation within the transaction boundary. If the mutation
691
+ * is not running inside a transaction, a new transaction is created to run both the mutation
692
+ * and the callbacks.
693
+ *
694
+ * If set to `false`, the callbacks are executed after the mutation transaction is committed.
695
+ *
696
+ * Defaults to `false`.
617
697
  */
618
- afterEntityMutation?: (args: PluginAfterEntityMutationArgs<Schema>) => MaybePromise<void>;
619
- }
620
- type OnQueryHooks<Schema extends SchemaDef = SchemaDef> = {
621
- [Model in GetModels<Schema> as Uncapitalize<Model>]?: OnQueryOperationHooks<Schema, Model>;
622
- } & {
623
- $allModels?: OnQueryOperationHooks<Schema, GetModels<Schema>>;
624
- };
625
- type OnQueryOperationHooks<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
626
- [Operation in keyof ModelOperations<Schema, Model>]?: (ctx: OnQueryHookContext<Schema, Model, Operation>) => Promise<Awaited<ReturnType<ModelOperations<Schema, Model>[Operation]>>>;
627
- } & {
628
- $allOperations?: (ctx: {
629
- model: Model;
630
- operation: CrudOperation;
631
- args: unknown;
632
- query: (args: unknown) => Promise<unknown>;
633
- }) => MaybePromise<unknown>;
698
+ runAfterMutationWithinTransaction?: boolean;
634
699
  };
635
- type OnQueryHookContext<Schema extends SchemaDef, Model extends GetModels<Schema>, Operation extends keyof ModelOperations<Schema, Model>> = {
700
+ type MutationHooksArgs<Schema extends SchemaDef> = {
636
701
  /**
637
- * The model that is being queried.
702
+ * The model that is being mutated.
703
+ */
704
+ model: GetModels<Schema>;
705
+ /**
706
+ * The mutation action that is being performed.
638
707
  */
639
- model: Model;
708
+ action: 'create' | 'update' | 'delete';
640
709
  /**
641
- * The operation that is being performed.
710
+ * The mutation data. Only available for create and update actions.
642
711
  */
643
- operation: Operation;
712
+ queryNode: OperationNode;
644
713
  /**
645
- * The query arguments.
714
+ * A query ID that uniquely identifies the mutation operation. You can use it to correlate
715
+ * data between the before and after mutation hooks.
646
716
  */
647
- args: Parameters<ModelOperations<Schema, Model>[Operation]>[0];
717
+ queryId: string;
718
+ };
719
+ type BeforeEntityMutationCallback<Schema extends SchemaDef> = (args: PluginBeforeEntityMutationArgs<Schema>) => MaybePromise<void>;
720
+ type AfterEntityMutationCallback<Schema extends SchemaDef> = (args: PluginAfterEntityMutationArgs<Schema>) => MaybePromise<void>;
721
+ type PluginBeforeEntityMutationArgs<Schema extends SchemaDef> = MutationHooksArgs<Schema> & {
648
722
  /**
649
- * The query function to proceed with the original query.
650
- * It takes the same arguments as the operation method.
723
+ * Loads the entities that are about to be mutated. The db operation that loads the entities is executed
724
+ * within the same transaction context as the mutation.
725
+ */
726
+ loadBeforeMutationEntities(): Promise<Record<string, unknown>[] | undefined>;
727
+ /**
728
+ * The ZenStack client you can use to perform additional operations. The database operations initiated
729
+ * from this client are executed within the same transaction as the mutation if the mutation is running
730
+ * inside a transaction.
651
731
  *
652
- * @param args The query arguments.
732
+ * Mutations initiated from this client will NOT trigger entity mutation hooks to avoid infinite loops.
653
733
  */
654
- query: (args: Parameters<ModelOperations<Schema, Model>[Operation]>[0]) => ReturnType<ModelOperations<Schema, Model>[Operation]>;
734
+ client: ClientContract<Schema>;
735
+ };
736
+ type PluginAfterEntityMutationArgs<Schema extends SchemaDef> = MutationHooksArgs<Schema> & {
655
737
  /**
656
- * The ZenStack client that is performing the operation.
738
+ * Loads the entities that have been mutated.
739
+ */
740
+ loadAfterMutationEntities(): Promise<Record<string, unknown>[] | undefined>;
741
+ /**
742
+ * The ZenStack client you can use to perform additional operations.
743
+ * See {@link EntityMutationHooksDef.runAfterMutationWithinTransaction} for detailed transaction behavior.
744
+ *
745
+ * Mutations initiated from this client will NOT trigger entity mutation hooks to avoid infinite loops.
657
746
  */
658
747
  client: ClientContract<Schema>;
659
748
  };
660
- /**
661
- * Defines a ZenStack runtime plugin.
662
- */
663
- declare function definePlugin<Schema extends SchemaDef>(plugin: RuntimePlugin<Schema>): RuntimePlugin<Schema>;
749
+ type OnKyselyQueryArgs<Schema extends SchemaDef> = {
750
+ kysely: ToKysely<Schema>;
751
+ schema: SchemaDef;
752
+ client: ClientContract<Schema>;
753
+ query: RootOperationNode;
754
+ proceed: ProceedKyselyQueryFunction;
755
+ };
756
+ type ProceedKyselyQueryFunction = (query: RootOperationNode) => Promise<QueryResult<any>>;
757
+ type OnKyselyQueryCallback<Schema extends SchemaDef> = (args: OnKyselyQueryArgs<Schema>) => Promise<QueryResult<UnknownRow>>;
664
758
 
665
- type DialectConfig<Provider extends DataSourceProvider> = Provider['type'] extends 'sqlite' ? Optional<SqliteDialectConfig, 'database'> : Provider['type'] extends 'postgresql' ? Optional<PostgresDialectConfig, 'pool'> : never;
666
759
  type ZModelFunctionContext<Schema extends SchemaDef> = {
667
760
  dialect: BaseCrudDialect<Schema>;
668
761
  model: GetModels<Schema>;
@@ -674,9 +767,9 @@ type ZModelFunction<Schema extends SchemaDef> = (eb: ExpressionBuilder<ToKyselyS
674
767
  */
675
768
  type ClientOptions<Schema extends SchemaDef> = {
676
769
  /**
677
- * Database dialect configuration.
770
+ * Kysely dialect.
678
771
  */
679
- dialectConfig: DialectConfig<Schema['provider']>;
772
+ dialect: Dialect;
680
773
  /**
681
774
  * Custom function definitions.
682
775
  */
@@ -689,10 +782,6 @@ type ClientOptions<Schema extends SchemaDef> = {
689
782
  * Logging configuration.
690
783
  */
691
784
  log?: KyselyConfig['log'];
692
- /**
693
- * Debug mode.
694
- */
695
- debug?: boolean;
696
785
  } & (HasComputedFields<Schema> extends true ? {
697
786
  /**
698
787
  * Computed field definitions.
@@ -754,7 +843,7 @@ type ClientContract<Schema extends SchemaDef> = {
754
843
  * Executes a prepared raw query and returns the number of affected rows.
755
844
  * @example
756
845
  * ```
757
- * const result = await client.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`
846
+ * const result = await db.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`
758
847
  * ```
759
848
  */
760
849
  $executeRaw(query: TemplateStringsArray, ...values: any[]): ZenStackPromise<Schema, number>;
@@ -763,7 +852,7 @@ type ClientContract<Schema extends SchemaDef> = {
763
852
  * This method is susceptible to SQL injections.
764
853
  * @example
765
854
  * ```
766
- * const result = await client.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')
855
+ * const result = await db.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')
767
856
  * ```
768
857
  */
769
858
  $executeRawUnsafe(query: string, ...values: any[]): ZenStackPromise<Schema, number>;
@@ -771,7 +860,7 @@ type ClientContract<Schema extends SchemaDef> = {
771
860
  * Performs a prepared raw query and returns the `SELECT` data.
772
861
  * @example
773
862
  * ```
774
- * const result = await client.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`
863
+ * const result = await db.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`
775
864
  * ```
776
865
  */
777
866
  $queryRaw<T = unknown>(query: TemplateStringsArray, ...values: any[]): ZenStackPromise<Schema, T>;
@@ -780,7 +869,7 @@ type ClientContract<Schema extends SchemaDef> = {
780
869
  * This method is susceptible to SQL injections.
781
870
  * @example
782
871
  * ```
783
- * const result = await client.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')
872
+ * const result = await db.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')
784
873
  * ```
785
874
  */
786
875
  $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): ZenStackPromise<Schema, T>;
@@ -869,7 +958,7 @@ interface ClientConstructor {
869
958
  * CRUD operations.
870
959
  */
871
960
  type CRUD = 'create' | 'read' | 'update' | 'delete';
872
- interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Schema>> {
961
+ type AllModelOperations<Schema extends SchemaDef, Model extends GetModels<Schema>> = {
873
962
  /**
874
963
  * Returns a list of entities.
875
964
  * @param args - query args
@@ -878,17 +967,17 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
878
967
  * @example
879
968
  * ```ts
880
969
  * // find all users and return all scalar fields
881
- * await client.user.findMany();
970
+ * await db.user.findMany();
882
971
  *
883
972
  * // find all users with name 'Alex'
884
- * await client.user.findMany({
973
+ * await db.user.findMany({
885
974
  * where: {
886
975
  * name: 'Alex'
887
976
  * }
888
977
  * });
889
978
  *
890
979
  * // select fields
891
- * await client.user.findMany({
980
+ * await db.user.findMany({
892
981
  * select: {
893
982
  * name: true,
894
983
  * email: true,
@@ -896,21 +985,21 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
896
985
  * }); // result: `Array<{ name: string, email: string }>`
897
986
  *
898
987
  * // omit fields
899
- * await client.user.findMany({
988
+ * await db.user.findMany({
900
989
  * omit: {
901
990
  * name: true,
902
991
  * }
903
992
  * }); // result: `Array<{ id: number; email: string; ... }>`
904
993
  *
905
994
  * // include relations (and all scalar fields)
906
- * await client.user.findMany({
995
+ * await db.user.findMany({
907
996
  * include: {
908
997
  * posts: true,
909
998
  * }
910
999
  * }); // result: `Array<{ ...; posts: Post[] }>`
911
1000
  *
912
1001
  * // include relations with filter
913
- * await client.user.findMany({
1002
+ * await db.user.findMany({
914
1003
  * include: {
915
1004
  * posts: {
916
1005
  * where: {
@@ -921,14 +1010,14 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
921
1010
  * });
922
1011
  *
923
1012
  * // pagination and sorting
924
- * await client.user.findMany({
1013
+ * await db.user.findMany({
925
1014
  * skip: 10,
926
1015
  * take: 10,
927
1016
  * orderBy: [{ name: 'asc' }, { email: 'desc' }],
928
1017
  * });
929
1018
  *
930
1019
  * // pagination with cursor (https://www.prisma.io/docs/orm/prisma-client/queries/pagination#cursor-based-pagination)
931
- * await client.user.findMany({
1020
+ * await db.user.findMany({
932
1021
  * cursor: { id: 10 },
933
1022
  * skip: 1,
934
1023
  * take: 10,
@@ -936,50 +1025,50 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
936
1025
  * });
937
1026
  *
938
1027
  * // distinct
939
- * await client.user.findMany({
1028
+ * await db.user.findMany({
940
1029
  * distinct: ['name']
941
1030
  * });
942
1031
  *
943
1032
  * // count all relations
944
- * await client.user.findMany({
1033
+ * await db.user.findMany({
945
1034
  * _count: true,
946
1035
  * }); // result: `{ _count: { posts: number; ... } }`
947
1036
  *
948
1037
  * // count selected relations
949
- * await client.user.findMany({
1038
+ * await db.user.findMany({
950
1039
  * _count: { select: { posts: true } },
951
1040
  * }); // result: `{ _count: { posts: number } }`
952
1041
  * ```
953
1042
  */
954
- findMany<T extends FindArgs<Schema, Model, true>>(args?: SelectSubset<T, FindArgs<Schema, Model, true>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T>[]>;
1043
+ findMany<T extends FindArgs<Schema, Model, true>>(args?: SelectSubset<T, FindArgs<Schema, Model, true>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>[]>;
955
1044
  /**
956
1045
  * Returns a uniquely identified entity.
957
1046
  * @param args - query args
958
1047
  * @returns a single entity or null if not found
959
1048
  * @see {@link findMany}
960
1049
  */
961
- findUnique<T extends FindUniqueArgs<Schema, Model>>(args?: SelectSubset<T, FindUniqueArgs<Schema, Model>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T> | null>;
1050
+ findUnique<T extends FindUniqueArgs<Schema, Model>>(args: SelectSubset<T, FindUniqueArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>> | null>;
962
1051
  /**
963
1052
  * Returns a uniquely identified entity or throws `NotFoundError` if not found.
964
1053
  * @param args - query args
965
1054
  * @returns a single entity
966
1055
  * @see {@link findMany}
967
1056
  */
968
- findUniqueOrThrow<T extends FindUniqueArgs<Schema, Model>>(args?: SelectSubset<T, FindUniqueArgs<Schema, Model>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
1057
+ findUniqueOrThrow<T extends FindUniqueArgs<Schema, Model>>(args: SelectSubset<T, FindUniqueArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;
969
1058
  /**
970
1059
  * Returns the first entity.
971
1060
  * @param args - query args
972
1061
  * @returns a single entity or null if not found
973
1062
  * @see {@link findMany}
974
1063
  */
975
- findFirst<T extends FindArgs<Schema, Model, true>>(args?: SelectSubset<T, FindArgs<Schema, Model, true>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T> | null>;
1064
+ findFirst<T extends FindArgs<Schema, Model, true>>(args?: SelectSubset<T, FindArgs<Schema, Model, true>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>> | null>;
976
1065
  /**
977
1066
  * Returns the first entity or throws `NotFoundError` if not found.
978
1067
  * @param args - query args
979
1068
  * @returns a single entity
980
1069
  * @see {@link findMany}
981
1070
  */
982
- findFirstOrThrow<T extends FindArgs<Schema, Model, true>>(args?: SelectSubset<T, FindArgs<Schema, Model, true>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
1071
+ findFirstOrThrow<T extends FindArgs<Schema, Model, true>>(args?: SelectSubset<T, FindArgs<Schema, Model, true>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;
983
1072
  /**
984
1073
  * Creates a new entity.
985
1074
  * @param args - create args
@@ -988,12 +1077,12 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
988
1077
  * @example
989
1078
  * ```ts
990
1079
  * // simple create
991
- * await client.user.create({
1080
+ * await db.user.create({
992
1081
  * data: { name: 'Alex', email: 'alex@zenstack.dev' }
993
1082
  * });
994
1083
  *
995
1084
  * // nested create with relation
996
- * await client.user.create({
1085
+ * await db.user.create({
997
1086
  * data: {
998
1087
  * email: 'alex@zenstack.dev',
999
1088
  * posts: { create: { title: 'Hello World' } }
@@ -1002,7 +1091,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1002
1091
  *
1003
1092
  * // you can use `select`, `omit`, and `include` to control
1004
1093
  * // the fields returned by the query, as with `findMany`
1005
- * await client.user.create({
1094
+ * await db.user.create({
1006
1095
  * data: {
1007
1096
  * email: 'alex@zenstack.dev',
1008
1097
  * posts: { create: { title: 'Hello World' } }
@@ -1011,7 +1100,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1011
1100
  * }); // result: `{ id: number; posts: Post[] }`
1012
1101
  *
1013
1102
  * // connect relations
1014
- * await client.user.create({
1103
+ * await db.user.create({
1015
1104
  * data: {
1016
1105
  * email: 'alex@zenstack.dev',
1017
1106
  * posts: { connect: { id: 1 } }
@@ -1019,7 +1108,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1019
1108
  * });
1020
1109
  *
1021
1110
  * // connect relations, and create if not found
1022
- * await client.user.create({
1111
+ * await db.user.create({
1023
1112
  * data: {
1024
1113
  * email: 'alex@zenstack.dev',
1025
1114
  * posts: {
@@ -1032,7 +1121,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1032
1121
  * });
1033
1122
  * ```
1034
1123
  */
1035
- create<T extends CreateArgs<Schema, Model>>(args: SelectSubset<T, CreateArgs<Schema, Model>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
1124
+ create<T extends CreateArgs<Schema, Model>>(args: SelectSubset<T, CreateArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;
1036
1125
  /**
1037
1126
  * Creates multiple entities. Only scalar fields are allowed.
1038
1127
  * @param args - create args
@@ -1041,7 +1130,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1041
1130
  * @example
1042
1131
  * ```ts
1043
1132
  * // create multiple entities
1044
- * await client.user.createMany({
1133
+ * await db.user.createMany({
1045
1134
  * data: [
1046
1135
  * { name: 'Alex', email: 'alex@zenstack.dev' },
1047
1136
  * { name: 'John', email: 'john@zenstack.dev' }
@@ -1049,7 +1138,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1049
1138
  * });
1050
1139
  *
1051
1140
  * // skip items that cause unique constraint violation
1052
- * await client.user.createMany({
1141
+ * await db.user.createMany({
1053
1142
  * data: [
1054
1143
  * { name: 'Alex', email: 'alex@zenstack.dev' },
1055
1144
  * { name: 'John', email: 'john@zenstack.dev' }
@@ -1068,7 +1157,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1068
1157
  * @example
1069
1158
  * ```ts
1070
1159
  * // create multiple entities and return selected fields
1071
- * await client.user.createManyAndReturn({
1160
+ * await db.user.createManyAndReturn({
1072
1161
  * data: [
1073
1162
  * { name: 'Alex', email: 'alex@zenstack.dev' },
1074
1163
  * { name: 'John', email: 'john@zenstack.dev' }
@@ -1077,7 +1166,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1077
1166
  * });
1078
1167
  * ```
1079
1168
  */
1080
- createManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(args?: SelectSubset<T, CreateManyAndReturnArgs<Schema, Model>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T>[]>;
1169
+ createManyAndReturn<T extends CreateManyAndReturnArgs<Schema, Model>>(args?: SelectSubset<T, CreateManyAndReturnArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>[]>;
1081
1170
  /**
1082
1171
  * Updates a uniquely identified entity.
1083
1172
  * @param args - update args. See {@link findMany} for how to control
@@ -1087,19 +1176,19 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1087
1176
  * @example
1088
1177
  * ```ts
1089
1178
  * // update fields
1090
- * await client.user.update({
1179
+ * await db.user.update({
1091
1180
  * where: { id: 1 },
1092
1181
  * data: { name: 'Alex' }
1093
1182
  * });
1094
1183
  *
1095
1184
  * // connect a relation
1096
- * await client.user.update({
1185
+ * await db.user.update({
1097
1186
  * where: { id: 1 },
1098
1187
  * data: { posts: { connect: { id: 1 } } }
1099
1188
  * });
1100
1189
  *
1101
1190
  * // connect relation, and create if not found
1102
- * await client.user.update({
1191
+ * await db.user.update({
1103
1192
  * where: { id: 1 },
1104
1193
  * data: {
1105
1194
  * posts: {
@@ -1112,7 +1201,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1112
1201
  * });
1113
1202
  *
1114
1203
  * // create many related entities (only available for one-to-many relations)
1115
- * await client.user.update({
1204
+ * await db.user.update({
1116
1205
  * where: { id: 1 },
1117
1206
  * data: {
1118
1207
  * posts: {
@@ -1124,19 +1213,19 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1124
1213
  * });
1125
1214
  *
1126
1215
  * // disconnect a one-to-many relation
1127
- * await client.user.update({
1216
+ * await db.user.update({
1128
1217
  * where: { id: 1 },
1129
1218
  * data: { posts: { disconnect: { id: 1 } } }
1130
1219
  * });
1131
1220
  *
1132
1221
  * // disconnect a one-to-one relation
1133
- * await client.user.update({
1222
+ * await db.user.update({
1134
1223
  * where: { id: 1 },
1135
1224
  * data: { profile: { disconnect: true } }
1136
1225
  * });
1137
1226
  *
1138
1227
  * // replace a relation (only available for one-to-many relations)
1139
- * await client.user.update({
1228
+ * await db.user.update({
1140
1229
  * where: { id: 1 },
1141
1230
  * data: {
1142
1231
  * posts: {
@@ -1146,7 +1235,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1146
1235
  * });
1147
1236
  *
1148
1237
  * // update a relation
1149
- * await client.user.update({
1238
+ * await db.user.update({
1150
1239
  * where: { id: 1 },
1151
1240
  * data: {
1152
1241
  * posts: {
@@ -1156,7 +1245,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1156
1245
  * });
1157
1246
  *
1158
1247
  * // upsert a relation
1159
- * await client.user.update({
1248
+ * await db.user.update({
1160
1249
  * where: { id: 1 },
1161
1250
  * data: {
1162
1251
  * posts: {
@@ -1170,7 +1259,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1170
1259
  * });
1171
1260
  *
1172
1261
  * // update many related entities (only available for one-to-many relations)
1173
- * await client.user.update({
1262
+ * await db.user.update({
1174
1263
  * where: { id: 1 },
1175
1264
  * data: {
1176
1265
  * posts: {
@@ -1183,19 +1272,19 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1183
1272
  * });
1184
1273
  *
1185
1274
  * // delete a one-to-many relation
1186
- * await client.user.update({
1275
+ * await db.user.update({
1187
1276
  * where: { id: 1 },
1188
1277
  * data: { posts: { delete: { id: 1 } } }
1189
1278
  * });
1190
1279
  *
1191
1280
  * // delete a one-to-one relation
1192
- * await client.user.update({
1281
+ * await db.user.update({
1193
1282
  * where: { id: 1 },
1194
1283
  * data: { profile: { delete: true } }
1195
1284
  * });
1196
1285
  * ```
1197
1286
  */
1198
- update<T extends UpdateArgs<Schema, Model>>(args: SelectSubset<T, UpdateArgs<Schema, Model>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
1287
+ update<T extends UpdateArgs<Schema, Model>>(args: SelectSubset<T, UpdateArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;
1199
1288
  /**
1200
1289
  * Updates multiple entities.
1201
1290
  * @param args - update args. Only scalar fields are allowed for data.
@@ -1204,13 +1293,13 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1204
1293
  * @example
1205
1294
  * ```ts
1206
1295
  * // update many entities
1207
- * await client.user.updateMany({
1296
+ * await db.user.updateMany({
1208
1297
  * where: { email: { endsWith: '@zenstack.dev' } },
1209
1298
  * data: { role: 'ADMIN' }
1210
1299
  * });
1211
1300
  *
1212
1301
  * // limit the number of updated entities
1213
- * await client.user.updateMany({
1302
+ * await db.user.updateMany({
1214
1303
  * where: { email: { endsWith: '@zenstack.dev' } },
1215
1304
  * data: { role: 'ADMIN' },
1216
1305
  * limit: 10
@@ -1225,21 +1314,21 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1225
1314
  * @example
1226
1315
  * ```ts
1227
1316
  * // update many entities and return selected fields
1228
- * await client.user.updateManyAndReturn({
1317
+ * await db.user.updateManyAndReturn({
1229
1318
  * where: { email: { endsWith: '@zenstack.dev' } },
1230
1319
  * data: { role: 'ADMIN' },
1231
1320
  * select: { id: true, email: true }
1232
1321
  * }); // result: `Array<{ id: string; email: string }>`
1233
1322
  *
1234
1323
  * // limit the number of updated entities
1235
- * await client.user.updateManyAndReturn({
1324
+ * await db.user.updateManyAndReturn({
1236
1325
  * where: { email: { endsWith: '@zenstack.dev' } },
1237
1326
  * data: { role: 'ADMIN' },
1238
1327
  * limit: 10
1239
1328
  * });
1240
1329
  * ```
1241
1330
  */
1242
- updateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(args: Subset<T, UpdateManyAndReturnArgs<Schema, Model>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T>[]>;
1331
+ updateManyAndReturn<T extends UpdateManyAndReturnArgs<Schema, Model>>(args: Subset<T, UpdateManyAndReturnArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>[]>;
1243
1332
  /**
1244
1333
  * Creates or updates an entity.
1245
1334
  * @param args - upsert args
@@ -1248,7 +1337,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1248
1337
  * @example
1249
1338
  * ```ts
1250
1339
  * // upsert an entity
1251
- * await client.user.upsert({
1340
+ * await db.user.upsert({
1252
1341
  * // `where` clause is used to find the entity
1253
1342
  * where: { id: 1 },
1254
1343
  * // `create` clause is used if the entity is not found
@@ -1260,7 +1349,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1260
1349
  * });
1261
1350
  * ```
1262
1351
  */
1263
- upsert<T extends UpsertArgs<Schema, Model>>(args: SelectSubset<T, UpsertArgs<Schema, Model>>): ZenStackPromise<Schema, ModelResult<Schema, Model, T>>;
1352
+ upsert<T extends UpsertArgs<Schema, Model>>(args: SelectSubset<T, UpsertArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;
1264
1353
  /**
1265
1354
  * Deletes a uniquely identifiable entity.
1266
1355
  * @param args - delete args
@@ -1269,18 +1358,18 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1269
1358
  * @example
1270
1359
  * ```ts
1271
1360
  * // delete an entity
1272
- * await client.user.delete({
1361
+ * await db.user.delete({
1273
1362
  * where: { id: 1 }
1274
1363
  * });
1275
1364
  *
1276
1365
  * // delete an entity and return selected fields
1277
- * await client.user.delete({
1366
+ * await db.user.delete({
1278
1367
  * where: { id: 1 },
1279
1368
  * select: { id: true, email: true }
1280
1369
  * }); // result: `{ id: string; email: string }`
1281
1370
  * ```
1282
1371
  */
1283
- delete<T extends DeleteArgs<Schema, Model>>(args: SelectSubset<T, DeleteArgs<Schema, Model>>): ZenStackPromise<Schema, ModelResult<Schema, Model>>;
1372
+ delete<T extends DeleteArgs<Schema, Model>>(args: SelectSubset<T, DeleteArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<ModelResult<Schema, Model, T>>>;
1284
1373
  /**
1285
1374
  * Deletes multiple entities.
1286
1375
  * @param args - delete args
@@ -1289,12 +1378,12 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1289
1378
  * @example
1290
1379
  * ```ts
1291
1380
  * // delete many entities
1292
- * await client.user.deleteMany({
1381
+ * await db.user.deleteMany({
1293
1382
  * where: { email: { endsWith: '@zenstack.dev' } }
1294
1383
  * });
1295
1384
  *
1296
1385
  * // limit the number of deleted entities
1297
- * await client.user.deleteMany({
1386
+ * await db.user.deleteMany({
1298
1387
  * where: { email: { endsWith: '@zenstack.dev' } },
1299
1388
  * limit: 10
1300
1389
  * });
@@ -1309,17 +1398,17 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1309
1398
  * @example
1310
1399
  * ```ts
1311
1400
  * // count all
1312
- * await client.user.count();
1401
+ * await db.user.count();
1313
1402
  *
1314
1403
  * // count with a filter
1315
- * await client.user.count({ where: { email: { endsWith: '@zenstack.dev' } } });
1404
+ * await db.user.count({ where: { email: { endsWith: '@zenstack.dev' } } });
1316
1405
  *
1317
1406
  * // count rows and field values
1318
- * await client.user.count({
1407
+ * await db.user.count({
1319
1408
  * select: { _all: true, email: true }
1320
1409
  * }); // result: `{ _all: number, email: number }`
1321
1410
  */
1322
- count<T extends CountArgs<Schema, Model>>(args?: Subset<T, CountArgs<Schema, Model>>): ZenStackPromise<Schema, CountResult<Schema, Model, T>>;
1411
+ count<T extends CountArgs<Schema, Model>>(args?: Subset<T, CountArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<CountResult<Schema, Model, T>>>;
1323
1412
  /**
1324
1413
  * Aggregates rows.
1325
1414
  * @param args - aggregation args
@@ -1328,7 +1417,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1328
1417
  * @example
1329
1418
  * ```ts
1330
1419
  * // aggregate rows
1331
- * await client.profile.aggregate({
1420
+ * await db.profile.aggregate({
1332
1421
  * where: { email: { endsWith: '@zenstack.dev' } },
1333
1422
  * _count: true,
1334
1423
  * _avg: { age: true },
@@ -1337,7 +1426,7 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1337
1426
  * _max: { age: true }
1338
1427
  * }); // result: `{ _count: number, _avg: { age: number }, ... }`
1339
1428
  */
1340
- aggregate<T extends AggregateArgs<Schema, Model>>(args: Subset<T, AggregateArgs<Schema, Model>>): ZenStackPromise<Schema, AggregateResult<Schema, Model, T>>;
1429
+ aggregate<T extends AggregateArgs<Schema, Model>>(args: Subset<T, AggregateArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<AggregateResult<Schema, Model, T>>>;
1341
1430
  /**
1342
1431
  * Groups rows by columns.
1343
1432
  * @param args - groupBy args
@@ -1346,31 +1435,33 @@ interface ModelOperations<Schema extends SchemaDef, Model extends GetModels<Sche
1346
1435
  * @example
1347
1436
  * ```ts
1348
1437
  * // group by a field
1349
- * await client.profile.groupBy({
1438
+ * await db.profile.groupBy({
1350
1439
  * by: 'country',
1351
1440
  * _count: true
1352
1441
  * }); // result: `Array<{ country: string, _count: number }>`
1353
1442
  *
1354
1443
  * // group by multiple fields
1355
- * await client.profile.groupBy({
1444
+ * await db.profile.groupBy({
1356
1445
  * by: ['country', 'city'],
1357
1446
  * _count: true
1358
1447
  * }); // result: `Array<{ country: string, city: string, _count: number }>`
1359
1448
  *
1360
- * // group by with sorting, the `orderBy` fields must be in the `by` list
1361
- * await client.profile.groupBy({
1449
+ * // group by with sorting, the `orderBy` fields must be either an aggregation
1450
+ * // or a field used in the `by` list
1451
+ * await db.profile.groupBy({
1362
1452
  * by: 'country',
1363
1453
  * orderBy: { country: 'desc' }
1364
1454
  * });
1365
1455
  *
1366
- * // group by with having (post-aggregation filter), the `having` fields must
1367
- * // be in the `by` list
1368
- * await client.profile.groupBy({
1456
+ * // group by with having (post-aggregation filter), the fields used in `having` must
1457
+ * // be either an aggregation, or a field used in the `by` list
1458
+ * await db.profile.groupBy({
1369
1459
  * by: 'country',
1370
- * having: { country: 'US' }
1460
+ * having: { country: 'US', age: { _avg: { gte: 18 } } }
1371
1461
  * });
1372
1462
  */
1373
- groupBy<T extends GroupByArgs<Schema, Model>>(args: Subset<T, GroupByArgs<Schema, Model>>): ZenStackPromise<Schema, GroupByResult<Schema, Model, T>>;
1374
- }
1463
+ groupBy<T extends GroupByArgs<Schema, Model>>(args: Subset<T, GroupByArgs<Schema, Model>>): ZenStackPromise<Schema, Simplify<GroupByResult<Schema, Model, T>>>;
1464
+ };
1465
+ type ModelOperations<Schema extends SchemaDef, Model extends GetModels<Schema>> = Omit<AllModelOperations<Schema, Model>, IsDelegateModel<Schema, Model> extends true ? 'create' | 'createMany' | 'createManyAndReturn' | 'upsert' : never>;
1375
1466
 
1376
- export { type UpdateRelationInput as A, type BatchResult as B, type ClientConstructor as C, type DateTimeFilter as D, type UpdateInput as E, type FindArgs as F, type DeleteArgs as G, type DeleteManyArgs as H, type CountArgs as I, type CountAggregateInput as J, type CountResult as K, type AggregateArgs as L, type ModelResult as M, type NumberFilter as N, type OrderBy as O, type AggregateResult as P, type GroupByArgs as Q, type GroupByResult as R, type StringFilter as S, type ToKysely as T, type UpdateArgs as U, type RuntimePlugin as V, type WhereInput as W, type OnKyselyQueryArgs as X, type ClientContract as a, type ClientOptions as b, type CommonPrimitiveFilter as c, definePlugin as d, type BytesFilter as e, type BooleanFilter as f, type SortOrder as g, type NullsOrder as h, type WhereUniqueInput as i, type SelectIncludeOmit as j, type Subset as k, type SelectSubset as l, type MapFieldType as m, type OptionalFieldsForCreate as n, type OppositeRelationFields as o, type OppositeRelationAndFK as p, type FindUniqueArgs as q, type CreateArgs as r, type CreateManyArgs as s, type CreateManyAndReturnArgs as t, type CreateManyInput as u, type CreateInput as v, type UpdateManyArgs as w, type UpdateManyAndReturnArgs as x, type UpsertArgs as y, type UpdateScalarInput as z };
1467
+ export { type DeleteArgs as A, type BatchResult as B, type ClientConstructor as C, type DateTimeFilter as D, type DeleteManyArgs as E, type FindArgs as F, type CountArgs as G, type CountResult as H, type IncludeInput as I, type JsonArray as J, type AggregateArgs as K, type AggregateResult as L, type ModelResult as M, type NumberFilter as N, type OrderBy as O, type GroupByArgs as P, type GroupByResult as Q, type RuntimePlugin as R, type SimplifiedModelResult as S, type ToKysely as T, type UpdateArgs as U, type OnKyselyQueryArgs as V, type WhereInput as W, type ZenStackPromise as Z, type JsonObject as a, type JsonValue as b, type ClientContract as c, type ClientOptions as d, definePlugin as e, type TypeDefResult as f, type StringFilter as g, type BytesFilter as h, type BooleanFilter as i, type SortOrder as j, type NullsOrder as k, type WhereUniqueInput as l, type OmitInput as m, type SelectIncludeOmit as n, type SelectInput as o, type Subset as p, type SelectSubset as q, type FindManyArgs as r, type FindFirstArgs as s, type FindUniqueArgs as t, type CreateArgs as u, type CreateManyArgs as v, type CreateManyAndReturnArgs as w, type UpdateManyArgs as x, type UpdateManyAndReturnArgs as y, type UpsertArgs as z };