@prisma-next/sql-contract-ts 0.5.0-dev.9 → 0.6.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/config-types.d.mts.map +1 -1
- package/dist/config-types.mjs +1 -2
- package/dist/config-types.mjs.map +1 -1
- package/dist/contract-builder.d.mts +257 -223
- package/dist/contract-builder.d.mts.map +1 -1
- package/dist/contract-builder.mjs +83 -101
- package/dist/contract-builder.mjs.map +1 -1
- package/package.json +14 -13
- package/src/authoring-type-utils.ts +15 -13
- package/src/build-contract.ts +47 -25
- package/src/composed-authoring-helpers.ts +49 -55
- package/src/contract-definition.ts +9 -9
- package/src/contract-dsl.ts +83 -58
- package/src/contract-lowering.ts +6 -5
- package/src/contract-types.ts +33 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { ColumnDefault, ColumnDefaultLiteralInputValue, Contract, ContractRelation, ExecutionMutationDefaultValue, StorageHashBase } from "@prisma-next/contract/types";
|
|
1
|
+
import { ColumnDefault, ColumnDefaultLiteralInputValue, Contract, ContractRelation, ExecutionMutationDefaultPhases, ExecutionMutationDefaultPhases as ExecutionMutationDefaultPhases$1, ExecutionMutationDefaultValue, StorageHashBase } from "@prisma-next/contract/types";
|
|
2
|
+
import { IndexTypeRegistration } from "@prisma-next/sql-contract/index-types";
|
|
2
3
|
import { ContractWithTypeMaps, Index as Index$1, ReferentialAction, SqlStorage, StorageTypeInstance, TypeMaps } from "@prisma-next/sql-contract/types";
|
|
3
4
|
import { AuthoringArgumentDescriptor, AuthoringFieldNamespace, AuthoringFieldPresetDescriptor, AuthoringTypeConstructorDescriptor, AuthoringTypeNamespace } from "@prisma-next/framework-components/authoring";
|
|
4
|
-
import {
|
|
5
|
-
import { CodecLookup } from "@prisma-next/framework-components/codec";
|
|
5
|
+
import { ForeignKeyDefaultsState } from "@prisma-next/contract-authoring";
|
|
6
|
+
import { CodecLookup, ColumnTypeDescriptor } from "@prisma-next/framework-components/codec";
|
|
6
7
|
import { ExtensionPackRef, FamilyPackRef, TargetPackRef } from "@prisma-next/framework-components/components";
|
|
7
8
|
|
|
8
9
|
//#region src/contract-dsl.d.ts
|
|
@@ -12,25 +13,25 @@ type NamingConfig = {
|
|
|
12
13
|
readonly columns?: NamingStrategy;
|
|
13
14
|
};
|
|
14
15
|
type NamedStorageTypeRef = string | StorageTypeInstance;
|
|
15
|
-
type NamedConstraintNameSpec<Name
|
|
16
|
-
readonly name: Name
|
|
16
|
+
type NamedConstraintNameSpec<Name extends string = string> = {
|
|
17
|
+
readonly name: Name;
|
|
17
18
|
};
|
|
18
|
-
type ScalarFieldState<CodecId
|
|
19
|
+
type ScalarFieldState<CodecId extends string = string, TypeRef extends NamedStorageTypeRef | undefined = undefined, Nullable extends boolean = boolean, ColumnName extends string | undefined = string | undefined, IdSpec extends NamedConstraintSpec | undefined = undefined, UniqueSpec extends NamedConstraintSpec | undefined = undefined> = {
|
|
19
20
|
readonly kind: 'scalar';
|
|
20
21
|
readonly descriptor?: (ColumnTypeDescriptor & {
|
|
21
|
-
readonly codecId: CodecId
|
|
22
|
+
readonly codecId: CodecId;
|
|
22
23
|
}) | undefined;
|
|
23
|
-
readonly typeRef?: TypeRef
|
|
24
|
-
readonly nullable: Nullable
|
|
24
|
+
readonly typeRef?: TypeRef | undefined;
|
|
25
|
+
readonly nullable: Nullable;
|
|
25
26
|
readonly columnName?: ColumnName | undefined;
|
|
26
27
|
readonly default?: ColumnDefault | undefined;
|
|
27
|
-
readonly
|
|
28
|
-
} & (IdSpec
|
|
29
|
-
readonly id: IdSpec
|
|
28
|
+
readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;
|
|
29
|
+
} & (IdSpec extends NamedConstraintSpec ? {
|
|
30
|
+
readonly id: IdSpec;
|
|
30
31
|
} : {
|
|
31
32
|
readonly id?: undefined;
|
|
32
|
-
}) & (UniqueSpec
|
|
33
|
-
readonly unique: UniqueSpec
|
|
33
|
+
}) & (UniqueSpec extends NamedConstraintSpec ? {
|
|
34
|
+
readonly unique: UniqueSpec;
|
|
34
35
|
} : {
|
|
35
36
|
readonly unique?: undefined;
|
|
36
37
|
});
|
|
@@ -43,7 +44,7 @@ type AnyScalarFieldState = {
|
|
|
43
44
|
readonly nullable: boolean;
|
|
44
45
|
readonly columnName?: string | undefined;
|
|
45
46
|
readonly default?: ColumnDefault | undefined;
|
|
46
|
-
readonly
|
|
47
|
+
readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;
|
|
47
48
|
readonly id?: NamedConstraintSpec | undefined;
|
|
48
49
|
readonly unique?: NamedConstraintSpec | undefined;
|
|
49
50
|
};
|
|
@@ -80,8 +81,8 @@ declare class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFi
|
|
|
80
81
|
column<ColumnName extends string>(name: ColumnName): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, string | undefined, infer IdSpec, infer UniqueSpec> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec> : never>;
|
|
81
82
|
default(value: ColumnDefaultLiteralInputValue | ColumnDefault): ScalarFieldBuilder<State>;
|
|
82
83
|
defaultSql(expression: string): ScalarFieldBuilder<State>;
|
|
83
|
-
id<const Name
|
|
84
|
-
unique<const Name
|
|
84
|
+
id<const Name extends string | undefined = undefined>(options?: NamedConstraintSpec<Name>): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, NamedConstraintSpec | undefined, infer UniqueSpec> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, NamedConstraintSpec<Name>, UniqueSpec> : never>;
|
|
85
|
+
unique<const Name extends string | undefined = undefined>(options?: NamedConstraintSpec<Name>): ScalarFieldBuilder<State extends ScalarFieldState<infer CodecId, infer TypeRef, infer Nullable, infer ColumnName, infer IdSpec, NamedConstraintSpec | undefined> ? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name>> : never>;
|
|
85
86
|
sql<const Spec extends FieldSqlSpecForState<State>>(spec: Spec): ScalarFieldBuilder<ApplyFieldSqlSpec<State, Spec>>;
|
|
86
87
|
build(): State;
|
|
87
88
|
}
|
|
@@ -89,44 +90,44 @@ declare function columnField<Descriptor extends ColumnTypeDescriptor>(descriptor
|
|
|
89
90
|
declare function generatedField<Descriptor extends ColumnTypeDescriptor>(spec: GeneratedFieldSpec & {
|
|
90
91
|
readonly type: Descriptor;
|
|
91
92
|
}): ScalarFieldBuilder<ScalarFieldState<Descriptor['codecId'], undefined, false, undefined>>;
|
|
92
|
-
declare function namedTypeField<TypeRef
|
|
93
|
-
declare function namedTypeField<TypeRef
|
|
93
|
+
declare function namedTypeField<TypeRef extends string>(typeRef: TypeRef): ScalarFieldBuilder<ScalarFieldState<string, TypeRef, false, undefined>>;
|
|
94
|
+
declare function namedTypeField<TypeRef extends StorageTypeInstance>(typeRef: TypeRef): ScalarFieldBuilder<ScalarFieldState<TypeRef['codecId'], TypeRef, false, undefined>>;
|
|
94
95
|
type RelationModelRefSource = 'string' | 'token' | 'lazyToken';
|
|
95
96
|
type TargetFieldRefSource = 'string' | 'token';
|
|
96
|
-
type EagerRelationModelName<ModelName
|
|
97
|
+
type EagerRelationModelName<ModelName extends string = string, Source extends Exclude<RelationModelRefSource, 'lazyToken'> = Exclude<RelationModelRefSource, 'lazyToken'>> = {
|
|
97
98
|
readonly kind: 'relationModelName';
|
|
98
99
|
readonly source: Source;
|
|
99
|
-
readonly modelName: ModelName
|
|
100
|
+
readonly modelName: ModelName;
|
|
100
101
|
};
|
|
101
|
-
type LazyRelationModelName<ModelName
|
|
102
|
+
type LazyRelationModelName<ModelName extends string = string> = {
|
|
102
103
|
readonly kind: 'lazyRelationModelName';
|
|
103
104
|
readonly source: 'lazyToken';
|
|
104
|
-
readonly resolve: () => ModelName
|
|
105
|
+
readonly resolve: () => ModelName;
|
|
105
106
|
};
|
|
106
|
-
type RelationModelSource<ModelName
|
|
107
|
-
type BelongsToRelation<ToModel
|
|
107
|
+
type RelationModelSource<ModelName extends string = string> = EagerRelationModelName<ModelName> | LazyRelationModelName<ModelName>;
|
|
108
|
+
type BelongsToRelation<ToModel extends string = string, FromField extends string | readonly string[] = string | readonly string[], ToField extends string | readonly string[] = string | readonly string[], SqlSpec extends BelongsToRelationSqlSpec | undefined = undefined> = {
|
|
108
109
|
readonly kind: 'belongsTo';
|
|
109
|
-
readonly toModel: RelationModelSource<ToModel
|
|
110
|
-
readonly from: FromField
|
|
111
|
-
readonly to: ToField
|
|
110
|
+
readonly toModel: RelationModelSource<ToModel>;
|
|
111
|
+
readonly from: FromField;
|
|
112
|
+
readonly to: ToField;
|
|
112
113
|
readonly sql?: SqlSpec;
|
|
113
114
|
};
|
|
114
|
-
type HasManyRelation<ToModel
|
|
115
|
+
type HasManyRelation<ToModel extends string = string, ByField extends string | readonly string[] = string | readonly string[]> = {
|
|
115
116
|
readonly kind: 'hasMany';
|
|
116
|
-
readonly toModel: RelationModelSource<ToModel
|
|
117
|
+
readonly toModel: RelationModelSource<ToModel>;
|
|
117
118
|
readonly by: ByField;
|
|
118
119
|
};
|
|
119
|
-
type HasOneRelation<ToModel
|
|
120
|
+
type HasOneRelation<ToModel extends string = string, ByField extends string | readonly string[] = string | readonly string[]> = {
|
|
120
121
|
readonly kind: 'hasOne';
|
|
121
|
-
readonly toModel: RelationModelSource<ToModel
|
|
122
|
+
readonly toModel: RelationModelSource<ToModel>;
|
|
122
123
|
readonly by: ByField;
|
|
123
124
|
};
|
|
124
|
-
type ManyToManyRelation<ToModel
|
|
125
|
+
type ManyToManyRelation<ToModel extends string = string, ThroughModel extends string = string, FromField extends string | readonly string[] = string | readonly string[], ToField extends string | readonly string[] = string | readonly string[]> = {
|
|
125
126
|
readonly kind: 'manyToMany';
|
|
126
|
-
readonly toModel: RelationModelSource<ToModel
|
|
127
|
+
readonly toModel: RelationModelSource<ToModel>;
|
|
127
128
|
readonly through: RelationModelSource<ThroughModel>;
|
|
128
|
-
readonly from: FromField
|
|
129
|
-
readonly to: ToField
|
|
129
|
+
readonly from: FromField;
|
|
130
|
+
readonly to: ToField;
|
|
130
131
|
};
|
|
131
132
|
type RelationState = BelongsToRelation<string, string | readonly string[], string | readonly string[], BelongsToRelationSqlSpec | undefined> | HasManyRelation | HasOneRelation | ManyToManyRelation;
|
|
132
133
|
type AnyRelationState = RelationState;
|
|
@@ -139,79 +140,82 @@ declare class RelationBuilder<State extends RelationState = AnyRelationState> {
|
|
|
139
140
|
sql<const SqlSpec extends BelongsToRelationSqlSpec>(this: State extends BelongsToRelation<string, string | readonly string[], string | readonly string[], BelongsToRelationSqlSpec | undefined> ? RelationBuilder<State> : never, spec: SqlSpec): RelationBuilder<ApplyBelongsToRelationSqlSpec<State, SqlSpec>>;
|
|
140
141
|
build(): State;
|
|
141
142
|
}
|
|
142
|
-
type ColumnRef<FieldName
|
|
143
|
+
type ColumnRef<FieldName extends string = string> = {
|
|
143
144
|
readonly kind: 'columnRef';
|
|
144
|
-
readonly fieldName: FieldName
|
|
145
|
+
readonly fieldName: FieldName;
|
|
145
146
|
};
|
|
146
|
-
type TargetFieldRef<ModelName
|
|
147
|
+
type TargetFieldRef<ModelName extends string = string, FieldName extends string = string, Source extends TargetFieldRefSource = TargetFieldRefSource> = {
|
|
147
148
|
readonly kind: 'targetFieldRef';
|
|
148
149
|
readonly source: Source;
|
|
149
|
-
readonly modelName: ModelName
|
|
150
|
-
readonly fieldName: FieldName
|
|
151
|
-
};
|
|
152
|
-
type ModelTokenRefs<ModelName
|
|
153
|
-
type ConstraintOptions<Name
|
|
154
|
-
readonly name?: Name
|
|
155
|
-
};
|
|
156
|
-
type
|
|
157
|
-
readonly
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
type
|
|
150
|
+
readonly modelName: ModelName;
|
|
151
|
+
readonly fieldName: FieldName;
|
|
152
|
+
};
|
|
153
|
+
type ModelTokenRefs<ModelName extends string, Fields extends Record<string, ScalarFieldBuilder>> = { readonly [K in keyof Fields]: TargetFieldRef<ModelName, K & string> };
|
|
154
|
+
type ConstraintOptions<Name extends string | undefined = string | undefined> = {
|
|
155
|
+
readonly name?: Name;
|
|
156
|
+
};
|
|
157
|
+
type IndexTypeMap = Record<string, {
|
|
158
|
+
readonly options: unknown;
|
|
159
|
+
}>;
|
|
160
|
+
type IndexInput<Name extends string | undefined, IndexTypes extends IndexTypeMap> = keyof IndexTypes extends never ? ConstraintOptions<Name> : (ConstraintOptions<Name> & {
|
|
161
|
+
readonly type?: never;
|
|
162
|
+
readonly options?: never;
|
|
163
|
+
}) | { readonly [K in keyof IndexTypes & string]: ConstraintOptions<Name> & {
|
|
164
|
+
readonly type: K;
|
|
165
|
+
readonly options: IndexTypes[K]['options'];
|
|
166
|
+
} }[keyof IndexTypes & string];
|
|
167
|
+
type ForeignKeyOptions<Name extends string | undefined = string | undefined> = ConstraintOptions<Name> & {
|
|
161
168
|
readonly onDelete?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';
|
|
162
169
|
readonly onUpdate?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';
|
|
163
170
|
readonly constraint?: boolean;
|
|
164
171
|
readonly index?: boolean;
|
|
165
172
|
};
|
|
166
|
-
type BelongsToRelationSqlSpec<Name
|
|
167
|
-
readonly fk?: ForeignKeyOptions<Name
|
|
173
|
+
type BelongsToRelationSqlSpec<Name extends string | undefined = string | undefined> = {
|
|
174
|
+
readonly fk?: ForeignKeyOptions<Name>;
|
|
168
175
|
};
|
|
169
|
-
type IdConstraint<FieldNames extends readonly string[] = readonly string[], Name
|
|
176
|
+
type IdConstraint<FieldNames extends readonly string[] = readonly string[], Name extends string | undefined = string | undefined> = {
|
|
170
177
|
readonly kind: 'id';
|
|
171
178
|
readonly fields: FieldNames;
|
|
172
|
-
readonly name?: Name
|
|
179
|
+
readonly name?: Name;
|
|
173
180
|
};
|
|
174
181
|
type UniqueConstraint<FieldNames extends readonly string[] = readonly string[]> = {
|
|
175
182
|
readonly kind: 'unique';
|
|
176
183
|
readonly fields: FieldNames;
|
|
177
184
|
readonly name?: string;
|
|
178
185
|
};
|
|
179
|
-
type IndexConstraint<FieldNames extends readonly string[] = readonly string[], Name
|
|
186
|
+
type IndexConstraint<FieldNames extends readonly string[] = readonly string[], Name extends string | undefined = string | undefined> = {
|
|
180
187
|
readonly kind: 'index';
|
|
181
188
|
readonly fields: FieldNames;
|
|
182
|
-
readonly name?: Name
|
|
183
|
-
readonly
|
|
184
|
-
readonly
|
|
189
|
+
readonly name?: Name;
|
|
190
|
+
readonly type?: string;
|
|
191
|
+
readonly options?: Record<string, unknown>;
|
|
185
192
|
};
|
|
186
|
-
type ForeignKeyConstraint<SourceFieldNames extends readonly string[] = readonly string[], TargetModelName extends string = string, TargetFieldNames extends readonly string[] = readonly string[], Name
|
|
193
|
+
type ForeignKeyConstraint<SourceFieldNames extends readonly string[] = readonly string[], TargetModelName extends string = string, TargetFieldNames extends readonly string[] = readonly string[], Name extends string | undefined = string | undefined> = {
|
|
187
194
|
readonly kind: 'fk';
|
|
188
195
|
readonly fields: SourceFieldNames;
|
|
189
196
|
readonly targetModel: TargetModelName;
|
|
190
197
|
readonly targetFields: TargetFieldNames;
|
|
191
198
|
readonly targetSource?: TargetFieldRefSource;
|
|
192
|
-
readonly name?: Name
|
|
199
|
+
readonly name?: Name;
|
|
193
200
|
readonly onDelete?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';
|
|
194
201
|
readonly onUpdate?: 'noAction' | 'restrict' | 'cascade' | 'setNull' | 'setDefault';
|
|
195
202
|
readonly constraint?: boolean;
|
|
196
203
|
readonly index?: boolean;
|
|
197
204
|
};
|
|
198
|
-
declare function createConstraintsDsl(): {
|
|
199
|
-
ref: <ModelName
|
|
205
|
+
declare function createConstraintsDsl<IndexTypes extends IndexTypeMap = Record<never, never>>(): {
|
|
206
|
+
ref: <ModelName extends string, FieldName extends string>(modelName: ModelName, fieldName: FieldName) => TargetFieldRef<ModelName, FieldName>;
|
|
200
207
|
id: {
|
|
201
|
-
<FieldName
|
|
202
|
-
<FieldNames extends readonly string[], Name
|
|
208
|
+
<FieldName extends string, Name extends string | undefined = undefined>(field: ColumnRef<FieldName>, options?: NamedConstraintSpec<Name>): IdConstraint<readonly [FieldName], Name>;
|
|
209
|
+
<FieldNames extends readonly string[], Name extends string | undefined = undefined>(fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> }, options?: NamedConstraintSpec<Name>): IdConstraint<FieldNames, Name>;
|
|
203
210
|
};
|
|
204
211
|
unique: {
|
|
205
|
-
<FieldName
|
|
212
|
+
<FieldName extends string>(field: ColumnRef<FieldName>, options?: ConstraintOptions): UniqueConstraint<readonly [FieldName]>;
|
|
206
213
|
<FieldNames extends readonly string[]>(fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> }, options?: ConstraintOptions): UniqueConstraint<FieldNames>;
|
|
207
214
|
};
|
|
208
|
-
index: {
|
|
209
|
-
<FieldName$1 extends string, Name$1 extends string | undefined = undefined>(field: ColumnRef<FieldName$1>, options?: IndexOptions<Name$1>): IndexConstraint<readonly [FieldName$1], Name$1>;
|
|
210
|
-
<FieldNames extends readonly string[], Name$1 extends string | undefined = undefined>(fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> }, options?: IndexOptions<Name$1>): IndexConstraint<FieldNames, Name$1>;
|
|
211
|
-
};
|
|
215
|
+
index: <FieldNames extends readonly string[], Name extends string | undefined = undefined>(fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> }, options?: IndexInput<Name, IndexTypes>) => IndexConstraint<FieldNames, Name>;
|
|
212
216
|
foreignKey: {
|
|
213
|
-
<SourceFieldName extends string, TargetModelName extends string, TargetFieldName extends string, Name
|
|
214
|
-
<SourceFieldNames extends readonly string[], TargetModelName extends string, TargetFieldNames extends readonly string[], Name
|
|
217
|
+
<SourceFieldName extends string, TargetModelName extends string, TargetFieldName extends string, Name extends string | undefined = undefined>(field: ColumnRef<SourceFieldName>, target: TargetFieldRef<TargetModelName, TargetFieldName>, options?: ForeignKeyOptions<Name>): ForeignKeyConstraint<readonly [SourceFieldName], TargetModelName, readonly [TargetFieldName], Name>;
|
|
218
|
+
<SourceFieldNames extends readonly string[], TargetModelName extends string, TargetFieldNames extends readonly string[], Name extends string | undefined = undefined>(fields: { readonly [K in keyof SourceFieldNames]: ColumnRef<SourceFieldNames[K] & string> }, target: { readonly [K in keyof TargetFieldNames]: TargetFieldRef<TargetModelName, TargetFieldNames[K] & string> }, options?: ForeignKeyOptions<Name>): ForeignKeyConstraint<SourceFieldNames, TargetModelName, TargetFieldNames, Name>;
|
|
215
219
|
};
|
|
216
220
|
};
|
|
217
221
|
type ConstraintsDsl = ReturnType<typeof createConstraintsDsl>;
|
|
@@ -224,32 +228,38 @@ type SqlStageSpec = {
|
|
|
224
228
|
readonly indexes?: readonly IndexConstraint[];
|
|
225
229
|
readonly foreignKeys?: readonly ForeignKeyConstraint[];
|
|
226
230
|
};
|
|
227
|
-
type FieldRefs<Fields
|
|
228
|
-
type AttributeContext<Fields
|
|
229
|
-
readonly fields: FieldRefs<Fields
|
|
231
|
+
type FieldRefs<Fields extends Record<string, ScalarFieldBuilder>> = { readonly [K in keyof Fields]: ColumnRef<K & string> };
|
|
232
|
+
type AttributeContext<Fields extends Record<string, ScalarFieldBuilder>> = {
|
|
233
|
+
readonly fields: FieldRefs<Fields>;
|
|
230
234
|
readonly constraints: Pick<ConstraintsDsl, 'id' | 'unique'>;
|
|
231
235
|
};
|
|
232
|
-
type
|
|
233
|
-
|
|
234
|
-
readonly
|
|
236
|
+
type PackAwareIndex<IndexTypes extends IndexTypeMap> = <FieldNames extends readonly string[], Name extends string | undefined = undefined>(fields: { readonly [K in keyof FieldNames]: ColumnRef<FieldNames[K] & string> }, options?: IndexInput<Name, IndexTypes>) => IndexConstraint<FieldNames, Name>;
|
|
237
|
+
type PackAwareSqlConstraints<IndexTypes extends IndexTypeMap> = {
|
|
238
|
+
readonly foreignKey: ConstraintsDsl['foreignKey'];
|
|
239
|
+
readonly ref: ConstraintsDsl['ref'];
|
|
240
|
+
readonly index: PackAwareIndex<IndexTypes>;
|
|
241
|
+
};
|
|
242
|
+
type SqlContext<Fields extends Record<string, ScalarFieldBuilder>, IndexTypes extends IndexTypeMap = Record<never, never>> = {
|
|
243
|
+
readonly cols: FieldRefs<Fields>;
|
|
244
|
+
readonly constraints: PackAwareSqlConstraints<IndexTypes>;
|
|
235
245
|
};
|
|
236
246
|
type StageInput<Context, Spec> = Spec | ((context: Context) => Spec);
|
|
237
|
-
type StaticLiteralName<Name
|
|
247
|
+
type StaticLiteralName<Name> = Name extends string ? (string extends Name ? never : Name) : never;
|
|
238
248
|
type NamedConstraintLiteralName<Constraint> = Constraint extends {
|
|
239
249
|
readonly name?: infer Name;
|
|
240
250
|
} ? StaticLiteralName<Name> : never;
|
|
241
251
|
type DuplicateLiteralNames<Items extends readonly unknown[], Seen extends string = never, Duplicates extends string = never> = Items extends readonly [infer First, ...infer Rest extends readonly unknown[]] ? NamedConstraintLiteralName<First> extends infer Name extends string ? Name extends Seen ? DuplicateLiteralNames<Rest, Seen, Duplicates | Name> : DuplicateLiteralNames<Rest, Seen | Name, Duplicates> : DuplicateLiteralNames<Rest, Seen, Duplicates> : Duplicates;
|
|
242
|
-
type InlineIdLiteralName<Fields
|
|
252
|
+
type InlineIdLiteralName<Fields extends Record<string, ScalarFieldBuilder>> = { readonly [FieldName in keyof Fields]: FieldStateOf<Fields[FieldName]> extends {
|
|
243
253
|
readonly id: {
|
|
244
254
|
readonly name?: infer Name;
|
|
245
255
|
};
|
|
246
|
-
} ? StaticLiteralName<Name> : never }[keyof Fields
|
|
256
|
+
} ? StaticLiteralName<Name> : never }[keyof Fields];
|
|
247
257
|
type AttributeIdLiteralName<AttributesSpec extends ModelAttributesSpec | undefined> = AttributesSpec extends {
|
|
248
258
|
readonly id?: {
|
|
249
259
|
readonly name?: infer Name;
|
|
250
260
|
};
|
|
251
261
|
} ? StaticLiteralName<Name> : never;
|
|
252
|
-
type ModelIdLiteralName<Fields
|
|
262
|
+
type ModelIdLiteralName<Fields extends Record<string, ScalarFieldBuilder>, AttributesSpec extends ModelAttributesSpec | undefined> = [AttributeIdLiteralName<AttributesSpec>] extends [never] ? InlineIdLiteralName<Fields> : AttributeIdLiteralName<AttributesSpec>;
|
|
253
263
|
type SqlIndexes<SqlSpec extends SqlStageSpec> = SqlSpec extends {
|
|
254
264
|
readonly indexes?: infer Indexes extends readonly unknown[];
|
|
255
265
|
} ? Indexes : readonly [];
|
|
@@ -257,43 +267,44 @@ type SqlForeignKeys<SqlSpec extends SqlStageSpec> = SqlSpec extends {
|
|
|
257
267
|
readonly foreignKeys?: infer ForeignKeys extends readonly unknown[];
|
|
258
268
|
} ? ForeignKeys : readonly [];
|
|
259
269
|
type SqlNamedObjects<SqlSpec extends SqlStageSpec> = [...SqlIndexes<SqlSpec>, ...SqlForeignKeys<SqlSpec>];
|
|
260
|
-
type ValidateSqlStageSpec<Fields
|
|
261
|
-
type ValidateAttributesStageSpec<Fields
|
|
262
|
-
declare class ContractModelBuilder<ModelName
|
|
270
|
+
type ValidateSqlStageSpec<Fields extends Record<string, ScalarFieldBuilder>, AttributesSpec extends ModelAttributesSpec | undefined, SqlSpec extends SqlStageSpec> = [DuplicateLiteralNames<SqlNamedObjects<SqlSpec>>] extends [never] ? [Extract<ModelIdLiteralName<Fields, AttributesSpec>, NamedConstraintLiteralName<SqlNamedObjects<SqlSpec>[number]>>] extends [never] ? SqlSpec : never : never;
|
|
271
|
+
type ValidateAttributesStageSpec<Fields extends Record<string, ScalarFieldBuilder>, SqlSpec extends SqlStageSpec | undefined, AttributesSpec extends ModelAttributesSpec> = SqlSpec extends SqlStageSpec ? [Extract<ModelIdLiteralName<Fields, AttributesSpec>, NamedConstraintLiteralName<SqlNamedObjects<SqlSpec>[number]>>] extends [never] ? AttributesSpec : never : AttributesSpec;
|
|
272
|
+
declare class ContractModelBuilder<ModelName extends string | undefined, Fields extends Record<string, ScalarFieldBuilder>, Relations extends Record<string, AnyRelationBuilder> = Record<never, never>, AttributesSpec extends ModelAttributesSpec | undefined = undefined, SqlSpec extends SqlStageSpec | undefined = undefined, IndexTypes extends IndexTypeMap = Record<never, never>> {
|
|
263
273
|
readonly stageOne: {
|
|
264
|
-
readonly modelName?: ModelName
|
|
265
|
-
readonly fields: Fields
|
|
274
|
+
readonly modelName?: ModelName;
|
|
275
|
+
readonly fields: Fields;
|
|
266
276
|
readonly relations: Relations;
|
|
267
277
|
};
|
|
268
|
-
readonly attributesFactory?: StageInput<AttributeContext<Fields
|
|
269
|
-
readonly sqlFactory?: StageInput<SqlContext<Fields
|
|
270
|
-
readonly __name: ModelName
|
|
271
|
-
readonly __fields: Fields
|
|
278
|
+
readonly attributesFactory?: StageInput<AttributeContext<Fields>, AttributesSpec> | undefined;
|
|
279
|
+
readonly sqlFactory?: StageInput<SqlContext<Fields, IndexTypes>, SqlSpec> | undefined;
|
|
280
|
+
readonly __name: ModelName;
|
|
281
|
+
readonly __fields: Fields;
|
|
272
282
|
readonly __relations: Relations;
|
|
273
283
|
readonly __attributes: AttributesSpec;
|
|
274
284
|
readonly __sql: SqlSpec;
|
|
275
|
-
readonly
|
|
285
|
+
readonly __indexTypes: IndexTypes;
|
|
286
|
+
readonly refs: ModelName extends string ? ModelTokenRefs<ModelName, Fields> : never;
|
|
276
287
|
constructor(stageOne: {
|
|
277
|
-
readonly modelName?: ModelName
|
|
278
|
-
readonly fields: Fields
|
|
288
|
+
readonly modelName?: ModelName;
|
|
289
|
+
readonly fields: Fields;
|
|
279
290
|
readonly relations: Relations;
|
|
280
|
-
}, attributesFactory?: StageInput<AttributeContext<Fields
|
|
281
|
-
ref<FieldName
|
|
282
|
-
relations<const NextRelations extends Record<string, AnyRelationBuilder>>(relations: NextRelations): ContractModelBuilder<ModelName
|
|
283
|
-
attributes<const NextAttributesSpec extends ModelAttributesSpec>(specOrFactory: StageInput<AttributeContext<Fields
|
|
284
|
-
sql<const NextSqlSpec extends SqlStageSpec>(specOrFactory: StageInput<SqlContext<Fields
|
|
291
|
+
}, attributesFactory?: StageInput<AttributeContext<Fields>, AttributesSpec> | undefined, sqlFactory?: StageInput<SqlContext<Fields, IndexTypes>, SqlSpec> | undefined);
|
|
292
|
+
ref<FieldName extends keyof Fields & string>(this: ModelName extends string ? ContractModelBuilder<ModelName, Fields, Relations, AttributesSpec, SqlSpec, IndexTypes> : never, fieldName: FieldName): TargetFieldRef<ModelName & string, FieldName>;
|
|
293
|
+
relations<const NextRelations extends Record<string, AnyRelationBuilder>>(relations: NextRelations): ContractModelBuilder<ModelName, Fields, Relations & NextRelations, AttributesSpec, SqlSpec, IndexTypes>;
|
|
294
|
+
attributes<const NextAttributesSpec extends ModelAttributesSpec>(specOrFactory: StageInput<AttributeContext<Fields>, ValidateAttributesStageSpec<Fields, SqlSpec, NextAttributesSpec>>): ContractModelBuilder<ModelName, Fields, Relations, NextAttributesSpec, SqlSpec, IndexTypes>;
|
|
295
|
+
sql<const NextSqlSpec extends SqlStageSpec>(specOrFactory: StageInput<SqlContext<Fields, IndexTypes>, NextSqlSpec>): [ValidateSqlStageSpec<Fields, AttributesSpec, NextSqlSpec>] extends [never] ? ContractModelBuilder<ModelName, Fields, Relations, AttributesSpec, never, IndexTypes> : ContractModelBuilder<ModelName, Fields, Relations, AttributesSpec, NextSqlSpec, IndexTypes>;
|
|
285
296
|
buildAttributesSpec(): AttributesSpec;
|
|
286
297
|
buildSqlSpec(): SqlSpec;
|
|
287
298
|
}
|
|
288
|
-
type NamedModelTokenShape<ModelName
|
|
299
|
+
type NamedModelTokenShape<ModelName extends string = string, Fields extends Record<string, ScalarFieldBuilder> = Record<string, ScalarFieldBuilder>> = {
|
|
289
300
|
readonly stageOne: {
|
|
290
|
-
readonly modelName?: ModelName
|
|
291
|
-
readonly fields: Fields
|
|
301
|
+
readonly modelName?: ModelName;
|
|
302
|
+
readonly fields: Fields;
|
|
292
303
|
};
|
|
293
304
|
};
|
|
294
305
|
type AnyNamedModelToken = NamedModelTokenShape<string, Record<string, ScalarFieldBuilder>>;
|
|
295
|
-
type LazyNamedModelToken<Token
|
|
296
|
-
type RelationFieldSelection<FieldName
|
|
306
|
+
type LazyNamedModelToken<Token extends AnyNamedModelToken = AnyNamedModelToken> = () => Token;
|
|
307
|
+
type RelationFieldSelection<FieldName extends string> = FieldName | readonly FieldName[];
|
|
297
308
|
type RelationModelName<Target> = Target extends NamedModelTokenShape<infer ModelName extends string, Record<string, ScalarFieldBuilder>> ? ModelName : Target extends (() => infer Token) ? RelationModelName<Token> : never;
|
|
298
309
|
type RelationModelFieldNames<Target> = Target extends NamedModelTokenShape<string, infer Fields> ? keyof Fields & string : Target extends (() => infer Token) ? RelationModelFieldNames<Token> : never;
|
|
299
310
|
type ContractInput<Family extends FamilyPackRef<string> = FamilyPackRef<string>, Target extends TargetPackRef<'sql', string> = TargetPackRef<'sql', string>, Types extends Record<string, StorageTypeInstance> = Record<never, never>, Models extends Record<string, ContractModelBuilder<string | undefined, Record<string, ScalarFieldBuilder>, Record<string, AnyRelationBuilder>, ModelAttributesSpec | undefined, SqlStageSpec | undefined>> = Record<never, never>, ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined = undefined, Capabilities extends Record<string, Record<string, boolean>> | undefined = undefined> = {
|
|
@@ -308,44 +319,44 @@ type ContractInput<Family extends FamilyPackRef<string> = FamilyPackRef<string>,
|
|
|
308
319
|
readonly models?: Models;
|
|
309
320
|
readonly codecLookup?: CodecLookup;
|
|
310
321
|
};
|
|
311
|
-
declare function model<const ModelName
|
|
312
|
-
readonly fields: Fields
|
|
322
|
+
declare function model<const ModelName extends string, Fields extends Record<string, ScalarFieldBuilder>, Relations extends Record<string, AnyRelationBuilder> = Record<never, never>>(modelName: ModelName, input: {
|
|
323
|
+
readonly fields: Fields;
|
|
313
324
|
readonly relations?: Relations;
|
|
314
|
-
}): ContractModelBuilder<ModelName
|
|
315
|
-
declare function model<Fields
|
|
316
|
-
readonly fields: Fields
|
|
325
|
+
}): ContractModelBuilder<ModelName, Fields, Relations>;
|
|
326
|
+
declare function model<Fields extends Record<string, ScalarFieldBuilder>, Relations extends Record<string, AnyRelationBuilder> = Record<never, never>>(input: {
|
|
327
|
+
readonly fields: Fields;
|
|
317
328
|
readonly relations?: Relations;
|
|
318
|
-
}): ContractModelBuilder<undefined, Fields
|
|
319
|
-
declare function belongsTo<Token
|
|
320
|
-
readonly from: FromField
|
|
321
|
-
readonly to: ToField
|
|
322
|
-
}): RelationBuilder<BelongsToRelation<RelationModelName<Token
|
|
323
|
-
declare function belongsTo<ToModel
|
|
324
|
-
readonly from: FromField
|
|
325
|
-
readonly to: ToField
|
|
326
|
-
}): RelationBuilder<BelongsToRelation<ToModel
|
|
327
|
-
declare function hasMany<Token
|
|
329
|
+
}): ContractModelBuilder<undefined, Fields, Relations>;
|
|
330
|
+
declare function belongsTo<Token extends AnyNamedModelToken, FromField extends string | readonly string[], ToField extends RelationFieldSelection<RelationModelFieldNames<Token>>>(toModel: Token | LazyNamedModelToken<Token>, options: {
|
|
331
|
+
readonly from: FromField;
|
|
332
|
+
readonly to: ToField;
|
|
333
|
+
}): RelationBuilder<BelongsToRelation<RelationModelName<Token>, FromField, ToField>>;
|
|
334
|
+
declare function belongsTo<ToModel extends string, FromField extends string | readonly string[], ToField extends string | readonly string[]>(toModel: ToModel, options: {
|
|
335
|
+
readonly from: FromField;
|
|
336
|
+
readonly to: ToField;
|
|
337
|
+
}): RelationBuilder<BelongsToRelation<ToModel, FromField, ToField>>;
|
|
338
|
+
declare function hasMany<Token extends AnyNamedModelToken, ByField extends RelationFieldSelection<RelationModelFieldNames<Token>>>(toModel: Token | LazyNamedModelToken<Token>, options: {
|
|
328
339
|
readonly by: ByField;
|
|
329
|
-
}): RelationBuilder<HasManyRelation<RelationModelName<Token
|
|
330
|
-
declare function hasMany<ToModel
|
|
340
|
+
}): RelationBuilder<HasManyRelation<RelationModelName<Token>, ByField>>;
|
|
341
|
+
declare function hasMany<ToModel extends string, ByField extends string | readonly string[]>(toModel: ToModel, options: {
|
|
331
342
|
readonly by: ByField;
|
|
332
|
-
}): RelationBuilder<HasManyRelation<ToModel
|
|
333
|
-
declare function hasOne<Token
|
|
343
|
+
}): RelationBuilder<HasManyRelation<ToModel, ByField>>;
|
|
344
|
+
declare function hasOne<Token extends AnyNamedModelToken, ByField extends RelationFieldSelection<RelationModelFieldNames<Token>>>(toModel: Token | LazyNamedModelToken<Token>, options: {
|
|
334
345
|
readonly by: ByField;
|
|
335
|
-
}): RelationBuilder<HasOneRelation<RelationModelName<Token
|
|
336
|
-
declare function hasOne<ToModel
|
|
346
|
+
}): RelationBuilder<HasOneRelation<RelationModelName<Token>, ByField>>;
|
|
347
|
+
declare function hasOne<ToModel extends string, ByField extends string | readonly string[]>(toModel: ToModel, options: {
|
|
337
348
|
readonly by: ByField;
|
|
338
|
-
}): RelationBuilder<HasOneRelation<ToModel
|
|
339
|
-
declare function manyToMany<ToToken extends AnyNamedModelToken, ThroughToken extends AnyNamedModelToken, FromField
|
|
349
|
+
}): RelationBuilder<HasOneRelation<ToModel, ByField>>;
|
|
350
|
+
declare function manyToMany<ToToken extends AnyNamedModelToken, ThroughToken extends AnyNamedModelToken, FromField extends RelationFieldSelection<RelationModelFieldNames<ThroughToken>>, ToField extends RelationFieldSelection<RelationModelFieldNames<ThroughToken>>>(toModel: ToToken | LazyNamedModelToken<ToToken>, options: {
|
|
340
351
|
readonly through: ThroughToken | LazyNamedModelToken<ThroughToken>;
|
|
341
|
-
readonly from: FromField
|
|
342
|
-
readonly to: ToField
|
|
343
|
-
}): RelationBuilder<ManyToManyRelation<RelationModelName<ToToken>, RelationModelName<ThroughToken>, FromField
|
|
344
|
-
declare function manyToMany<ToModel
|
|
352
|
+
readonly from: FromField;
|
|
353
|
+
readonly to: ToField;
|
|
354
|
+
}): RelationBuilder<ManyToManyRelation<RelationModelName<ToToken>, RelationModelName<ThroughToken>, FromField, ToField>>;
|
|
355
|
+
declare function manyToMany<ToModel extends string, ThroughModel extends string, FromField extends string | readonly string[], ToField extends string | readonly string[]>(toModel: ToModel, options: {
|
|
345
356
|
readonly through: ThroughModel;
|
|
346
|
-
readonly from: FromField
|
|
347
|
-
readonly to: ToField
|
|
348
|
-
}): RelationBuilder<ManyToManyRelation<ToModel
|
|
357
|
+
readonly from: FromField;
|
|
358
|
+
readonly to: ToField;
|
|
359
|
+
}): RelationBuilder<ManyToManyRelation<ToModel, ThroughModel, FromField, ToField>>;
|
|
349
360
|
declare const rel: {
|
|
350
361
|
belongsTo: typeof belongsTo;
|
|
351
362
|
hasMany: typeof hasMany;
|
|
@@ -365,17 +376,19 @@ type AttributeStageIdFieldNames<T> = T extends {
|
|
|
365
376
|
//#endregion
|
|
366
377
|
//#region src/authoring-type-utils.d.ts
|
|
367
378
|
type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends ((value: infer I) => void) ? I : never;
|
|
368
|
-
type NamedConstraintSpec<Name
|
|
369
|
-
readonly name?: Name
|
|
379
|
+
type NamedConstraintSpec<Name extends string | undefined = string | undefined> = {
|
|
380
|
+
readonly name?: Name;
|
|
370
381
|
};
|
|
371
|
-
type NamedConstraintState<Enabled extends boolean, Name
|
|
372
|
-
type OptionalObjectArgumentKeys<Properties
|
|
382
|
+
type NamedConstraintState<Enabled extends boolean, Name extends string | undefined = undefined> = Enabled extends true ? NamedConstraintSpec<Name> : undefined;
|
|
383
|
+
type OptionalObjectArgumentKeys<Properties extends Record<string, AuthoringArgumentDescriptor>> = { readonly [K in keyof Properties]: Properties[K] extends {
|
|
373
384
|
readonly optional: true;
|
|
374
|
-
} ? K : never }[keyof Properties
|
|
375
|
-
type ObjectArgumentType<Properties
|
|
385
|
+
} ? K : never }[keyof Properties];
|
|
386
|
+
type ObjectArgumentType<Properties extends Record<string, AuthoringArgumentDescriptor>> = { readonly [K in Exclude<keyof Properties, OptionalObjectArgumentKeys<Properties>>]: ArgTypeFromDescriptor<Properties[K]> } & { readonly [K in OptionalObjectArgumentKeys<Properties>]?: ArgTypeFromDescriptor<Properties[K]> };
|
|
376
387
|
type ArgTypeFromDescriptor<Arg extends AuthoringArgumentDescriptor> = Arg extends {
|
|
377
388
|
readonly kind: 'string';
|
|
378
389
|
} ? string : Arg extends {
|
|
390
|
+
readonly kind: 'boolean';
|
|
391
|
+
} ? boolean : Arg extends {
|
|
379
392
|
readonly kind: 'number';
|
|
380
393
|
} ? number : Arg extends {
|
|
381
394
|
readonly kind: 'stringArray';
|
|
@@ -383,64 +396,31 @@ type ArgTypeFromDescriptor<Arg extends AuthoringArgumentDescriptor> = Arg extend
|
|
|
383
396
|
readonly kind: 'object';
|
|
384
397
|
readonly properties: infer Properties extends Record<string, AuthoringArgumentDescriptor>;
|
|
385
398
|
} ? ObjectArgumentType<Properties> : never;
|
|
386
|
-
type TupleFromArgumentDescriptors<Args
|
|
399
|
+
type TupleFromArgumentDescriptors<Args extends readonly AuthoringArgumentDescriptor[]> = { readonly [K in keyof Args]: Args[K] extends AuthoringArgumentDescriptor ? ArgTypeFromDescriptor<Args[K]> : never };
|
|
387
400
|
type SupportsNamedConstraintOptions<Descriptor extends AuthoringFieldPresetDescriptor> = Descriptor['output'] extends {
|
|
388
401
|
readonly id: true;
|
|
389
402
|
} ? true : Descriptor['output'] extends {
|
|
390
403
|
readonly unique: true;
|
|
391
404
|
} ? true : false;
|
|
392
|
-
type ResolveTemplateValue<Template, Args
|
|
405
|
+
type ResolveTemplateValue<Template, Args extends readonly unknown[]> = Template extends {
|
|
393
406
|
readonly kind: 'arg';
|
|
394
407
|
readonly index: infer Index extends number;
|
|
395
408
|
readonly path?: infer Path extends readonly string[] | undefined;
|
|
396
409
|
readonly default?: infer Default;
|
|
397
|
-
} ? ResolveTemplateArgValue<Args
|
|
398
|
-
type ResolveTemplatePathValue<Value, Path
|
|
399
|
-
type ResolveTemplateDefaultValue<Value, Default
|
|
400
|
-
type ResolveTemplateArgValue<Value, Path
|
|
401
|
-
type FieldBuilderFromPresetDescriptor<Descriptor extends AuthoringFieldPresetDescriptor, Args
|
|
410
|
+
} ? ResolveTemplateArgValue<Args[Index], Path, Default, Args> : Template extends readonly unknown[] ? { readonly [K in keyof Template]: ResolveTemplateValue<Template[K], Args> } : Template extends Record<string, unknown> ? { readonly [K in keyof Template]: ResolveTemplateValue<Template[K], Args> } : Template;
|
|
411
|
+
type ResolveTemplatePathValue<Value, Path extends readonly string[] | undefined> = Path extends readonly [infer Segment extends string, ...infer Rest extends readonly string[]] ? Segment extends keyof NonNullable<Value> ? ResolveTemplatePathValue<NonNullable<Value>[Segment], Rest> : never : Value;
|
|
412
|
+
type ResolveTemplateDefaultValue<Value, Default, Args extends readonly unknown[]> = Default extends undefined ? Value : [Value] extends [never] ? ResolveTemplateValue<Default, Args> : undefined extends Value ? Exclude<Value, undefined> | ResolveTemplateValue<Default, Args> : Value;
|
|
413
|
+
type ResolveTemplateArgValue<Value, Path extends readonly string[] | undefined, Default, Args extends readonly unknown[]> = ResolveTemplateDefaultValue<ResolveTemplatePathValue<Value, Path>, Default, Args>;
|
|
414
|
+
type FieldBuilderFromPresetDescriptor<Descriptor extends AuthoringFieldPresetDescriptor, Args extends readonly unknown[] = readonly [], ConstraintName extends string | undefined = undefined> = ScalarFieldBuilder<ScalarFieldState<ResolveTemplateValue<Descriptor['output']['codecId'], Args> extends string ? ResolveTemplateValue<Descriptor['output']['codecId'], Args> : string, undefined, ResolveTemplateValue<Descriptor['output']['nullable'], Args> extends true ? true : false, undefined, NamedConstraintState<ResolveTemplateValue<Descriptor['output']['id'], Args> extends true ? true : false, ConstraintName>, NamedConstraintState<ResolveTemplateValue<Descriptor['output']['unique'], Args> extends true ? true : false, ConstraintName>>>;
|
|
402
415
|
type FieldHelperFunctionWithoutNamedConstraint<Descriptor extends AuthoringFieldPresetDescriptor> = Descriptor extends {
|
|
403
416
|
readonly args: infer Args extends readonly AuthoringArgumentDescriptor[];
|
|
404
417
|
} ? <const Params extends TupleFromArgumentDescriptors<Args>>(...args: Params) => FieldBuilderFromPresetDescriptor<Descriptor, Params> : () => FieldBuilderFromPresetDescriptor<Descriptor, readonly []>;
|
|
405
418
|
type FieldHelperFunctionWithNamedConstraint<Descriptor extends AuthoringFieldPresetDescriptor> = Descriptor extends {
|
|
406
419
|
readonly args: infer Args extends readonly AuthoringArgumentDescriptor[];
|
|
407
|
-
} ? <const Params extends TupleFromArgumentDescriptors<Args>, const Name
|
|
420
|
+
} ? <const Params extends TupleFromArgumentDescriptors<Args>, const Name extends string | undefined = undefined>(...args: [...params: Params, options?: NamedConstraintSpec<Name>]) => FieldBuilderFromPresetDescriptor<Descriptor, Params, Name> : <const Name extends string | undefined = undefined>(options?: NamedConstraintSpec<Name>) => FieldBuilderFromPresetDescriptor<Descriptor, readonly [], Name>;
|
|
408
421
|
type FieldHelperFunction<Descriptor extends AuthoringFieldPresetDescriptor> = SupportsNamedConstraintOptions<Descriptor> extends true ? FieldHelperFunctionWithNamedConstraint<Descriptor> : FieldHelperFunctionWithoutNamedConstraint<Descriptor>;
|
|
409
422
|
type FieldHelpersFromNamespace<Namespace> = { readonly [K in keyof Namespace]: Namespace[K] extends AuthoringFieldPresetDescriptor ? FieldHelperFunction<Namespace[K]> : Namespace[K] extends Record<string, unknown> ? FieldHelpersFromNamespace<Namespace[K]> : never };
|
|
410
423
|
//#endregion
|
|
411
|
-
//#region src/composed-authoring-helpers.d.ts
|
|
412
|
-
type ExtractTypeNamespaceFromPack<Pack> = Pack extends {
|
|
413
|
-
readonly authoring?: {
|
|
414
|
-
readonly type?: infer Namespace extends AuthoringTypeNamespace;
|
|
415
|
-
};
|
|
416
|
-
} ? Namespace : Record<never, never>;
|
|
417
|
-
type ExtractFieldNamespaceFromPack<Pack> = Pack extends {
|
|
418
|
-
readonly authoring?: {
|
|
419
|
-
readonly field?: infer Namespace extends AuthoringFieldNamespace;
|
|
420
|
-
};
|
|
421
|
-
} ? Namespace : Record<never, never>;
|
|
422
|
-
type MergeExtensionTypeNamespaces<ExtensionPacks> = ExtensionPacks extends Record<string, unknown> ? keyof ExtensionPacks extends never ? Record<never, never> : UnionToIntersection<{ [K in keyof ExtensionPacks]: ExtractTypeNamespaceFromPack<ExtensionPacks[K]> }[keyof ExtensionPacks]> : Record<never, never>;
|
|
423
|
-
type MergeExtensionFieldNamespaces<ExtensionPacks> = ExtensionPacks extends Record<string, unknown> ? keyof ExtensionPacks extends never ? Record<never, never> : UnionToIntersection<{ [K in keyof ExtensionPacks]: ExtractFieldNamespaceFromPack<ExtensionPacks[K]> }[keyof ExtensionPacks]> : Record<never, never>;
|
|
424
|
-
type StorageTypeFromDescriptor<Descriptor extends AuthoringTypeConstructorDescriptor, Args$1 extends readonly unknown[]> = {
|
|
425
|
-
readonly codecId: ResolveTemplateValue<Descriptor['output']['codecId'], Args$1>;
|
|
426
|
-
readonly nativeType: ResolveTemplateValue<Descriptor['output']['nativeType'], Args$1>;
|
|
427
|
-
} & (Descriptor['output'] extends {
|
|
428
|
-
readonly typeParams: infer TypeParams extends Record<string, unknown>;
|
|
429
|
-
} ? {
|
|
430
|
-
readonly typeParams: ResolveTemplateValue<TypeParams, Args$1>;
|
|
431
|
-
} : Record<never, never>);
|
|
432
|
-
type TypeHelperFunction<Descriptor extends AuthoringTypeConstructorDescriptor> = Descriptor extends {
|
|
433
|
-
readonly args: infer Args extends readonly AuthoringArgumentDescriptor[];
|
|
434
|
-
} ? <const Params extends TupleFromArgumentDescriptors<Args>>(...args: Params) => StorageTypeFromDescriptor<Descriptor, Params> : () => StorageTypeFromDescriptor<Descriptor, readonly []>;
|
|
435
|
-
type TypeHelpersFromNamespace<Namespace> = { readonly [K in keyof Namespace]: Namespace[K] extends AuthoringTypeConstructorDescriptor ? TypeHelperFunction<Namespace[K]> : Namespace[K] extends Record<string, unknown> ? TypeHelpersFromNamespace<Namespace[K]> : never };
|
|
436
|
-
type CoreFieldHelpers = Pick<typeof field, 'column' | 'generated' | 'namedType'>;
|
|
437
|
-
type ComposedAuthoringHelpers<Family extends FamilyPackRef<string>, Target extends TargetPackRef<'sql', string>, ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined> = {
|
|
438
|
-
readonly field: CoreFieldHelpers & FieldHelpersFromNamespace<ExtractFieldNamespaceFromPack<Family> & ExtractFieldNamespaceFromPack<Target> & MergeExtensionFieldNamespaces<ExtensionPacks>>;
|
|
439
|
-
readonly model: typeof model;
|
|
440
|
-
readonly rel: typeof rel;
|
|
441
|
-
readonly type: TypeHelpersFromNamespace<ExtractTypeNamespaceFromPack<Family> & ExtractTypeNamespaceFromPack<Target> & MergeExtensionTypeNamespaces<ExtensionPacks>>;
|
|
442
|
-
};
|
|
443
|
-
//#endregion
|
|
444
424
|
//#region src/contract-types.d.ts
|
|
445
425
|
type ExtractCodecTypesFromPack<P> = P extends {
|
|
446
426
|
__codecTypes?: infer C;
|
|
@@ -449,6 +429,13 @@ type ExtractCodecTypesFromPack<P> = P extends {
|
|
|
449
429
|
}> ? C : Record<string, never> : Record<string, never>;
|
|
450
430
|
type MergeExtensionCodecTypes<Packs extends Record<string, unknown>> = UnionToIntersection<{ [K in keyof Packs]: ExtractCodecTypesFromPack<Packs[K]> }[keyof Packs]>;
|
|
451
431
|
type MergeExtensionCodecTypesSafe<Packs> = Packs extends Record<string, unknown> ? keyof Packs extends never ? Record<string, never> : MergeExtensionCodecTypes<Packs> : Record<string, never>;
|
|
432
|
+
type ExtractIndexTypesFromPack<P> = P extends {
|
|
433
|
+
readonly indexTypes: IndexTypeRegistration<infer M>;
|
|
434
|
+
} ? M : Record<never, never>;
|
|
435
|
+
type AllIndexTypeLiterals<Packs> = Packs extends Record<string, unknown> ? { [K in keyof Packs]: keyof ExtractIndexTypesFromPack<Packs[K]> }[keyof Packs] & string : never;
|
|
436
|
+
type MergeExtensionIndexTypes<Packs extends Record<string, unknown>> = { readonly [Lit in AllIndexTypeLiterals<Packs>]: Extract<{ [K in keyof Packs]: Lit extends keyof ExtractIndexTypesFromPack<Packs[K]> ? ExtractIndexTypesFromPack<Packs[K]>[Lit] : never }[keyof Packs], {
|
|
437
|
+
readonly options: unknown;
|
|
438
|
+
}> };
|
|
452
439
|
type DefinitionExtensionPacks<Definition> = Definition extends {
|
|
453
440
|
readonly extensionPacks?: infer Packs extends Record<string, ExtensionPackRef<'sql', string>>;
|
|
454
441
|
} ? Packs : Record<never, never>;
|
|
@@ -480,28 +467,28 @@ type DefinitionColumnNaming<Definition> = Definition extends {
|
|
|
480
467
|
} ? Strategy : undefined;
|
|
481
468
|
type FirstChar<S extends string> = S extends `${infer First}${string}` ? First : '';
|
|
482
469
|
type CharKind<C extends string> = C extends '' ? 'end' : C extends Lowercase<C> ? C extends Uppercase<C> ? 'other' : 'lower' : 'upper';
|
|
483
|
-
type ShouldInsertSnakeUnderscore<PrevKind extends 'start' | 'lower' | 'upper' | 'other' | 'end', Current
|
|
470
|
+
type ShouldInsertSnakeUnderscore<PrevKind extends 'start' | 'lower' | 'upper' | 'other' | 'end', Current extends string, Next extends string> = CharKind<Current> extends 'upper' ? PrevKind extends 'start' ? false : PrevKind extends 'lower' | 'other' ? true : CharKind<Next> extends 'lower' ? true : false : false;
|
|
484
471
|
type SnakeCaseInternal<S extends string, PrevKind extends 'start' | 'lower' | 'upper' | 'other' | 'end' = 'start'> = S extends `${infer Current}${infer Rest}` ? `${ShouldInsertSnakeUnderscore<PrevKind, Current, FirstChar<Rest>> extends true ? '_' : ''}${Lowercase<Current>}${SnakeCaseInternal<Rest, CharKind<Current>>}` : '';
|
|
485
472
|
type SnakeCase<S extends string> = string extends S ? string : SnakeCaseInternal<S>;
|
|
486
|
-
type ApplyNamingType<Name
|
|
473
|
+
type ApplyNamingType<Name extends string, Strategy extends string | undefined> = string extends Name ? string : Strategy extends 'snake_case' ? SnakeCase<Name> : Name;
|
|
487
474
|
type ModelNames<Definition> = keyof DefinitionModels<Definition> & string;
|
|
488
|
-
type ModelFields<Definition, ModelName
|
|
475
|
+
type ModelFields<Definition, ModelName extends ModelNames<Definition>> = DefinitionModels<Definition>[ModelName] extends {
|
|
489
476
|
readonly stageOne: {
|
|
490
477
|
readonly fields: Record<string, ScalarFieldBuilder>;
|
|
491
478
|
};
|
|
492
|
-
} ? DefinitionModels<Definition>[ModelName
|
|
493
|
-
type ModelFieldNames<Definition, ModelName
|
|
494
|
-
type StagedModelRelations<Definition, ModelName
|
|
479
|
+
} ? DefinitionModels<Definition>[ModelName]['stageOne']['fields'] : Record<never, never>;
|
|
480
|
+
type ModelFieldNames<Definition, ModelName extends ModelNames<Definition>> = keyof ModelFields<Definition, ModelName> & string;
|
|
481
|
+
type StagedModelRelations<Definition, ModelName extends ModelNames<Definition>> = DefinitionModels<Definition>[ModelName] extends {
|
|
495
482
|
readonly stageOne: {
|
|
496
483
|
readonly relations: infer R;
|
|
497
484
|
};
|
|
498
485
|
} ? R extends Record<string, unknown> ? R : Record<never, never> : Record<never, never>;
|
|
499
|
-
type StagedModelRelationNames<Definition, ModelName
|
|
500
|
-
type ModelFieldState<Definition, ModelName
|
|
501
|
-
type ModelSql<Definition, ModelName
|
|
486
|
+
type StagedModelRelationNames<Definition, ModelName extends ModelNames<Definition>> = keyof StagedModelRelations<Definition, ModelName> & string;
|
|
487
|
+
type ModelFieldState<Definition, ModelName extends ModelNames<Definition>, FieldName extends ModelFieldNames<Definition, ModelName>> = FieldStateOf<ModelFields<Definition, ModelName>[FieldName]>;
|
|
488
|
+
type ModelSql<Definition, ModelName extends ModelNames<Definition>> = DefinitionModels<Definition>[ModelName] extends {
|
|
502
489
|
readonly __sql: infer SqlSpec;
|
|
503
490
|
} ? SqlSpec : undefined;
|
|
504
|
-
type ModelAttributes<Definition, ModelName
|
|
491
|
+
type ModelAttributes<Definition, ModelName extends ModelNames<Definition>> = DefinitionModels<Definition>[ModelName] extends {
|
|
505
492
|
readonly __attributes: infer AttributesSpec;
|
|
506
493
|
} ? AttributesSpec : undefined;
|
|
507
494
|
type FieldDescriptorOf<FieldState> = Present<FieldState extends {
|
|
@@ -531,43 +518,43 @@ type DescriptorTypeParams<Descriptor> = Descriptor extends {
|
|
|
531
518
|
type DescriptorTypeRef<Descriptor> = Descriptor extends {
|
|
532
519
|
readonly typeRef: infer TypeRef extends string;
|
|
533
520
|
} ? TypeRef : undefined;
|
|
534
|
-
type LookupNamedStorageTypeKeyByValue<Definition, TypeRef
|
|
535
|
-
type ResolveNamedStorageTypeKey<Definition, TypeRef
|
|
536
|
-
type ResolveNamedStorageType<Definition, TypeRef
|
|
521
|
+
type LookupNamedStorageTypeKeyByValue<Definition, TypeRef extends StorageTypeInstance> = { [TypeName in keyof DefinitionTypes<Definition> & string]: [TypeRef] extends [DefinitionTypes<Definition>[TypeName]] ? [DefinitionTypes<Definition>[TypeName]] extends [TypeRef] ? TypeName : never : never }[keyof DefinitionTypes<Definition> & string];
|
|
522
|
+
type ResolveNamedStorageTypeKey<Definition, TypeRef> = TypeRef extends string ? TypeRef : TypeRef extends StorageTypeInstance ? [LookupNamedStorageTypeKeyByValue<Definition, TypeRef>] extends [never] ? string : LookupNamedStorageTypeKeyByValue<Definition, TypeRef> : never;
|
|
523
|
+
type ResolveNamedStorageType<Definition, TypeRef> = ResolveNamedStorageTypeKey<Definition, TypeRef> extends infer TypeName extends string ? TypeName extends keyof DefinitionTypes<Definition> ? DefinitionTypes<Definition>[TypeName] : StorageTypeInstance : StorageTypeInstance;
|
|
537
524
|
type ResolveFieldDescriptor<Definition, FieldState> = [FieldDescriptorOf<FieldState>] extends [never] ? ResolveNamedStorageType<Definition, FieldTypeRefOf<FieldState>> : FieldDescriptorOf<FieldState>;
|
|
538
525
|
type ResolveFieldColumnTypeRef<Definition, FieldState> = [FieldTypeRefOf<FieldState>] extends [never] ? DescriptorTypeRef<FieldDescriptorOf<FieldState>> : ResolveNamedStorageTypeKey<Definition, FieldTypeRefOf<FieldState>>;
|
|
539
526
|
type ResolveFieldColumnTypeParams<Definition, FieldState> = [ResolveFieldColumnTypeRef<Definition, FieldState>] extends [string] ? undefined : DescriptorTypeParams<FieldDescriptorOf<FieldState>>;
|
|
540
|
-
type ModelTableName<Definition, ModelName
|
|
527
|
+
type ModelTableName<Definition, ModelName extends ModelNames<Definition>> = [Present<ModelSql<Definition, ModelName> extends {
|
|
541
528
|
readonly table?: infer TableName;
|
|
542
|
-
} ? TableName : never>] extends [never] ? ApplyNamingType<ModelName
|
|
529
|
+
} ? TableName : never>] extends [never] ? ApplyNamingType<ModelName, DefinitionTableNaming<Definition>> : Present<ModelSql<Definition, ModelName> extends {
|
|
543
530
|
readonly table?: infer TableName;
|
|
544
|
-
} ? TableName : never> extends infer ExplicitTableName extends string ? ExplicitTableName : ApplyNamingType<ModelName
|
|
545
|
-
type ModelColumnName<Definition, ModelName
|
|
546
|
-
type FieldNamesToColumnNames<Definition, ModelName
|
|
547
|
-
type InlineIdFieldName<Definition, ModelName
|
|
548
|
-
type InlineIdFieldNames<Definition, ModelName
|
|
549
|
-
type InlineIdName<Definition, ModelName
|
|
531
|
+
} ? TableName : never> extends infer ExplicitTableName extends string ? ExplicitTableName : ApplyNamingType<ModelName, DefinitionTableNaming<Definition>>;
|
|
532
|
+
type ModelColumnName<Definition, ModelName extends ModelNames<Definition>, FieldName extends ModelFieldNames<Definition, ModelName>> = [FieldColumnOverrideOf<ModelFieldState<Definition, ModelName, FieldName>>] extends [never] ? ApplyNamingType<FieldName, DefinitionColumnNaming<Definition>> : FieldColumnOverrideOf<ModelFieldState<Definition, ModelName, FieldName>> extends infer ExplicitColumnName extends string ? ExplicitColumnName : ApplyNamingType<FieldName, DefinitionColumnNaming<Definition>>;
|
|
533
|
+
type FieldNamesToColumnNames<Definition, ModelName extends ModelNames<Definition>, FieldNames extends readonly string[]> = FieldNames extends readonly [] ? readonly [] : FieldNames extends readonly [infer First extends ModelFieldNames<Definition, ModelName>, ...infer Rest extends readonly string[]] ? readonly [ModelColumnName<Definition, ModelName, First>, ...FieldNamesToColumnNames<Definition, ModelName, Rest>] : readonly string[];
|
|
534
|
+
type InlineIdFieldName<Definition, ModelName extends ModelNames<Definition>> = { [FieldName in ModelFieldNames<Definition, ModelName>]: [FieldInlineIdSpecOf<ModelFieldState<Definition, ModelName, FieldName>>] extends [never] ? never : FieldName }[ModelFieldNames<Definition, ModelName>];
|
|
535
|
+
type InlineIdFieldNames<Definition, ModelName extends ModelNames<Definition>> = [InlineIdFieldName<Definition, ModelName>] extends [never] ? undefined : readonly [InlineIdFieldName<Definition, ModelName>];
|
|
536
|
+
type InlineIdName<Definition, ModelName extends ModelNames<Definition>> = { [FieldName in ModelFieldNames<Definition, ModelName>]: FieldInlineIdSpecOf<ModelFieldState<Definition, ModelName, FieldName>> extends {
|
|
550
537
|
readonly name?: infer Name extends string;
|
|
551
|
-
} ? Name : never }[ModelFieldNames<Definition, ModelName
|
|
552
|
-
type AttributeIdFieldNames<Definition, ModelName
|
|
553
|
-
type AttributeIdName<Definition, ModelName
|
|
538
|
+
} ? Name : never }[ModelFieldNames<Definition, ModelName>];
|
|
539
|
+
type AttributeIdFieldNames<Definition, ModelName extends ModelNames<Definition>> = AttributeStageIdFieldNames<ModelAttributes<Definition, ModelName>>;
|
|
540
|
+
type AttributeIdName<Definition, ModelName extends ModelNames<Definition>> = Present<ModelAttributes<Definition, ModelName> extends {
|
|
554
541
|
readonly id?: {
|
|
555
542
|
readonly name?: infer Name extends string;
|
|
556
543
|
};
|
|
557
544
|
} ? Name : never>;
|
|
558
|
-
type ModelIdFieldNames<Definition, ModelName
|
|
559
|
-
type ModelIdName<Definition, ModelName
|
|
560
|
-
type StorageColumn<CodecId
|
|
545
|
+
type ModelIdFieldNames<Definition, ModelName extends ModelNames<Definition>> = [AttributeIdFieldNames<Definition, ModelName>] extends [undefined] ? InlineIdFieldNames<Definition, ModelName> : AttributeIdFieldNames<Definition, ModelName>;
|
|
546
|
+
type ModelIdName<Definition, ModelName extends ModelNames<Definition>> = [AttributeIdName<Definition, ModelName>] extends [never] ? Present<InlineIdName<Definition, ModelName>> : AttributeIdName<Definition, ModelName>;
|
|
547
|
+
type StorageColumn<CodecId extends string, Nullable extends boolean, NativeType extends string, TypeRef extends string | undefined = undefined, TypeParams extends Record<string, unknown> | undefined = undefined> = {
|
|
561
548
|
readonly nativeType: NativeType;
|
|
562
|
-
readonly codecId: CodecId
|
|
563
|
-
readonly nullable: Nullable
|
|
549
|
+
readonly codecId: CodecId;
|
|
550
|
+
readonly nullable: Nullable;
|
|
564
551
|
readonly default?: ColumnDefault;
|
|
565
|
-
} & (TypeRef
|
|
566
|
-
readonly typeRef: TypeRef
|
|
567
|
-
} : Record<string, never>) & (TypeParams
|
|
568
|
-
readonly typeParams: TypeParams
|
|
552
|
+
} & (TypeRef extends string ? {
|
|
553
|
+
readonly typeRef: TypeRef;
|
|
554
|
+
} : Record<string, never>) & (TypeParams extends Record<string, unknown> ? {
|
|
555
|
+
readonly typeParams: TypeParams;
|
|
569
556
|
} : Record<string, never>);
|
|
570
|
-
type ModelStorageColumn<Definition, ModelName
|
|
557
|
+
type ModelStorageColumn<Definition, ModelName extends ModelNames<Definition>, FieldName extends string> = FieldName extends ModelFieldNames<Definition, ModelName> ? StorageColumn<DescriptorCodecId<ResolveFieldDescriptor<Definition, ModelFieldState<Definition, ModelName, FieldName>>>, FieldNullableOf<ModelFieldState<Definition, ModelName, FieldName>>, DescriptorNativeType<ResolveFieldDescriptor<Definition, ModelFieldState<Definition, ModelName, FieldName>>>, ResolveFieldColumnTypeRef<Definition, ModelFieldState<Definition, ModelName, FieldName>>, ResolveFieldColumnTypeParams<Definition, ModelFieldState<Definition, ModelName, FieldName>>> : never;
|
|
571
558
|
type BuiltModels<Definition> = { readonly [ModelName in ModelNames<Definition>]: {
|
|
572
559
|
readonly storage: {
|
|
573
560
|
readonly table: ModelTableName<Definition, ModelName>;
|
|
@@ -584,9 +571,9 @@ type BuiltModels<Definition> = { readonly [ModelName in ModelNames<Definition>]:
|
|
|
584
571
|
} };
|
|
585
572
|
readonly relations: { readonly [RelName in StagedModelRelationNames<Definition, ModelName>]: ContractRelation };
|
|
586
573
|
} };
|
|
587
|
-
type BuiltModelColumnMappings<Definition, ModelName
|
|
588
|
-
type BuiltModelTableName<Definition, ModelName
|
|
589
|
-
type BuiltStorageTableColumns<Definition, ModelName
|
|
574
|
+
type BuiltModelColumnMappings<Definition, ModelName extends ModelNames<Definition>> = BuiltModels<Definition>[ModelName]['storage']['fields'];
|
|
575
|
+
type BuiltModelTableName<Definition, ModelName extends ModelNames<Definition>> = BuiltModels<Definition>[ModelName]['storage']['table'];
|
|
576
|
+
type BuiltStorageTableColumns<Definition, ModelName extends ModelNames<Definition>> = { readonly [FieldName in keyof BuiltModelColumnMappings<Definition, ModelName> & string as BuiltModelColumnMappings<Definition, ModelName>[FieldName]['column']]: ModelStorageColumn<Definition, ModelName, FieldName> };
|
|
590
577
|
type BuiltStorageTables<Definition> = { readonly [ModelName in ModelNames<Definition> as BuiltModelTableName<Definition, ModelName>]: {
|
|
591
578
|
readonly columns: BuiltStorageTableColumns<Definition, ModelName>;
|
|
592
579
|
readonly uniques: ReadonlyArray<{
|
|
@@ -617,7 +604,7 @@ type BuiltStorage<Definition> = {
|
|
|
617
604
|
readonly tables: BuiltStorageTables<Definition>;
|
|
618
605
|
readonly types: DefinitionTypes<Definition>;
|
|
619
606
|
};
|
|
620
|
-
type FieldOutputType<Definition, ModelName
|
|
607
|
+
type FieldOutputType<Definition, ModelName extends ModelNames<Definition>, FieldName extends ModelFieldNames<Definition, ModelName>> = ModelStorageColumn<Definition, ModelName, FieldName> extends infer Col ? Col extends {
|
|
621
608
|
readonly codecId: infer Id extends string;
|
|
622
609
|
} ? Id extends keyof CodecTypesFromDefinition<Definition> ? CodecTypesFromDefinition<Definition>[Id] extends {
|
|
623
610
|
readonly output: infer O;
|
|
@@ -633,6 +620,53 @@ type SqlContractResult<Definition> = ContractWithTypeMaps<Contract<BuiltStorage<
|
|
|
633
620
|
readonly capabilities: DefinitionCapabilities<Definition> extends Record<string, Record<string, boolean>> ? DefinitionCapabilities<Definition> : Record<string, Record<string, boolean>>;
|
|
634
621
|
}, TypeMaps<CodecTypesFromDefinition<Definition>, Record<string, never>, Record<string, never>, FieldOutputTypes<Definition>>>;
|
|
635
622
|
//#endregion
|
|
623
|
+
//#region src/composed-authoring-helpers.d.ts
|
|
624
|
+
type ExtractTypeNamespaceFromPack<Pack> = Pack extends {
|
|
625
|
+
readonly authoring?: {
|
|
626
|
+
readonly type?: infer Namespace extends AuthoringTypeNamespace;
|
|
627
|
+
};
|
|
628
|
+
} ? Namespace : Record<never, never>;
|
|
629
|
+
type ExtractFieldNamespaceFromPack<Pack> = Pack extends {
|
|
630
|
+
readonly authoring?: {
|
|
631
|
+
readonly field?: infer Namespace extends AuthoringFieldNamespace;
|
|
632
|
+
};
|
|
633
|
+
} ? Namespace : Record<never, never>;
|
|
634
|
+
type MergeExtensionTypeNamespaces<ExtensionPacks> = ExtensionPacks extends Record<string, unknown> ? keyof ExtensionPacks extends never ? Record<never, never> : UnionToIntersection<{ [K in keyof ExtensionPacks]: ExtractTypeNamespaceFromPack<ExtensionPacks[K]> }[keyof ExtensionPacks]> : Record<never, never>;
|
|
635
|
+
type MergeExtensionFieldNamespaces<ExtensionPacks> = ExtensionPacks extends Record<string, unknown> ? keyof ExtensionPacks extends never ? Record<never, never> : UnionToIntersection<{ [K in keyof ExtensionPacks]: ExtractFieldNamespaceFromPack<ExtensionPacks[K]> }[keyof ExtensionPacks]> : Record<never, never>;
|
|
636
|
+
type StorageTypeFromDescriptor<Descriptor extends AuthoringTypeConstructorDescriptor, Args extends readonly unknown[]> = {
|
|
637
|
+
readonly codecId: ResolveTemplateValue<Descriptor['output']['codecId'], Args>;
|
|
638
|
+
readonly nativeType: ResolveTemplateValue<Descriptor['output']['nativeType'], Args>;
|
|
639
|
+
} & (Descriptor['output'] extends {
|
|
640
|
+
readonly typeParams: infer TypeParams extends Record<string, unknown>;
|
|
641
|
+
} ? {
|
|
642
|
+
readonly typeParams: ResolveTemplateValue<TypeParams, Args>;
|
|
643
|
+
} : Record<never, never>);
|
|
644
|
+
type TypeHelperFunction<Descriptor extends AuthoringTypeConstructorDescriptor> = Descriptor extends {
|
|
645
|
+
readonly args: infer Args extends readonly AuthoringArgumentDescriptor[];
|
|
646
|
+
} ? <const Params extends TupleFromArgumentDescriptors<Args>>(...args: Params) => StorageTypeFromDescriptor<Descriptor, Params> : () => StorageTypeFromDescriptor<Descriptor, readonly []>;
|
|
647
|
+
type TypeHelpersFromNamespace<Namespace> = { readonly [K in keyof Namespace]: Namespace[K] extends AuthoringTypeConstructorDescriptor ? TypeHelperFunction<Namespace[K]> : Namespace[K] extends Record<string, unknown> ? TypeHelpersFromNamespace<Namespace[K]> : never };
|
|
648
|
+
type CoreFieldHelpers = Pick<typeof field, 'column' | 'generated' | 'namedType'>;
|
|
649
|
+
type MergeAllPackIndexTypes<Family, Target, ExtensionPacks> = MergeExtensionIndexTypes<{
|
|
650
|
+
readonly __family: Family;
|
|
651
|
+
readonly __target: Target;
|
|
652
|
+
} & (ExtensionPacks extends Record<string, unknown> ? ExtensionPacks : Record<never, never>)>;
|
|
653
|
+
type PackAwareModel<IndexTypes extends IndexTypeMap> = {
|
|
654
|
+
<const ModelName extends string, Fields extends Record<string, ScalarFieldBuilder>, Relations extends Record<string, AnyRelationBuilder> = Record<never, never>>(modelName: ModelName, input: {
|
|
655
|
+
readonly fields: Fields;
|
|
656
|
+
readonly relations?: Relations;
|
|
657
|
+
}): ContractModelBuilder<ModelName, Fields, Relations, undefined, undefined, IndexTypes>;
|
|
658
|
+
<Fields extends Record<string, ScalarFieldBuilder>, Relations extends Record<string, AnyRelationBuilder> = Record<never, never>>(input: {
|
|
659
|
+
readonly fields: Fields;
|
|
660
|
+
readonly relations?: Relations;
|
|
661
|
+
}): ContractModelBuilder<undefined, Fields, Relations, undefined, undefined, IndexTypes>;
|
|
662
|
+
};
|
|
663
|
+
type ComposedAuthoringHelpers<Family extends FamilyPackRef<string>, Target extends TargetPackRef<'sql', string>, ExtensionPacks extends Record<string, ExtensionPackRef<'sql', string>> | undefined> = {
|
|
664
|
+
readonly field: CoreFieldHelpers & FieldHelpersFromNamespace<ExtractFieldNamespaceFromPack<Family> & ExtractFieldNamespaceFromPack<Target> & MergeExtensionFieldNamespaces<ExtensionPacks>>;
|
|
665
|
+
readonly model: PackAwareModel<MergeAllPackIndexTypes<Family, Target, ExtensionPacks>>;
|
|
666
|
+
readonly rel: typeof rel;
|
|
667
|
+
readonly type: TypeHelpersFromNamespace<ExtractTypeNamespaceFromPack<Family> & ExtractTypeNamespaceFromPack<Target> & MergeExtensionTypeNamespaces<ExtensionPacks>>;
|
|
668
|
+
};
|
|
669
|
+
//#endregion
|
|
636
670
|
//#region src/contract-definition.d.ts
|
|
637
671
|
interface FieldNode {
|
|
638
672
|
readonly fieldName: string;
|
|
@@ -640,7 +674,7 @@ interface FieldNode {
|
|
|
640
674
|
readonly descriptor: ColumnTypeDescriptor;
|
|
641
675
|
readonly nullable: boolean;
|
|
642
676
|
readonly default?: ColumnDefault;
|
|
643
|
-
readonly
|
|
677
|
+
readonly executionDefaults?: ExecutionMutationDefaultPhases$1;
|
|
644
678
|
readonly many?: boolean;
|
|
645
679
|
}
|
|
646
680
|
interface PrimaryKeyNode {
|
|
@@ -654,8 +688,8 @@ interface UniqueConstraintNode {
|
|
|
654
688
|
interface IndexNode {
|
|
655
689
|
readonly columns: readonly string[];
|
|
656
690
|
readonly name?: string;
|
|
657
|
-
readonly
|
|
658
|
-
readonly
|
|
691
|
+
readonly type?: string;
|
|
692
|
+
readonly options?: Record<string, unknown>;
|
|
659
693
|
}
|
|
660
694
|
interface ForeignKeyNode {
|
|
661
695
|
readonly columns: readonly string[];
|
|
@@ -693,7 +727,7 @@ interface ValueObjectFieldNode {
|
|
|
693
727
|
readonly valueObjectName: string;
|
|
694
728
|
readonly nullable: boolean;
|
|
695
729
|
readonly default?: ColumnDefault;
|
|
696
|
-
readonly
|
|
730
|
+
readonly executionDefaults?: ExecutionMutationDefaultPhases$1;
|
|
697
731
|
readonly many?: boolean;
|
|
698
732
|
}
|
|
699
733
|
interface ValueObjectNode {
|