@prisma-next/sql-contract-ts 0.3.0-dev.133 → 0.3.0-dev.135

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.
@@ -0,0 +1,494 @@
1
+ import type { ExtensionPackRef, TargetPackRef } from '@prisma-next/contract/framework-components';
2
+ import type { ColumnDefault } from '@prisma-next/contract/types';
3
+ import type {
4
+ ContractWithTypeMaps,
5
+ Index,
6
+ ReferentialAction,
7
+ SqlContract,
8
+ StorageTypeInstance,
9
+ TypeMaps,
10
+ } from '@prisma-next/sql-contract/types';
11
+ import type { UnionToIntersection } from './authoring-type-utils';
12
+ import type {
13
+ AttributeStageIdFieldNames,
14
+ FieldStateOf,
15
+ ScalarFieldBuilder,
16
+ } from './staged-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 StagedDefinitionExtensionPacks<Definition> = Definition extends {
43
+ readonly extensionPacks?: infer Packs extends Record<string, ExtensionPackRef<'sql', string>>;
44
+ }
45
+ ? Packs
46
+ : Record<never, never>;
47
+
48
+ type StagedDefinitionCapabilities<Definition> = Definition extends {
49
+ readonly capabilities?: infer Capabilities extends Record<string, Record<string, boolean>>;
50
+ }
51
+ ? Capabilities
52
+ : undefined;
53
+
54
+ type StagedDefinitionTargetId<Definition> = Definition extends {
55
+ readonly target: TargetPackRef<'sql', infer Target>;
56
+ }
57
+ ? Target
58
+ : never;
59
+
60
+ type StagedDefinitionStorageHash<Definition> = Definition extends {
61
+ readonly storageHash?: infer StorageHash extends string;
62
+ }
63
+ ? StorageHash
64
+ : undefined;
65
+
66
+ type Present<T> = Exclude<T, undefined>;
67
+
68
+ type CodecTypesFromStagedDefinition<Definition> = ExtractCodecTypesFromPack<
69
+ Definition extends { readonly target: infer Target } ? Target : never
70
+ > &
71
+ MergeExtensionCodecTypesSafe<StagedDefinitionExtensionPacks<Definition>>;
72
+
73
+ type StagedDefinitionModels<Definition> = Definition extends {
74
+ readonly models?: unknown;
75
+ }
76
+ ? Present<Definition['models']> extends Record<string, unknown>
77
+ ? Present<Definition['models']>
78
+ : Record<never, never>
79
+ : Record<never, never>;
80
+
81
+ type StagedDefinitionTypes<Definition> = Definition extends {
82
+ readonly types?: unknown;
83
+ }
84
+ ? Present<Definition['types']> extends Record<string, StorageTypeInstance>
85
+ ? Present<Definition['types']>
86
+ : Record<never, never>
87
+ : Record<never, never>;
88
+
89
+ type StagedDefinitionTableNaming<Definition> = Definition extends {
90
+ readonly naming?: { readonly tables?: infer Strategy extends string };
91
+ }
92
+ ? Strategy
93
+ : undefined;
94
+
95
+ type StagedDefinitionColumnNaming<Definition> = Definition extends {
96
+ readonly naming?: { readonly columns?: infer Strategy extends string };
97
+ }
98
+ ? Strategy
99
+ : undefined;
100
+
101
+ type FirstChar<S extends string> = S extends `${infer First}${string}` ? First : '';
102
+
103
+ type CharKind<C extends string> = C extends ''
104
+ ? 'end'
105
+ : C extends Lowercase<C>
106
+ ? C extends Uppercase<C>
107
+ ? 'other'
108
+ : 'lower'
109
+ : 'upper';
110
+
111
+ type ShouldInsertSnakeUnderscore<
112
+ PrevKind extends 'start' | 'lower' | 'upper' | 'other' | 'end',
113
+ Current extends string,
114
+ Next extends string,
115
+ > = CharKind<Current> extends 'upper'
116
+ ? PrevKind extends 'start'
117
+ ? false
118
+ : PrevKind extends 'lower' | 'other'
119
+ ? true
120
+ : CharKind<Next> extends 'lower'
121
+ ? true
122
+ : false
123
+ : false;
124
+
125
+ type SnakeCaseInternal<
126
+ S extends string,
127
+ PrevKind extends 'start' | 'lower' | 'upper' | 'other' | 'end' = 'start',
128
+ > = S extends `${infer Current}${infer Rest}`
129
+ ? `${ShouldInsertSnakeUnderscore<PrevKind, Current, FirstChar<Rest>> extends true
130
+ ? '_'
131
+ : ''}${Lowercase<Current>}${SnakeCaseInternal<Rest, CharKind<Current>>}`
132
+ : '';
133
+
134
+ type SnakeCase<S extends string> = string extends S ? string : SnakeCaseInternal<S>;
135
+
136
+ type ApplyNamingType<Name extends string, Strategy extends string | undefined> = string extends Name
137
+ ? string
138
+ : Strategy extends 'snake_case'
139
+ ? SnakeCase<Name>
140
+ : Name;
141
+
142
+ type StagedModelNames<Definition> = keyof StagedDefinitionModels<Definition> & string;
143
+
144
+ type StagedModelFields<
145
+ Definition,
146
+ ModelName extends StagedModelNames<Definition>,
147
+ > = StagedDefinitionModels<Definition>[ModelName] extends {
148
+ readonly stageOne: {
149
+ readonly fields: Record<string, ScalarFieldBuilder>;
150
+ };
151
+ }
152
+ ? StagedDefinitionModels<Definition>[ModelName]['stageOne']['fields']
153
+ : Record<never, never>;
154
+
155
+ type StagedModelFieldNames<
156
+ Definition,
157
+ ModelName extends StagedModelNames<Definition>,
158
+ > = keyof StagedModelFields<Definition, ModelName> & string;
159
+
160
+ type StagedModelFieldState<
161
+ Definition,
162
+ ModelName extends StagedModelNames<Definition>,
163
+ FieldName extends StagedModelFieldNames<Definition, ModelName>,
164
+ > = FieldStateOf<StagedModelFields<Definition, ModelName>[FieldName]>;
165
+
166
+ type StagedModelSql<
167
+ Definition,
168
+ ModelName extends StagedModelNames<Definition>,
169
+ > = StagedDefinitionModels<Definition>[ModelName] extends {
170
+ readonly __sql: infer SqlSpec;
171
+ }
172
+ ? SqlSpec
173
+ : undefined;
174
+
175
+ type StagedModelAttributes<
176
+ Definition,
177
+ ModelName extends StagedModelNames<Definition>,
178
+ > = StagedDefinitionModels<Definition>[ModelName] extends {
179
+ readonly __attributes: infer AttributesSpec;
180
+ }
181
+ ? AttributesSpec
182
+ : undefined;
183
+
184
+ type FieldDescriptorOf<FieldState> = Present<
185
+ FieldState extends { readonly descriptor?: infer Descriptor } ? Descriptor : never
186
+ >;
187
+
188
+ type FieldTypeRefOf<FieldState> = Present<
189
+ FieldState extends { readonly typeRef?: infer TypeRef } ? TypeRef : never
190
+ >;
191
+
192
+ type FieldNullableOf<FieldState> = FieldState extends {
193
+ readonly nullable: infer Nullable extends boolean;
194
+ }
195
+ ? Nullable
196
+ : boolean;
197
+
198
+ type FieldColumnOverrideOf<FieldState> = Present<
199
+ FieldState extends { readonly columnName?: infer ColumnName } ? ColumnName : never
200
+ >;
201
+
202
+ type FieldInlineIdSpecOf<FieldState> = Present<
203
+ FieldState extends { readonly id?: infer IdSpec } ? IdSpec : never
204
+ >;
205
+
206
+ type DescriptorCodecId<Descriptor> = Descriptor extends {
207
+ readonly codecId: infer CodecId extends string;
208
+ }
209
+ ? CodecId
210
+ : string;
211
+
212
+ type DescriptorNativeType<Descriptor> = Descriptor extends {
213
+ readonly nativeType: infer NativeType extends string;
214
+ }
215
+ ? NativeType
216
+ : string;
217
+
218
+ type DescriptorTypeParams<Descriptor> = Descriptor extends {
219
+ readonly typeParams: infer TypeParams extends Record<string, unknown>;
220
+ }
221
+ ? TypeParams
222
+ : undefined;
223
+
224
+ type DescriptorTypeRef<Descriptor> = Descriptor extends {
225
+ readonly typeRef: infer TypeRef extends string;
226
+ }
227
+ ? TypeRef
228
+ : undefined;
229
+
230
+ type LookupNamedStorageTypeKeyByValue<Definition, TypeRef extends StorageTypeInstance> = {
231
+ [TypeName in keyof StagedDefinitionTypes<Definition> & string]: [TypeRef] extends [
232
+ StagedDefinitionTypes<Definition>[TypeName],
233
+ ]
234
+ ? [StagedDefinitionTypes<Definition>[TypeName]] extends [TypeRef]
235
+ ? TypeName
236
+ : never
237
+ : never;
238
+ }[keyof StagedDefinitionTypes<Definition> & string];
239
+
240
+ type ResolveNamedStorageTypeKey<Definition, TypeRef> = TypeRef extends string
241
+ ? TypeRef
242
+ : TypeRef extends StorageTypeInstance
243
+ ? [LookupNamedStorageTypeKeyByValue<Definition, TypeRef>] extends [never]
244
+ ? string
245
+ : LookupNamedStorageTypeKeyByValue<Definition, TypeRef>
246
+ : never;
247
+
248
+ type ResolveNamedStorageType<Definition, TypeRef> =
249
+ ResolveNamedStorageTypeKey<Definition, TypeRef> extends infer TypeName extends string
250
+ ? TypeName extends keyof StagedDefinitionTypes<Definition>
251
+ ? StagedDefinitionTypes<Definition>[TypeName]
252
+ : StorageTypeInstance
253
+ : StorageTypeInstance;
254
+
255
+ type ResolveFieldDescriptor<Definition, FieldState> = [FieldDescriptorOf<FieldState>] extends [
256
+ never,
257
+ ]
258
+ ? ResolveNamedStorageType<Definition, FieldTypeRefOf<FieldState>>
259
+ : FieldDescriptorOf<FieldState>;
260
+
261
+ type ResolveFieldColumnTypeRef<Definition, FieldState> = [FieldTypeRefOf<FieldState>] extends [
262
+ never,
263
+ ]
264
+ ? DescriptorTypeRef<FieldDescriptorOf<FieldState>>
265
+ : ResolveNamedStorageTypeKey<Definition, FieldTypeRefOf<FieldState>>;
266
+
267
+ type ResolveFieldColumnTypeParams<Definition, FieldState> = [
268
+ ResolveFieldColumnTypeRef<Definition, FieldState>,
269
+ ] extends [string]
270
+ ? undefined
271
+ : DescriptorTypeParams<FieldDescriptorOf<FieldState>>;
272
+
273
+ type StagedModelTableName<Definition, ModelName extends StagedModelNames<Definition>> = [
274
+ Present<
275
+ StagedModelSql<Definition, ModelName> extends { readonly table?: infer TableName }
276
+ ? TableName
277
+ : never
278
+ >,
279
+ ] extends [never]
280
+ ? ApplyNamingType<ModelName, StagedDefinitionTableNaming<Definition>>
281
+ : Present<
282
+ StagedModelSql<Definition, ModelName> extends { readonly table?: infer TableName }
283
+ ? TableName
284
+ : never
285
+ > extends infer ExplicitTableName extends string
286
+ ? ExplicitTableName
287
+ : ApplyNamingType<ModelName, StagedDefinitionTableNaming<Definition>>;
288
+
289
+ type StagedModelColumnName<
290
+ Definition,
291
+ ModelName extends StagedModelNames<Definition>,
292
+ FieldName extends StagedModelFieldNames<Definition, ModelName>,
293
+ > = [FieldColumnOverrideOf<StagedModelFieldState<Definition, ModelName, FieldName>>] extends [never]
294
+ ? ApplyNamingType<FieldName, StagedDefinitionColumnNaming<Definition>>
295
+ : FieldColumnOverrideOf<
296
+ StagedModelFieldState<Definition, ModelName, FieldName>
297
+ > extends infer ExplicitColumnName extends string
298
+ ? ExplicitColumnName
299
+ : ApplyNamingType<FieldName, StagedDefinitionColumnNaming<Definition>>;
300
+
301
+ type StagedFieldNamesToColumnNames<
302
+ Definition,
303
+ ModelName extends StagedModelNames<Definition>,
304
+ FieldNames extends readonly string[],
305
+ > = FieldNames extends readonly []
306
+ ? readonly []
307
+ : FieldNames extends readonly [
308
+ infer First extends StagedModelFieldNames<Definition, ModelName>,
309
+ ...infer Rest extends readonly string[],
310
+ ]
311
+ ? readonly [
312
+ StagedModelColumnName<Definition, ModelName, First>,
313
+ ...StagedFieldNamesToColumnNames<Definition, ModelName, Rest>,
314
+ ]
315
+ : readonly string[];
316
+
317
+ type StagedInlineIdFieldName<Definition, ModelName extends StagedModelNames<Definition>> = {
318
+ [FieldName in StagedModelFieldNames<Definition, ModelName>]: [
319
+ FieldInlineIdSpecOf<StagedModelFieldState<Definition, ModelName, FieldName>>,
320
+ ] extends [never]
321
+ ? never
322
+ : FieldName;
323
+ }[StagedModelFieldNames<Definition, ModelName>];
324
+
325
+ type StagedInlineIdFieldNames<Definition, ModelName extends StagedModelNames<Definition>> = [
326
+ StagedInlineIdFieldName<Definition, ModelName>,
327
+ ] extends [never]
328
+ ? undefined
329
+ : readonly [StagedInlineIdFieldName<Definition, ModelName>];
330
+
331
+ type StagedInlineIdName<Definition, ModelName extends StagedModelNames<Definition>> = {
332
+ [FieldName in StagedModelFieldNames<Definition, ModelName>]: FieldInlineIdSpecOf<
333
+ StagedModelFieldState<Definition, ModelName, FieldName>
334
+ > extends { readonly name?: infer Name extends string }
335
+ ? Name
336
+ : never;
337
+ }[StagedModelFieldNames<Definition, ModelName>];
338
+
339
+ type StagedAttributeIdFieldNames<
340
+ Definition,
341
+ ModelName extends StagedModelNames<Definition>,
342
+ > = AttributeStageIdFieldNames<StagedModelAttributes<Definition, ModelName>>;
343
+
344
+ type StagedAttributeIdName<Definition, ModelName extends StagedModelNames<Definition>> = Present<
345
+ StagedModelAttributes<Definition, ModelName> extends {
346
+ readonly id?: { readonly name?: infer Name extends string };
347
+ }
348
+ ? Name
349
+ : never
350
+ >;
351
+
352
+ type StagedModelIdFieldNames<Definition, ModelName extends StagedModelNames<Definition>> = [
353
+ StagedAttributeIdFieldNames<Definition, ModelName>,
354
+ ] extends [undefined]
355
+ ? StagedInlineIdFieldNames<Definition, ModelName>
356
+ : StagedAttributeIdFieldNames<Definition, ModelName>;
357
+
358
+ type StagedModelIdName<Definition, ModelName extends StagedModelNames<Definition>> = [
359
+ StagedAttributeIdName<Definition, ModelName>,
360
+ ] extends [never]
361
+ ? Present<StagedInlineIdName<Definition, ModelName>>
362
+ : StagedAttributeIdName<Definition, ModelName>;
363
+
364
+ type StagedStorageColumn<
365
+ CodecId extends string,
366
+ Nullable extends boolean,
367
+ NativeType extends string,
368
+ TypeRef extends string | undefined = undefined,
369
+ TypeParams extends Record<string, unknown> | undefined = undefined,
370
+ > = {
371
+ readonly nativeType: NativeType;
372
+ readonly codecId: CodecId;
373
+ readonly nullable: Nullable;
374
+ readonly default?: ColumnDefault;
375
+ } & (TypeRef extends string ? { readonly typeRef: TypeRef } : Record<string, never>) &
376
+ (TypeParams extends Record<string, unknown>
377
+ ? { readonly typeParams: TypeParams }
378
+ : Record<string, never>);
379
+
380
+ type StagedModelStorageColumn<
381
+ Definition,
382
+ ModelName extends StagedModelNames<Definition>,
383
+ FieldName extends string,
384
+ > = FieldName extends StagedModelFieldNames<Definition, ModelName>
385
+ ? StagedStorageColumn<
386
+ DescriptorCodecId<
387
+ ResolveFieldDescriptor<Definition, StagedModelFieldState<Definition, ModelName, FieldName>>
388
+ >,
389
+ FieldNullableOf<StagedModelFieldState<Definition, ModelName, FieldName>>,
390
+ DescriptorNativeType<
391
+ ResolveFieldDescriptor<Definition, StagedModelFieldState<Definition, ModelName, FieldName>>
392
+ >,
393
+ ResolveFieldColumnTypeRef<
394
+ Definition,
395
+ StagedModelFieldState<Definition, ModelName, FieldName>
396
+ >,
397
+ ResolveFieldColumnTypeParams<
398
+ Definition,
399
+ StagedModelFieldState<Definition, ModelName, FieldName>
400
+ >
401
+ >
402
+ : never;
403
+
404
+ type StagedBuiltModels<Definition> = {
405
+ readonly [ModelName in StagedModelNames<Definition>]: {
406
+ readonly storage: {
407
+ readonly table: StagedModelTableName<Definition, ModelName>;
408
+ };
409
+ readonly fields: {
410
+ readonly [FieldName in StagedModelFieldNames<Definition, ModelName>]: {
411
+ readonly column: StagedModelColumnName<Definition, ModelName, FieldName>;
412
+ };
413
+ };
414
+ };
415
+ };
416
+
417
+ type StagedBuiltModelFields<
418
+ Definition,
419
+ ModelName extends StagedModelNames<Definition>,
420
+ > = StagedBuiltModels<Definition>[ModelName]['fields'];
421
+
422
+ type StagedBuiltModelTableName<
423
+ Definition,
424
+ ModelName extends StagedModelNames<Definition>,
425
+ > = StagedBuiltModels<Definition>[ModelName]['storage']['table'];
426
+
427
+ type StagedBuiltStorageTableColumns<Definition, ModelName extends StagedModelNames<Definition>> = {
428
+ readonly [FieldName in keyof StagedBuiltModelFields<Definition, ModelName> &
429
+ string as StagedBuiltModelFields<
430
+ Definition,
431
+ ModelName
432
+ >[FieldName]['column']]: StagedModelStorageColumn<Definition, ModelName, FieldName>;
433
+ };
434
+
435
+ type StagedBuiltStorageTables<Definition> = {
436
+ readonly [ModelName in StagedModelNames<Definition> as StagedBuiltModelTableName<
437
+ Definition,
438
+ ModelName
439
+ >]: {
440
+ readonly columns: StagedBuiltStorageTableColumns<Definition, ModelName>;
441
+ readonly uniques: ReadonlyArray<{
442
+ readonly columns: readonly string[];
443
+ readonly name?: string;
444
+ }>;
445
+ readonly indexes: ReadonlyArray<Index>;
446
+ readonly foreignKeys: ReadonlyArray<{
447
+ readonly columns: readonly string[];
448
+ readonly references: { readonly table: string; readonly columns: readonly string[] };
449
+ readonly name?: string;
450
+ readonly onDelete?: ReferentialAction;
451
+ readonly onUpdate?: ReferentialAction;
452
+ readonly constraint: boolean;
453
+ readonly index: boolean;
454
+ }>;
455
+ } & (StagedModelIdFieldNames<Definition, ModelName> extends readonly string[]
456
+ ? {
457
+ readonly primaryKey: {
458
+ readonly columns: StagedFieldNamesToColumnNames<
459
+ Definition,
460
+ ModelName,
461
+ StagedModelIdFieldNames<Definition, ModelName>
462
+ >;
463
+ readonly name?: StagedModelIdName<Definition, ModelName>;
464
+ };
465
+ }
466
+ : Record<string, never>);
467
+ };
468
+
469
+ type StagedBuiltStorage<Definition> = {
470
+ readonly tables: StagedBuiltStorageTables<Definition>;
471
+ readonly types: StagedDefinitionTypes<Definition>;
472
+ };
473
+
474
+ export type SqlContractResult<Definition> = ContractWithTypeMaps<
475
+ SqlContract<StagedBuiltStorage<Definition>, StagedBuiltModels<Definition>> & {
476
+ readonly schemaVersion: '1';
477
+ readonly target: StagedDefinitionTargetId<Definition>;
478
+ readonly targetFamily: 'sql';
479
+ readonly storageHash: StagedDefinitionStorageHash<Definition> extends string
480
+ ? StagedDefinitionStorageHash<Definition>
481
+ : string;
482
+ } & {
483
+ readonly extensionPacks: keyof StagedDefinitionExtensionPacks<Definition> extends never
484
+ ? Record<string, never>
485
+ : StagedDefinitionExtensionPacks<Definition>;
486
+ readonly capabilities: StagedDefinitionCapabilities<Definition> extends Record<
487
+ string,
488
+ Record<string, boolean>
489
+ >
490
+ ? StagedDefinitionCapabilities<Definition>
491
+ : Record<string, Record<string, boolean>>;
492
+ },
493
+ TypeMaps<CodecTypesFromStagedDefinition<Definition>, Record<string, never>>
494
+ >;