@prisma-next/sql-contract-ts 0.14.0-dev.2 → 0.14.0-dev.20
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/dist/config-types.d.mts.map +1 -1
- package/dist/config-types.mjs +14 -7
- package/dist/config-types.mjs.map +1 -1
- package/dist/contract-builder.d.mts +32 -20
- package/dist/contract-builder.d.mts.map +1 -1
- package/dist/contract-builder.mjs +9 -2
- package/dist/contract-builder.mjs.map +1 -1
- package/package.json +10 -10
- package/src/config-types.ts +3 -0
- package/src/contract-dsl.ts +101 -31
- package/src/contract-lowering.ts +1 -0
- package/src/contract-types.ts +34 -10
package/package.json
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-contract-ts",
|
|
3
|
-
"version": "0.14.0-dev.
|
|
3
|
+
"version": "0.14.0-dev.20",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "SQL-specific TypeScript contract authoring surface for Prisma Next",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@prisma-next/config": "0.14.0-dev.
|
|
10
|
-
"@prisma-next/contract": "0.14.0-dev.
|
|
11
|
-
"@prisma-next/contract-authoring": "0.14.0-dev.
|
|
12
|
-
"@prisma-next/framework-components": "0.14.0-dev.
|
|
13
|
-
"@prisma-next/sql-contract": "0.14.0-dev.
|
|
14
|
-
"@prisma-next/utils": "0.14.0-dev.
|
|
9
|
+
"@prisma-next/config": "0.14.0-dev.20",
|
|
10
|
+
"@prisma-next/contract": "0.14.0-dev.20",
|
|
11
|
+
"@prisma-next/contract-authoring": "0.14.0-dev.20",
|
|
12
|
+
"@prisma-next/framework-components": "0.14.0-dev.20",
|
|
13
|
+
"@prisma-next/sql-contract": "0.14.0-dev.20",
|
|
14
|
+
"@prisma-next/utils": "0.14.0-dev.20",
|
|
15
15
|
"arktype": "^2.2.0",
|
|
16
16
|
"pathe": "^2.0.3",
|
|
17
17
|
"ts-toolbelt": "^9.6.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@prisma-next/test-utils": "0.14.0-dev.
|
|
21
|
-
"@prisma-next/tsconfig": "0.14.0-dev.
|
|
20
|
+
"@prisma-next/test-utils": "0.14.0-dev.20",
|
|
21
|
+
"@prisma-next/tsconfig": "0.14.0-dev.20",
|
|
22
22
|
"@types/pg": "8.20.0",
|
|
23
23
|
"pg": "8.21.0",
|
|
24
|
-
"@prisma-next/tsdown": "0.14.0-dev.
|
|
24
|
+
"@prisma-next/tsdown": "0.14.0-dev.20",
|
|
25
25
|
"tsdown": "0.22.1",
|
|
26
26
|
"typescript": "5.9.3",
|
|
27
27
|
"vitest": "4.1.8"
|
package/src/config-types.ts
CHANGED
|
@@ -31,6 +31,7 @@ export function emptyContract(options: {
|
|
|
31
31
|
}): ContractConfig {
|
|
32
32
|
return {
|
|
33
33
|
source: {
|
|
34
|
+
sourceFormat: 'typescript',
|
|
34
35
|
load: async () => {
|
|
35
36
|
const built = buildSqlContractFromDefinition({ target: options.target, models: [] });
|
|
36
37
|
return ok(applySpecifierDefaultControlPolicy(built, options.defaultControlPolicy));
|
|
@@ -47,6 +48,7 @@ export function typescriptContract(
|
|
|
47
48
|
): ContractConfig {
|
|
48
49
|
return {
|
|
49
50
|
source: {
|
|
51
|
+
sourceFormat: 'typescript',
|
|
50
52
|
load: async () =>
|
|
51
53
|
ok(applySpecifierDefaultControlPolicy(contract, options?.defaultControlPolicy)),
|
|
52
54
|
},
|
|
@@ -63,6 +65,7 @@ export function typescriptContractFromPath(
|
|
|
63
65
|
): ContractConfig {
|
|
64
66
|
return {
|
|
65
67
|
source: {
|
|
68
|
+
sourceFormat: 'typescript',
|
|
66
69
|
inputs: [contractPath],
|
|
67
70
|
load: async (context) => {
|
|
68
71
|
const [absolutePath] = context.resolvedInputs;
|
package/src/contract-dsl.ts
CHANGED
|
@@ -43,6 +43,7 @@ export type ScalarFieldState<
|
|
|
43
43
|
ColumnName extends string | undefined = string | undefined,
|
|
44
44
|
IdSpec extends NamedConstraintSpec | undefined = undefined,
|
|
45
45
|
UniqueSpec extends NamedConstraintSpec | undefined = undefined,
|
|
46
|
+
Many extends boolean = false,
|
|
46
47
|
> = {
|
|
47
48
|
readonly kind: 'scalar';
|
|
48
49
|
readonly descriptor?: (ColumnTypeDescriptor & { readonly codecId: CodecId }) | undefined;
|
|
@@ -51,6 +52,7 @@ export type ScalarFieldState<
|
|
|
51
52
|
readonly columnName?: ColumnName | undefined;
|
|
52
53
|
readonly default?: ColumnDefault | undefined;
|
|
53
54
|
readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;
|
|
55
|
+
readonly many?: Many extends true ? true : undefined;
|
|
54
56
|
} & (IdSpec extends NamedConstraintSpec ? { readonly id: IdSpec } : { readonly id?: undefined }) &
|
|
55
57
|
(UniqueSpec extends NamedConstraintSpec
|
|
56
58
|
? { readonly unique: UniqueSpec }
|
|
@@ -64,6 +66,7 @@ type AnyScalarFieldState = {
|
|
|
64
66
|
readonly columnName?: string | undefined;
|
|
65
67
|
readonly default?: ColumnDefault | undefined;
|
|
66
68
|
readonly executionDefaults?: ExecutionMutationDefaultPhases | undefined;
|
|
69
|
+
readonly many?: boolean | undefined;
|
|
67
70
|
readonly id?: NamedConstraintSpec | undefined;
|
|
68
71
|
readonly unique?: NamedConstraintSpec | undefined;
|
|
69
72
|
};
|
|
@@ -75,7 +78,8 @@ type HasNamedConstraintId<State extends AnyScalarFieldState> =
|
|
|
75
78
|
boolean,
|
|
76
79
|
string | undefined,
|
|
77
80
|
infer IdSpec,
|
|
78
|
-
NamedConstraintSpec | undefined
|
|
81
|
+
NamedConstraintSpec | undefined,
|
|
82
|
+
boolean
|
|
79
83
|
>
|
|
80
84
|
? IdSpec extends NamedConstraintSpec
|
|
81
85
|
? true
|
|
@@ -89,7 +93,8 @@ type HasNamedConstraintUnique<State extends AnyScalarFieldState> =
|
|
|
89
93
|
boolean,
|
|
90
94
|
string | undefined,
|
|
91
95
|
NamedConstraintSpec | undefined,
|
|
92
|
-
infer UniqueSpec
|
|
96
|
+
infer UniqueSpec,
|
|
97
|
+
boolean
|
|
93
98
|
>
|
|
94
99
|
? UniqueSpec extends NamedConstraintSpec
|
|
95
100
|
? true
|
|
@@ -115,7 +120,8 @@ type ApplyFieldSqlSpec<
|
|
|
115
120
|
infer Nullable,
|
|
116
121
|
infer ColumnName,
|
|
117
122
|
infer IdSpec,
|
|
118
|
-
infer UniqueSpec
|
|
123
|
+
infer UniqueSpec,
|
|
124
|
+
infer Many
|
|
119
125
|
>
|
|
120
126
|
? ScalarFieldState<
|
|
121
127
|
CodecId,
|
|
@@ -131,9 +137,10 @@ type ApplyFieldSqlSpec<
|
|
|
131
137
|
? UniqueSpec extends NamedConstraintSpec
|
|
132
138
|
? NamedConstraintSpec<UniqueName>
|
|
133
139
|
: UniqueSpec
|
|
134
|
-
: UniqueSpec
|
|
140
|
+
: UniqueSpec,
|
|
141
|
+
Many
|
|
135
142
|
>
|
|
136
|
-
:
|
|
143
|
+
: AnyScalarFieldState;
|
|
137
144
|
|
|
138
145
|
export type GeneratedFieldSpec = {
|
|
139
146
|
readonly type: ColumnTypeDescriptor;
|
|
@@ -171,10 +178,11 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
171
178
|
boolean,
|
|
172
179
|
infer ColumnName,
|
|
173
180
|
infer IdSpec,
|
|
174
|
-
infer UniqueSpec
|
|
181
|
+
infer UniqueSpec,
|
|
182
|
+
infer Many
|
|
175
183
|
>
|
|
176
|
-
? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec>
|
|
177
|
-
:
|
|
184
|
+
? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec, Many>
|
|
185
|
+
: AnyScalarFieldState
|
|
178
186
|
> {
|
|
179
187
|
return new ScalarFieldBuilder({
|
|
180
188
|
...this.state,
|
|
@@ -185,10 +193,11 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
185
193
|
boolean,
|
|
186
194
|
infer ColumnName,
|
|
187
195
|
infer IdSpec,
|
|
188
|
-
infer UniqueSpec
|
|
196
|
+
infer UniqueSpec,
|
|
197
|
+
infer Many
|
|
189
198
|
>
|
|
190
|
-
? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec>
|
|
191
|
-
:
|
|
199
|
+
? ScalarFieldState<CodecId, TypeRef, true, ColumnName, IdSpec, UniqueSpec, Many>
|
|
200
|
+
: AnyScalarFieldState);
|
|
192
201
|
}
|
|
193
202
|
|
|
194
203
|
column<ColumnName extends string>(
|
|
@@ -200,10 +209,11 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
200
209
|
infer Nullable,
|
|
201
210
|
string | undefined,
|
|
202
211
|
infer IdSpec,
|
|
203
|
-
infer UniqueSpec
|
|
212
|
+
infer UniqueSpec,
|
|
213
|
+
infer Many
|
|
204
214
|
>
|
|
205
|
-
? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec>
|
|
206
|
-
:
|
|
215
|
+
? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, Many>
|
|
216
|
+
: AnyScalarFieldState
|
|
207
217
|
> {
|
|
208
218
|
return new ScalarFieldBuilder({
|
|
209
219
|
...this.state,
|
|
@@ -214,10 +224,45 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
214
224
|
infer Nullable,
|
|
215
225
|
string | undefined,
|
|
216
226
|
infer IdSpec,
|
|
217
|
-
infer UniqueSpec
|
|
227
|
+
infer UniqueSpec,
|
|
228
|
+
infer Many
|
|
229
|
+
>
|
|
230
|
+
? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, Many>
|
|
231
|
+
: AnyScalarFieldState);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
many(): ScalarFieldBuilder<
|
|
235
|
+
State extends ScalarFieldState<
|
|
236
|
+
infer CodecId,
|
|
237
|
+
infer TypeRef,
|
|
238
|
+
infer Nullable,
|
|
239
|
+
infer ColumnName,
|
|
240
|
+
infer IdSpec,
|
|
241
|
+
infer UniqueSpec,
|
|
242
|
+
boolean
|
|
218
243
|
>
|
|
219
|
-
? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec>
|
|
220
|
-
:
|
|
244
|
+
? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, true>
|
|
245
|
+
: AnyScalarFieldState
|
|
246
|
+
> {
|
|
247
|
+
return new ScalarFieldBuilder(
|
|
248
|
+
blindCast<
|
|
249
|
+
State extends ScalarFieldState<
|
|
250
|
+
infer CodecId,
|
|
251
|
+
infer TypeRef,
|
|
252
|
+
infer Nullable,
|
|
253
|
+
infer ColumnName,
|
|
254
|
+
infer IdSpec,
|
|
255
|
+
infer UniqueSpec,
|
|
256
|
+
boolean
|
|
257
|
+
>
|
|
258
|
+
? ScalarFieldState<CodecId, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, true>
|
|
259
|
+
: AnyScalarFieldState,
|
|
260
|
+
'object spread does not narrow the generic State conditional; runtime shape is correct'
|
|
261
|
+
>({
|
|
262
|
+
...this.state,
|
|
263
|
+
many: true,
|
|
264
|
+
}),
|
|
265
|
+
);
|
|
221
266
|
}
|
|
222
267
|
|
|
223
268
|
default(value: ColumnDefaultLiteralInputValue | ColumnDefault): ScalarFieldBuilder<State> {
|
|
@@ -243,7 +288,8 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
243
288
|
infer Nullable,
|
|
244
289
|
infer ColumnName,
|
|
245
290
|
NamedConstraintSpec | undefined,
|
|
246
|
-
infer UniqueSpec
|
|
291
|
+
infer UniqueSpec,
|
|
292
|
+
infer Many
|
|
247
293
|
>
|
|
248
294
|
? ScalarFieldState<
|
|
249
295
|
CodecId,
|
|
@@ -251,9 +297,10 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
251
297
|
Nullable,
|
|
252
298
|
ColumnName,
|
|
253
299
|
NamedConstraintSpec<Name>,
|
|
254
|
-
UniqueSpec
|
|
300
|
+
UniqueSpec,
|
|
301
|
+
Many
|
|
255
302
|
>
|
|
256
|
-
:
|
|
303
|
+
: AnyScalarFieldState
|
|
257
304
|
> {
|
|
258
305
|
return new ScalarFieldBuilder({
|
|
259
306
|
...this.state,
|
|
@@ -264,7 +311,8 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
264
311
|
infer Nullable,
|
|
265
312
|
infer ColumnName,
|
|
266
313
|
NamedConstraintSpec | undefined,
|
|
267
|
-
infer UniqueSpec
|
|
314
|
+
infer UniqueSpec,
|
|
315
|
+
infer Many
|
|
268
316
|
>
|
|
269
317
|
? ScalarFieldState<
|
|
270
318
|
CodecId,
|
|
@@ -272,9 +320,10 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
272
320
|
Nullable,
|
|
273
321
|
ColumnName,
|
|
274
322
|
NamedConstraintSpec<Name>,
|
|
275
|
-
UniqueSpec
|
|
323
|
+
UniqueSpec,
|
|
324
|
+
Many
|
|
276
325
|
>
|
|
277
|
-
:
|
|
326
|
+
: AnyScalarFieldState);
|
|
278
327
|
}
|
|
279
328
|
|
|
280
329
|
unique<const Name extends string | undefined = undefined>(
|
|
@@ -286,10 +335,19 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
286
335
|
infer Nullable,
|
|
287
336
|
infer ColumnName,
|
|
288
337
|
infer IdSpec,
|
|
289
|
-
NamedConstraintSpec | undefined
|
|
338
|
+
NamedConstraintSpec | undefined,
|
|
339
|
+
infer Many
|
|
290
340
|
>
|
|
291
|
-
? ScalarFieldState<
|
|
292
|
-
|
|
341
|
+
? ScalarFieldState<
|
|
342
|
+
CodecId,
|
|
343
|
+
TypeRef,
|
|
344
|
+
Nullable,
|
|
345
|
+
ColumnName,
|
|
346
|
+
IdSpec,
|
|
347
|
+
NamedConstraintSpec<Name>,
|
|
348
|
+
Many
|
|
349
|
+
>
|
|
350
|
+
: AnyScalarFieldState
|
|
293
351
|
> {
|
|
294
352
|
return new ScalarFieldBuilder({
|
|
295
353
|
...this.state,
|
|
@@ -300,10 +358,19 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
300
358
|
infer Nullable,
|
|
301
359
|
infer ColumnName,
|
|
302
360
|
infer IdSpec,
|
|
303
|
-
NamedConstraintSpec | undefined
|
|
361
|
+
NamedConstraintSpec | undefined,
|
|
362
|
+
infer Many
|
|
304
363
|
>
|
|
305
|
-
? ScalarFieldState<
|
|
306
|
-
|
|
364
|
+
? ScalarFieldState<
|
|
365
|
+
CodecId,
|
|
366
|
+
TypeRef,
|
|
367
|
+
Nullable,
|
|
368
|
+
ColumnName,
|
|
369
|
+
IdSpec,
|
|
370
|
+
NamedConstraintSpec<Name>,
|
|
371
|
+
Many
|
|
372
|
+
>
|
|
373
|
+
: AnyScalarFieldState);
|
|
307
374
|
}
|
|
308
375
|
|
|
309
376
|
sql<const Spec extends FieldSqlSpecForState<State>>(
|
|
@@ -400,11 +467,14 @@ function namedTypeField<Handle extends EnumTypeHandle>(
|
|
|
400
467
|
function namedTypeField(typeRef: NamedStorageTypeRef): ScalarFieldBuilder {
|
|
401
468
|
if (isEnumTypeHandle(typeRef)) {
|
|
402
469
|
return new EnumScalarFieldBuilder(
|
|
403
|
-
|
|
470
|
+
blindCast<
|
|
471
|
+
ScalarFieldState<string, typeof typeRef, false, undefined>,
|
|
472
|
+
'literal object lacks explicit many; cast to the full ScalarFieldState so optional() conditional resolves Many = false'
|
|
473
|
+
>({
|
|
404
474
|
kind: 'scalar',
|
|
405
475
|
typeRef,
|
|
406
476
|
nullable: false,
|
|
407
|
-
},
|
|
477
|
+
}),
|
|
408
478
|
typeRef,
|
|
409
479
|
);
|
|
410
480
|
}
|
package/src/contract-lowering.ts
CHANGED
|
@@ -727,6 +727,7 @@ function resolveModelNode(
|
|
|
727
727
|
columnName,
|
|
728
728
|
descriptor,
|
|
729
729
|
nullable: fieldState.nullable,
|
|
730
|
+
...(fieldState.many === true ? { many: true } : {}),
|
|
730
731
|
...(fieldState.default ? { default: fieldState.default } : {}),
|
|
731
732
|
...(fieldState.executionDefaults ? { executionDefaults: fieldState.executionDefaults } : {}),
|
|
732
733
|
...(enumHandle !== undefined ? { enumTypeHandle: enumHandle } : {}),
|
package/src/contract-types.ts
CHANGED
|
@@ -21,10 +21,10 @@ import type { UnionToIntersection } from './authoring-type-utils';
|
|
|
21
21
|
import type { AttributeStageIdFieldNames, FieldStateOf, ScalarFieldBuilder } from './contract-dsl';
|
|
22
22
|
import type { EnumTypeHandle } from './enum-type';
|
|
23
23
|
|
|
24
|
-
export type ExtractCodecTypesFromPack<P> = P extends {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
export type ExtractCodecTypesFromPack<P> = P extends {
|
|
25
|
+
__codecTypes?: infer C extends Record<string, { output: unknown }>;
|
|
26
|
+
}
|
|
27
|
+
? C
|
|
28
28
|
: Record<string, never>;
|
|
29
29
|
|
|
30
30
|
export type MergeExtensionCodecTypes<Packs extends Record<string, unknown>> = UnionToIntersection<
|
|
@@ -279,6 +279,8 @@ type FieldNullableOf<FieldState> = FieldState extends {
|
|
|
279
279
|
? Nullable
|
|
280
280
|
: boolean;
|
|
281
281
|
|
|
282
|
+
type FieldManyOf<FieldState> = FieldState extends { readonly many?: true } ? true : false;
|
|
283
|
+
|
|
282
284
|
type FieldColumnOverrideOf<FieldState> = Present<
|
|
283
285
|
FieldState extends { readonly columnName?: infer ColumnName } ? ColumnName : never
|
|
284
286
|
>;
|
|
@@ -471,15 +473,17 @@ type StorageColumn<
|
|
|
471
473
|
NativeType extends string,
|
|
472
474
|
TypeRef extends string | undefined = undefined,
|
|
473
475
|
TypeParams extends Record<string, unknown> | undefined = undefined,
|
|
476
|
+
Many extends boolean = false,
|
|
474
477
|
> = {
|
|
475
478
|
readonly nativeType: NativeType;
|
|
476
479
|
readonly codecId: CodecId;
|
|
477
480
|
readonly nullable: Nullable;
|
|
478
481
|
readonly default?: ColumnDefault;
|
|
479
|
-
} & (TypeRef extends string ? { readonly typeRef: TypeRef } : Record<
|
|
482
|
+
} & (TypeRef extends string ? { readonly typeRef: TypeRef } : Record<never, never>) &
|
|
480
483
|
(TypeParams extends Record<string, unknown>
|
|
481
484
|
? { readonly typeParams: TypeParams }
|
|
482
|
-
: Record<
|
|
485
|
+
: Record<never, never>) &
|
|
486
|
+
(Many extends true ? { readonly many: true } : Record<never, never>);
|
|
483
487
|
|
|
484
488
|
type ModelStorageColumn<
|
|
485
489
|
Definition,
|
|
@@ -496,7 +500,8 @@ type ModelStorageColumn<
|
|
|
496
500
|
ResolveFieldDescriptor<Definition, ModelFieldState<Definition, ModelName, FieldName>>
|
|
497
501
|
>,
|
|
498
502
|
ResolveFieldColumnTypeRef<Definition, ModelFieldState<Definition, ModelName, FieldName>>,
|
|
499
|
-
ResolveFieldColumnTypeParams<Definition, ModelFieldState<Definition, ModelName, FieldName
|
|
503
|
+
ResolveFieldColumnTypeParams<Definition, ModelFieldState<Definition, ModelName, FieldName>>,
|
|
504
|
+
FieldManyOf<ModelFieldState<Definition, ModelName, FieldName>>
|
|
500
505
|
>
|
|
501
506
|
: never;
|
|
502
507
|
|
|
@@ -677,6 +682,8 @@ type BuiltStorage<Definition> = {
|
|
|
677
682
|
};
|
|
678
683
|
};
|
|
679
684
|
|
|
685
|
+
type StorageColumnManyOf<Col> = Col extends { readonly many: true } ? true : false;
|
|
686
|
+
|
|
680
687
|
// The enum value union for an enum-typed field, or `never` for a non-enum
|
|
681
688
|
// field. The field's `typeRef` carries the authored `EnumTypeHandle`, whose
|
|
682
689
|
// `Values` tuple preserves the literal member values (text or numeric).
|
|
@@ -698,7 +705,9 @@ type CodecChannelType<
|
|
|
698
705
|
> = ModelStorageColumn<Definition, ModelName, FieldName>['codecId'] extends infer Id extends
|
|
699
706
|
keyof CodecTypesFromDefinition<Definition>
|
|
700
707
|
? CodecTypesFromDefinition<Definition>[Id] extends { readonly [K in Channel]: infer T }
|
|
701
|
-
?
|
|
708
|
+
? StorageColumnManyOf<ModelStorageColumn<Definition, ModelName, FieldName>> extends true
|
|
709
|
+
? ReadonlyArray<T>
|
|
710
|
+
: T
|
|
702
711
|
: unknown
|
|
703
712
|
: unknown;
|
|
704
713
|
|
|
@@ -712,7 +721,9 @@ type FieldChannelType<
|
|
|
712
721
|
> =
|
|
713
722
|
| ([EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>] extends [never]
|
|
714
723
|
? CodecChannelType<Definition, ModelName, FieldName, Channel>
|
|
715
|
-
:
|
|
724
|
+
: StorageColumnManyOf<ModelStorageColumn<Definition, ModelName, FieldName>> extends true
|
|
725
|
+
? ReadonlyArray<EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>>
|
|
726
|
+
: EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>)
|
|
716
727
|
| (FieldNullableOf<ModelFieldState<Definition, ModelName, FieldName>> extends true
|
|
717
728
|
? null
|
|
718
729
|
: never);
|
|
@@ -735,6 +746,17 @@ type FieldChannelTypes<Definition, Channel extends 'output' | 'input'> = {
|
|
|
735
746
|
};
|
|
736
747
|
};
|
|
737
748
|
|
|
749
|
+
type StorageColumnChannelTypes<Definition, Channel extends 'output' | 'input'> = {
|
|
750
|
+
readonly [Ns in DefaultStorageNamespaceId<Definition>]: {
|
|
751
|
+
readonly [ModelName in ModelNames<Definition> as BuiltModelTableName<Definition, ModelName>]: {
|
|
752
|
+
readonly [FieldName in ModelFieldNames<Definition, ModelName> as BuiltModelColumnMappings<
|
|
753
|
+
Definition,
|
|
754
|
+
ModelName
|
|
755
|
+
>[FieldName]['column']]: FieldChannelType<Definition, ModelName, FieldName, Channel>;
|
|
756
|
+
};
|
|
757
|
+
};
|
|
758
|
+
};
|
|
759
|
+
|
|
738
760
|
export type SqlContractResult<Definition> = ContractWithTypeMaps<
|
|
739
761
|
Omit<Contract<BuiltStorage<Definition>>, 'domain'> & {
|
|
740
762
|
readonly target: DefinitionTargetId<Definition>;
|
|
@@ -754,6 +776,8 @@ export type SqlContractResult<Definition> = ContractWithTypeMaps<
|
|
|
754
776
|
CodecTypesFromDefinition<Definition>,
|
|
755
777
|
Record<string, never>,
|
|
756
778
|
FieldChannelTypes<Definition, 'output'>,
|
|
757
|
-
FieldChannelTypes<Definition, 'input'
|
|
779
|
+
FieldChannelTypes<Definition, 'input'>,
|
|
780
|
+
StorageColumnChannelTypes<Definition, 'output'>,
|
|
781
|
+
StorageColumnChannelTypes<Definition, 'input'>
|
|
758
782
|
>
|
|
759
783
|
>;
|