@prisma-next/sql-contract-ts 0.3.0-pr.99.6 → 0.4.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/LICENSE +201 -0
- package/README.md +206 -73
- package/dist/config-types.d.mts +8 -0
- package/dist/config-types.d.mts.map +1 -0
- package/dist/config-types.mjs +14 -0
- package/dist/config-types.mjs.map +1 -0
- package/dist/contract-builder.d.mts +769 -0
- package/dist/contract-builder.d.mts.map +1 -0
- package/dist/contract-builder.mjs +1288 -0
- package/dist/contract-builder.mjs.map +1 -0
- package/package.json +19 -16
- package/schemas/data-contract-sql-v1.json +189 -23
- package/src/authoring-helper-runtime.ts +139 -0
- package/src/authoring-type-utils.ts +168 -0
- package/src/build-contract.ts +463 -0
- package/src/composed-authoring-helpers.ts +256 -0
- package/src/config-types.ts +11 -0
- package/src/contract-builder.ts +232 -551
- package/src/contract-definition.ts +103 -0
- package/src/contract-dsl.ts +1492 -0
- package/src/contract-lowering.ts +703 -0
- package/src/contract-types.ts +534 -0
- package/src/contract-warnings.ts +242 -0
- package/src/exports/config-types.ts +2 -0
- package/src/exports/contract-builder.ts +23 -2
- package/dist/chunk-HTNUNGA2.js +0 -346
- package/dist/chunk-HTNUNGA2.js.map +0 -1
- package/dist/contract-builder.d.ts +0 -101
- package/dist/contract-builder.d.ts.map +0 -1
- package/dist/contract.d.ts +0 -50
- package/dist/contract.d.ts.map +0 -1
- package/dist/exports/contract-builder.d.ts +0 -3
- package/dist/exports/contract-builder.d.ts.map +0 -1
- package/dist/exports/contract-builder.js +0 -231
- package/dist/exports/contract-builder.js.map +0 -1
- package/dist/exports/contract.d.ts +0 -2
- package/dist/exports/contract.d.ts.map +0 -1
- package/dist/exports/contract.js +0 -9
- package/dist/exports/contract.js.map +0 -1
- package/src/contract.ts +0 -582
- package/src/exports/contract.ts +0 -1
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ColumnDefault,
|
|
3
|
+
Contract,
|
|
4
|
+
ContractRelation,
|
|
5
|
+
StorageHashBase,
|
|
6
|
+
} from '@prisma-next/contract/types';
|
|
7
|
+
import type { ExtensionPackRef, TargetPackRef } from '@prisma-next/framework-components/components';
|
|
8
|
+
import type {
|
|
9
|
+
ContractWithTypeMaps,
|
|
10
|
+
Index,
|
|
11
|
+
ReferentialAction,
|
|
12
|
+
StorageTypeInstance,
|
|
13
|
+
TypeMaps,
|
|
14
|
+
} from '@prisma-next/sql-contract/types';
|
|
15
|
+
import type { UnionToIntersection } from './authoring-type-utils';
|
|
16
|
+
import type { AttributeStageIdFieldNames, FieldStateOf, ScalarFieldBuilder } from './contract-dsl';
|
|
17
|
+
|
|
18
|
+
export type ExtractCodecTypesFromPack<P> = P extends { __codecTypes?: infer C }
|
|
19
|
+
? C extends Record<string, { output: unknown }>
|
|
20
|
+
? C
|
|
21
|
+
: Record<string, never>
|
|
22
|
+
: Record<string, never>;
|
|
23
|
+
|
|
24
|
+
export type MergeExtensionCodecTypes<Packs extends Record<string, unknown>> = UnionToIntersection<
|
|
25
|
+
{
|
|
26
|
+
[K in keyof Packs]: ExtractCodecTypesFromPack<Packs[K]>;
|
|
27
|
+
}[keyof Packs]
|
|
28
|
+
>;
|
|
29
|
+
|
|
30
|
+
type MergeExtensionCodecTypesSafe<Packs> =
|
|
31
|
+
Packs extends Record<string, unknown>
|
|
32
|
+
? keyof Packs extends never
|
|
33
|
+
? Record<string, never>
|
|
34
|
+
: MergeExtensionCodecTypes<Packs>
|
|
35
|
+
: Record<string, never>;
|
|
36
|
+
|
|
37
|
+
export type MergeExtensionPackRefs<
|
|
38
|
+
Existing extends Record<string, unknown> | undefined,
|
|
39
|
+
Added extends Record<string, ExtensionPackRef<'sql', string>>,
|
|
40
|
+
> = Existing extends Record<string, unknown> ? Existing & Added : Added;
|
|
41
|
+
|
|
42
|
+
type DefinitionExtensionPacks<Definition> = Definition extends {
|
|
43
|
+
readonly extensionPacks?: infer Packs extends Record<string, ExtensionPackRef<'sql', string>>;
|
|
44
|
+
}
|
|
45
|
+
? Packs
|
|
46
|
+
: Record<never, never>;
|
|
47
|
+
|
|
48
|
+
type DefinitionCapabilities<Definition> = Definition extends {
|
|
49
|
+
readonly capabilities?: infer Capabilities extends Record<string, Record<string, boolean>>;
|
|
50
|
+
}
|
|
51
|
+
? Capabilities
|
|
52
|
+
: undefined;
|
|
53
|
+
|
|
54
|
+
type DefinitionTargetId<Definition> = Definition extends {
|
|
55
|
+
readonly target: TargetPackRef<'sql', infer Target>;
|
|
56
|
+
}
|
|
57
|
+
? Target
|
|
58
|
+
: never;
|
|
59
|
+
|
|
60
|
+
type Present<T> = Exclude<T, undefined>;
|
|
61
|
+
|
|
62
|
+
type CodecTypesFromDefinition<Definition> = ExtractCodecTypesFromPack<
|
|
63
|
+
Definition extends { readonly target: infer Target } ? Target : never
|
|
64
|
+
> &
|
|
65
|
+
MergeExtensionCodecTypesSafe<DefinitionExtensionPacks<Definition>>;
|
|
66
|
+
|
|
67
|
+
type DefinitionModels<Definition> = Definition extends {
|
|
68
|
+
readonly models?: unknown;
|
|
69
|
+
}
|
|
70
|
+
? Present<Definition['models']> extends Record<string, unknown>
|
|
71
|
+
? Present<Definition['models']>
|
|
72
|
+
: Record<never, never>
|
|
73
|
+
: Record<never, never>;
|
|
74
|
+
|
|
75
|
+
type DefinitionTypes<Definition> = Definition extends {
|
|
76
|
+
readonly types?: unknown;
|
|
77
|
+
}
|
|
78
|
+
? Present<Definition['types']> extends Record<string, StorageTypeInstance>
|
|
79
|
+
? Present<Definition['types']>
|
|
80
|
+
: Record<never, never>
|
|
81
|
+
: Record<never, never>;
|
|
82
|
+
|
|
83
|
+
type DefinitionTableNaming<Definition> = Definition extends {
|
|
84
|
+
readonly naming?: { readonly tables?: infer Strategy extends string };
|
|
85
|
+
}
|
|
86
|
+
? Strategy
|
|
87
|
+
: undefined;
|
|
88
|
+
|
|
89
|
+
type DefinitionColumnNaming<Definition> = Definition extends {
|
|
90
|
+
readonly naming?: { readonly columns?: infer Strategy extends string };
|
|
91
|
+
}
|
|
92
|
+
? Strategy
|
|
93
|
+
: undefined;
|
|
94
|
+
|
|
95
|
+
type FirstChar<S extends string> = S extends `${infer First}${string}` ? First : '';
|
|
96
|
+
|
|
97
|
+
type CharKind<C extends string> = C extends ''
|
|
98
|
+
? 'end'
|
|
99
|
+
: C extends Lowercase<C>
|
|
100
|
+
? C extends Uppercase<C>
|
|
101
|
+
? 'other'
|
|
102
|
+
: 'lower'
|
|
103
|
+
: 'upper';
|
|
104
|
+
|
|
105
|
+
type ShouldInsertSnakeUnderscore<
|
|
106
|
+
PrevKind extends 'start' | 'lower' | 'upper' | 'other' | 'end',
|
|
107
|
+
Current extends string,
|
|
108
|
+
Next extends string,
|
|
109
|
+
> = CharKind<Current> extends 'upper'
|
|
110
|
+
? PrevKind extends 'start'
|
|
111
|
+
? false
|
|
112
|
+
: PrevKind extends 'lower' | 'other'
|
|
113
|
+
? true
|
|
114
|
+
: CharKind<Next> extends 'lower'
|
|
115
|
+
? true
|
|
116
|
+
: false
|
|
117
|
+
: false;
|
|
118
|
+
|
|
119
|
+
type SnakeCaseInternal<
|
|
120
|
+
S extends string,
|
|
121
|
+
PrevKind extends 'start' | 'lower' | 'upper' | 'other' | 'end' = 'start',
|
|
122
|
+
> = S extends `${infer Current}${infer Rest}`
|
|
123
|
+
? `${ShouldInsertSnakeUnderscore<PrevKind, Current, FirstChar<Rest>> extends true
|
|
124
|
+
? '_'
|
|
125
|
+
: ''}${Lowercase<Current>}${SnakeCaseInternal<Rest, CharKind<Current>>}`
|
|
126
|
+
: '';
|
|
127
|
+
|
|
128
|
+
type SnakeCase<S extends string> = string extends S ? string : SnakeCaseInternal<S>;
|
|
129
|
+
|
|
130
|
+
type ApplyNamingType<Name extends string, Strategy extends string | undefined> = string extends Name
|
|
131
|
+
? string
|
|
132
|
+
: Strategy extends 'snake_case'
|
|
133
|
+
? SnakeCase<Name>
|
|
134
|
+
: Name;
|
|
135
|
+
|
|
136
|
+
type ModelNames<Definition> = keyof DefinitionModels<Definition> & string;
|
|
137
|
+
|
|
138
|
+
type ModelFields<
|
|
139
|
+
Definition,
|
|
140
|
+
ModelName extends ModelNames<Definition>,
|
|
141
|
+
> = DefinitionModels<Definition>[ModelName] extends {
|
|
142
|
+
readonly stageOne: {
|
|
143
|
+
readonly fields: Record<string, ScalarFieldBuilder>;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
? DefinitionModels<Definition>[ModelName]['stageOne']['fields']
|
|
147
|
+
: Record<never, never>;
|
|
148
|
+
|
|
149
|
+
type ModelFieldNames<Definition, ModelName extends ModelNames<Definition>> = keyof ModelFields<
|
|
150
|
+
Definition,
|
|
151
|
+
ModelName
|
|
152
|
+
> &
|
|
153
|
+
string;
|
|
154
|
+
|
|
155
|
+
type StagedModelRelations<
|
|
156
|
+
Definition,
|
|
157
|
+
ModelName extends ModelNames<Definition>,
|
|
158
|
+
> = DefinitionModels<Definition>[ModelName] extends {
|
|
159
|
+
readonly stageOne: { readonly relations: infer R };
|
|
160
|
+
}
|
|
161
|
+
? R extends Record<string, unknown>
|
|
162
|
+
? R
|
|
163
|
+
: Record<never, never>
|
|
164
|
+
: Record<never, never>;
|
|
165
|
+
|
|
166
|
+
type StagedModelRelationNames<
|
|
167
|
+
Definition,
|
|
168
|
+
ModelName extends ModelNames<Definition>,
|
|
169
|
+
> = keyof StagedModelRelations<Definition, ModelName> & string;
|
|
170
|
+
|
|
171
|
+
type ModelFieldState<
|
|
172
|
+
Definition,
|
|
173
|
+
ModelName extends ModelNames<Definition>,
|
|
174
|
+
FieldName extends ModelFieldNames<Definition, ModelName>,
|
|
175
|
+
> = FieldStateOf<ModelFields<Definition, ModelName>[FieldName]>;
|
|
176
|
+
|
|
177
|
+
type ModelSql<
|
|
178
|
+
Definition,
|
|
179
|
+
ModelName extends ModelNames<Definition>,
|
|
180
|
+
> = DefinitionModels<Definition>[ModelName] extends {
|
|
181
|
+
readonly __sql: infer SqlSpec;
|
|
182
|
+
}
|
|
183
|
+
? SqlSpec
|
|
184
|
+
: undefined;
|
|
185
|
+
|
|
186
|
+
type ModelAttributes<
|
|
187
|
+
Definition,
|
|
188
|
+
ModelName extends ModelNames<Definition>,
|
|
189
|
+
> = DefinitionModels<Definition>[ModelName] extends {
|
|
190
|
+
readonly __attributes: infer AttributesSpec;
|
|
191
|
+
}
|
|
192
|
+
? AttributesSpec
|
|
193
|
+
: undefined;
|
|
194
|
+
|
|
195
|
+
type FieldDescriptorOf<FieldState> = Present<
|
|
196
|
+
FieldState extends { readonly descriptor?: infer Descriptor } ? Descriptor : never
|
|
197
|
+
>;
|
|
198
|
+
|
|
199
|
+
type FieldTypeRefOf<FieldState> = Present<
|
|
200
|
+
FieldState extends { readonly typeRef?: infer TypeRef } ? TypeRef : never
|
|
201
|
+
>;
|
|
202
|
+
|
|
203
|
+
type FieldNullableOf<FieldState> = FieldState extends {
|
|
204
|
+
readonly nullable: infer Nullable extends boolean;
|
|
205
|
+
}
|
|
206
|
+
? Nullable
|
|
207
|
+
: boolean;
|
|
208
|
+
|
|
209
|
+
type FieldColumnOverrideOf<FieldState> = Present<
|
|
210
|
+
FieldState extends { readonly columnName?: infer ColumnName } ? ColumnName : never
|
|
211
|
+
>;
|
|
212
|
+
|
|
213
|
+
type FieldInlineIdSpecOf<FieldState> = Present<
|
|
214
|
+
FieldState extends { readonly id?: infer IdSpec } ? IdSpec : never
|
|
215
|
+
>;
|
|
216
|
+
|
|
217
|
+
type DescriptorCodecId<Descriptor> = Descriptor extends {
|
|
218
|
+
readonly codecId: infer CodecId extends string;
|
|
219
|
+
}
|
|
220
|
+
? CodecId
|
|
221
|
+
: string;
|
|
222
|
+
|
|
223
|
+
type DescriptorNativeType<Descriptor> = Descriptor extends {
|
|
224
|
+
readonly nativeType: infer NativeType extends string;
|
|
225
|
+
}
|
|
226
|
+
? NativeType
|
|
227
|
+
: string;
|
|
228
|
+
|
|
229
|
+
type DescriptorTypeParams<Descriptor> = Descriptor extends {
|
|
230
|
+
readonly typeParams: infer TypeParams extends Record<string, unknown>;
|
|
231
|
+
}
|
|
232
|
+
? TypeParams
|
|
233
|
+
: undefined;
|
|
234
|
+
|
|
235
|
+
type DescriptorTypeRef<Descriptor> = Descriptor extends {
|
|
236
|
+
readonly typeRef: infer TypeRef extends string;
|
|
237
|
+
}
|
|
238
|
+
? TypeRef
|
|
239
|
+
: undefined;
|
|
240
|
+
|
|
241
|
+
type LookupNamedStorageTypeKeyByValue<Definition, TypeRef extends StorageTypeInstance> = {
|
|
242
|
+
[TypeName in keyof DefinitionTypes<Definition> & string]: [TypeRef] extends [
|
|
243
|
+
DefinitionTypes<Definition>[TypeName],
|
|
244
|
+
]
|
|
245
|
+
? [DefinitionTypes<Definition>[TypeName]] extends [TypeRef]
|
|
246
|
+
? TypeName
|
|
247
|
+
: never
|
|
248
|
+
: never;
|
|
249
|
+
}[keyof DefinitionTypes<Definition> & string];
|
|
250
|
+
|
|
251
|
+
type ResolveNamedStorageTypeKey<Definition, TypeRef> = TypeRef extends string
|
|
252
|
+
? TypeRef
|
|
253
|
+
: TypeRef extends StorageTypeInstance
|
|
254
|
+
? [LookupNamedStorageTypeKeyByValue<Definition, TypeRef>] extends [never]
|
|
255
|
+
? string
|
|
256
|
+
: LookupNamedStorageTypeKeyByValue<Definition, TypeRef>
|
|
257
|
+
: never;
|
|
258
|
+
|
|
259
|
+
type ResolveNamedStorageType<Definition, TypeRef> =
|
|
260
|
+
ResolveNamedStorageTypeKey<Definition, TypeRef> extends infer TypeName extends string
|
|
261
|
+
? TypeName extends keyof DefinitionTypes<Definition>
|
|
262
|
+
? DefinitionTypes<Definition>[TypeName]
|
|
263
|
+
: StorageTypeInstance
|
|
264
|
+
: StorageTypeInstance;
|
|
265
|
+
|
|
266
|
+
type ResolveFieldDescriptor<Definition, FieldState> = [FieldDescriptorOf<FieldState>] extends [
|
|
267
|
+
never,
|
|
268
|
+
]
|
|
269
|
+
? ResolveNamedStorageType<Definition, FieldTypeRefOf<FieldState>>
|
|
270
|
+
: FieldDescriptorOf<FieldState>;
|
|
271
|
+
|
|
272
|
+
type ResolveFieldColumnTypeRef<Definition, FieldState> = [FieldTypeRefOf<FieldState>] extends [
|
|
273
|
+
never,
|
|
274
|
+
]
|
|
275
|
+
? DescriptorTypeRef<FieldDescriptorOf<FieldState>>
|
|
276
|
+
: ResolveNamedStorageTypeKey<Definition, FieldTypeRefOf<FieldState>>;
|
|
277
|
+
|
|
278
|
+
type ResolveFieldColumnTypeParams<Definition, FieldState> = [
|
|
279
|
+
ResolveFieldColumnTypeRef<Definition, FieldState>,
|
|
280
|
+
] extends [string]
|
|
281
|
+
? undefined
|
|
282
|
+
: DescriptorTypeParams<FieldDescriptorOf<FieldState>>;
|
|
283
|
+
|
|
284
|
+
type ModelTableName<Definition, ModelName extends ModelNames<Definition>> = [
|
|
285
|
+
Present<
|
|
286
|
+
ModelSql<Definition, ModelName> extends { readonly table?: infer TableName } ? TableName : never
|
|
287
|
+
>,
|
|
288
|
+
] extends [never]
|
|
289
|
+
? ApplyNamingType<ModelName, DefinitionTableNaming<Definition>>
|
|
290
|
+
: Present<
|
|
291
|
+
ModelSql<Definition, ModelName> extends { readonly table?: infer TableName }
|
|
292
|
+
? TableName
|
|
293
|
+
: never
|
|
294
|
+
> extends infer ExplicitTableName extends string
|
|
295
|
+
? ExplicitTableName
|
|
296
|
+
: ApplyNamingType<ModelName, DefinitionTableNaming<Definition>>;
|
|
297
|
+
|
|
298
|
+
type ModelColumnName<
|
|
299
|
+
Definition,
|
|
300
|
+
ModelName extends ModelNames<Definition>,
|
|
301
|
+
FieldName extends ModelFieldNames<Definition, ModelName>,
|
|
302
|
+
> = [FieldColumnOverrideOf<ModelFieldState<Definition, ModelName, FieldName>>] extends [never]
|
|
303
|
+
? ApplyNamingType<FieldName, DefinitionColumnNaming<Definition>>
|
|
304
|
+
: FieldColumnOverrideOf<
|
|
305
|
+
ModelFieldState<Definition, ModelName, FieldName>
|
|
306
|
+
> extends infer ExplicitColumnName extends string
|
|
307
|
+
? ExplicitColumnName
|
|
308
|
+
: ApplyNamingType<FieldName, DefinitionColumnNaming<Definition>>;
|
|
309
|
+
|
|
310
|
+
type FieldNamesToColumnNames<
|
|
311
|
+
Definition,
|
|
312
|
+
ModelName extends ModelNames<Definition>,
|
|
313
|
+
FieldNames extends readonly string[],
|
|
314
|
+
> = FieldNames extends readonly []
|
|
315
|
+
? readonly []
|
|
316
|
+
: FieldNames extends readonly [
|
|
317
|
+
infer First extends ModelFieldNames<Definition, ModelName>,
|
|
318
|
+
...infer Rest extends readonly string[],
|
|
319
|
+
]
|
|
320
|
+
? readonly [
|
|
321
|
+
ModelColumnName<Definition, ModelName, First>,
|
|
322
|
+
...FieldNamesToColumnNames<Definition, ModelName, Rest>,
|
|
323
|
+
]
|
|
324
|
+
: readonly string[];
|
|
325
|
+
|
|
326
|
+
type InlineIdFieldName<Definition, ModelName extends ModelNames<Definition>> = {
|
|
327
|
+
[FieldName in ModelFieldNames<Definition, ModelName>]: [
|
|
328
|
+
FieldInlineIdSpecOf<ModelFieldState<Definition, ModelName, FieldName>>,
|
|
329
|
+
] extends [never]
|
|
330
|
+
? never
|
|
331
|
+
: FieldName;
|
|
332
|
+
}[ModelFieldNames<Definition, ModelName>];
|
|
333
|
+
|
|
334
|
+
type InlineIdFieldNames<Definition, ModelName extends ModelNames<Definition>> = [
|
|
335
|
+
InlineIdFieldName<Definition, ModelName>,
|
|
336
|
+
] extends [never]
|
|
337
|
+
? undefined
|
|
338
|
+
: readonly [InlineIdFieldName<Definition, ModelName>];
|
|
339
|
+
|
|
340
|
+
type InlineIdName<Definition, ModelName extends ModelNames<Definition>> = {
|
|
341
|
+
[FieldName in ModelFieldNames<Definition, ModelName>]: FieldInlineIdSpecOf<
|
|
342
|
+
ModelFieldState<Definition, ModelName, FieldName>
|
|
343
|
+
> extends { readonly name?: infer Name extends string }
|
|
344
|
+
? Name
|
|
345
|
+
: never;
|
|
346
|
+
}[ModelFieldNames<Definition, ModelName>];
|
|
347
|
+
|
|
348
|
+
type AttributeIdFieldNames<
|
|
349
|
+
Definition,
|
|
350
|
+
ModelName extends ModelNames<Definition>,
|
|
351
|
+
> = AttributeStageIdFieldNames<ModelAttributes<Definition, ModelName>>;
|
|
352
|
+
|
|
353
|
+
type AttributeIdName<Definition, ModelName extends ModelNames<Definition>> = Present<
|
|
354
|
+
ModelAttributes<Definition, ModelName> extends {
|
|
355
|
+
readonly id?: { readonly name?: infer Name extends string };
|
|
356
|
+
}
|
|
357
|
+
? Name
|
|
358
|
+
: never
|
|
359
|
+
>;
|
|
360
|
+
|
|
361
|
+
type ModelIdFieldNames<Definition, ModelName extends ModelNames<Definition>> = [
|
|
362
|
+
AttributeIdFieldNames<Definition, ModelName>,
|
|
363
|
+
] extends [undefined]
|
|
364
|
+
? InlineIdFieldNames<Definition, ModelName>
|
|
365
|
+
: AttributeIdFieldNames<Definition, ModelName>;
|
|
366
|
+
|
|
367
|
+
type ModelIdName<Definition, ModelName extends ModelNames<Definition>> = [
|
|
368
|
+
AttributeIdName<Definition, ModelName>,
|
|
369
|
+
] extends [never]
|
|
370
|
+
? Present<InlineIdName<Definition, ModelName>>
|
|
371
|
+
: AttributeIdName<Definition, ModelName>;
|
|
372
|
+
|
|
373
|
+
type StorageColumn<
|
|
374
|
+
CodecId extends string,
|
|
375
|
+
Nullable extends boolean,
|
|
376
|
+
NativeType extends string,
|
|
377
|
+
TypeRef extends string | undefined = undefined,
|
|
378
|
+
TypeParams extends Record<string, unknown> | undefined = undefined,
|
|
379
|
+
> = {
|
|
380
|
+
readonly nativeType: NativeType;
|
|
381
|
+
readonly codecId: CodecId;
|
|
382
|
+
readonly nullable: Nullable;
|
|
383
|
+
readonly default?: ColumnDefault;
|
|
384
|
+
} & (TypeRef extends string ? { readonly typeRef: TypeRef } : Record<string, never>) &
|
|
385
|
+
(TypeParams extends Record<string, unknown>
|
|
386
|
+
? { readonly typeParams: TypeParams }
|
|
387
|
+
: Record<string, never>);
|
|
388
|
+
|
|
389
|
+
type ModelStorageColumn<
|
|
390
|
+
Definition,
|
|
391
|
+
ModelName extends ModelNames<Definition>,
|
|
392
|
+
FieldName extends string,
|
|
393
|
+
> = FieldName extends ModelFieldNames<Definition, ModelName>
|
|
394
|
+
? StorageColumn<
|
|
395
|
+
DescriptorCodecId<
|
|
396
|
+
ResolveFieldDescriptor<Definition, ModelFieldState<Definition, ModelName, FieldName>>
|
|
397
|
+
>,
|
|
398
|
+
FieldNullableOf<ModelFieldState<Definition, ModelName, FieldName>>,
|
|
399
|
+
DescriptorNativeType<
|
|
400
|
+
ResolveFieldDescriptor<Definition, ModelFieldState<Definition, ModelName, FieldName>>
|
|
401
|
+
>,
|
|
402
|
+
ResolveFieldColumnTypeRef<Definition, ModelFieldState<Definition, ModelName, FieldName>>,
|
|
403
|
+
ResolveFieldColumnTypeParams<Definition, ModelFieldState<Definition, ModelName, FieldName>>
|
|
404
|
+
>
|
|
405
|
+
: never;
|
|
406
|
+
|
|
407
|
+
type BuiltModels<Definition> = {
|
|
408
|
+
readonly [ModelName in ModelNames<Definition>]: {
|
|
409
|
+
readonly storage: {
|
|
410
|
+
readonly table: ModelTableName<Definition, ModelName>;
|
|
411
|
+
readonly fields: {
|
|
412
|
+
readonly [FieldName in ModelFieldNames<Definition, ModelName>]: {
|
|
413
|
+
readonly column: ModelColumnName<Definition, ModelName, FieldName>;
|
|
414
|
+
};
|
|
415
|
+
};
|
|
416
|
+
};
|
|
417
|
+
readonly fields: {
|
|
418
|
+
readonly [FieldName in ModelFieldNames<Definition, ModelName>]: {
|
|
419
|
+
readonly nullable: ModelStorageColumn<Definition, ModelName, FieldName>['nullable'];
|
|
420
|
+
readonly type: {
|
|
421
|
+
readonly kind: 'scalar';
|
|
422
|
+
readonly codecId: ModelStorageColumn<Definition, ModelName, FieldName>['codecId'];
|
|
423
|
+
};
|
|
424
|
+
};
|
|
425
|
+
};
|
|
426
|
+
readonly relations: {
|
|
427
|
+
readonly [RelName in StagedModelRelationNames<Definition, ModelName>]: ContractRelation;
|
|
428
|
+
};
|
|
429
|
+
};
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
type BuiltModelColumnMappings<
|
|
433
|
+
Definition,
|
|
434
|
+
ModelName extends ModelNames<Definition>,
|
|
435
|
+
> = BuiltModels<Definition>[ModelName]['storage']['fields'];
|
|
436
|
+
|
|
437
|
+
type BuiltModelTableName<
|
|
438
|
+
Definition,
|
|
439
|
+
ModelName extends ModelNames<Definition>,
|
|
440
|
+
> = BuiltModels<Definition>[ModelName]['storage']['table'];
|
|
441
|
+
|
|
442
|
+
type BuiltStorageTableColumns<Definition, ModelName extends ModelNames<Definition>> = {
|
|
443
|
+
readonly [FieldName in keyof BuiltModelColumnMappings<Definition, ModelName> &
|
|
444
|
+
string as BuiltModelColumnMappings<
|
|
445
|
+
Definition,
|
|
446
|
+
ModelName
|
|
447
|
+
>[FieldName]['column']]: ModelStorageColumn<Definition, ModelName, FieldName>;
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
type BuiltStorageTables<Definition> = {
|
|
451
|
+
readonly [ModelName in ModelNames<Definition> as BuiltModelTableName<Definition, ModelName>]: {
|
|
452
|
+
readonly columns: BuiltStorageTableColumns<Definition, ModelName>;
|
|
453
|
+
readonly uniques: ReadonlyArray<{
|
|
454
|
+
readonly columns: readonly string[];
|
|
455
|
+
readonly name?: string;
|
|
456
|
+
}>;
|
|
457
|
+
readonly indexes: ReadonlyArray<Index>;
|
|
458
|
+
readonly foreignKeys: ReadonlyArray<{
|
|
459
|
+
readonly columns: readonly string[];
|
|
460
|
+
readonly references: { readonly table: string; readonly columns: readonly string[] };
|
|
461
|
+
readonly name?: string;
|
|
462
|
+
readonly onDelete?: ReferentialAction;
|
|
463
|
+
readonly onUpdate?: ReferentialAction;
|
|
464
|
+
readonly constraint: boolean;
|
|
465
|
+
readonly index: boolean;
|
|
466
|
+
}>;
|
|
467
|
+
} & (ModelIdFieldNames<Definition, ModelName> extends readonly string[]
|
|
468
|
+
? {
|
|
469
|
+
readonly primaryKey: {
|
|
470
|
+
readonly columns: FieldNamesToColumnNames<
|
|
471
|
+
Definition,
|
|
472
|
+
ModelName,
|
|
473
|
+
ModelIdFieldNames<Definition, ModelName>
|
|
474
|
+
>;
|
|
475
|
+
readonly name?: ModelIdName<Definition, ModelName>;
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
: Record<string, never>);
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
type BuiltStorage<Definition> = {
|
|
482
|
+
readonly storageHash: StorageHashBase<string>;
|
|
483
|
+
readonly tables: BuiltStorageTables<Definition>;
|
|
484
|
+
readonly types: DefinitionTypes<Definition>;
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
type FieldOutputType<
|
|
488
|
+
Definition,
|
|
489
|
+
ModelName extends ModelNames<Definition>,
|
|
490
|
+
FieldName extends ModelFieldNames<Definition, ModelName>,
|
|
491
|
+
> = ModelStorageColumn<Definition, ModelName, FieldName> extends infer Col
|
|
492
|
+
? Col extends { readonly codecId: infer Id extends string }
|
|
493
|
+
? Id extends keyof CodecTypesFromDefinition<Definition>
|
|
494
|
+
? CodecTypesFromDefinition<Definition>[Id] extends { readonly output: infer O }
|
|
495
|
+
? Col extends { readonly nullable: true }
|
|
496
|
+
? O | null
|
|
497
|
+
: O
|
|
498
|
+
: unknown
|
|
499
|
+
: unknown
|
|
500
|
+
: unknown
|
|
501
|
+
: unknown;
|
|
502
|
+
|
|
503
|
+
type FieldOutputTypes<Definition> = {
|
|
504
|
+
readonly [ModelName in ModelNames<Definition>]: {
|
|
505
|
+
readonly [FieldName in ModelFieldNames<Definition, ModelName>]: FieldOutputType<
|
|
506
|
+
Definition,
|
|
507
|
+
ModelName,
|
|
508
|
+
FieldName
|
|
509
|
+
>;
|
|
510
|
+
};
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
export type SqlContractResult<Definition> = ContractWithTypeMaps<
|
|
514
|
+
Contract<BuiltStorage<Definition>, BuiltModels<Definition>> & {
|
|
515
|
+
readonly target: DefinitionTargetId<Definition>;
|
|
516
|
+
readonly targetFamily: 'sql';
|
|
517
|
+
} & {
|
|
518
|
+
readonly extensionPacks: keyof DefinitionExtensionPacks<Definition> extends never
|
|
519
|
+
? Record<string, never>
|
|
520
|
+
: DefinitionExtensionPacks<Definition>;
|
|
521
|
+
readonly capabilities: DefinitionCapabilities<Definition> extends Record<
|
|
522
|
+
string,
|
|
523
|
+
Record<string, boolean>
|
|
524
|
+
>
|
|
525
|
+
? DefinitionCapabilities<Definition>
|
|
526
|
+
: Record<string, Record<string, boolean>>;
|
|
527
|
+
},
|
|
528
|
+
TypeMaps<
|
|
529
|
+
CodecTypesFromDefinition<Definition>,
|
|
530
|
+
Record<string, never>,
|
|
531
|
+
Record<string, never>,
|
|
532
|
+
FieldOutputTypes<Definition>
|
|
533
|
+
>
|
|
534
|
+
>;
|