@prisma-next/sql-contract-ts 0.14.0-dev.64 → 0.14.0-dev.66
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/contract-builder.d.mts +27 -22
- package/dist/contract-builder.d.mts.map +1 -1
- package/dist/contract-builder.mjs +8 -8
- package/dist/contract-builder.mjs.map +1 -1
- package/package.json +10 -10
- package/src/authoring-type-utils.ts +6 -3
- package/src/contract-dsl.ts +122 -95
- package/src/contract-types.ts +38 -5
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.66",
|
|
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.66",
|
|
10
|
+
"@prisma-next/contract": "0.14.0-dev.66",
|
|
11
|
+
"@prisma-next/contract-authoring": "0.14.0-dev.66",
|
|
12
|
+
"@prisma-next/framework-components": "0.14.0-dev.66",
|
|
13
|
+
"@prisma-next/sql-contract": "0.14.0-dev.66",
|
|
14
|
+
"@prisma-next/utils": "0.14.0-dev.66",
|
|
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.66",
|
|
21
|
+
"@prisma-next/tsconfig": "0.14.0-dev.66",
|
|
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.66",
|
|
25
25
|
"tsdown": "0.22.1",
|
|
26
26
|
"typescript": "5.9.3",
|
|
27
27
|
"vitest": "4.1.8"
|
|
@@ -2,6 +2,7 @@ import type {
|
|
|
2
2
|
AuthoringArgumentDescriptor,
|
|
3
3
|
AuthoringFieldPresetDescriptor,
|
|
4
4
|
} from '@prisma-next/framework-components/authoring';
|
|
5
|
+
import type { ColumnTypeDescriptor } from '@prisma-next/framework-components/codec';
|
|
5
6
|
import type { ScalarFieldBuilder, ScalarFieldState } from './contract-dsl';
|
|
6
7
|
|
|
7
8
|
export type UnionToIntersection<U> = (U extends unknown ? (value: U) => void : never) extends (
|
|
@@ -114,9 +115,11 @@ export type FieldBuilderFromPresetDescriptor<
|
|
|
114
115
|
ConstraintName extends string | undefined = undefined,
|
|
115
116
|
> = ScalarFieldBuilder<
|
|
116
117
|
ScalarFieldState<
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
ColumnTypeDescriptor<
|
|
119
|
+
ResolveTemplateValue<Descriptor['output']['codecId'], Args> extends string
|
|
120
|
+
? ResolveTemplateValue<Descriptor['output']['codecId'], Args>
|
|
121
|
+
: string
|
|
122
|
+
>,
|
|
120
123
|
undefined,
|
|
121
124
|
ResolveTemplateValue<Descriptor['output']['nullable'], Args> extends true ? true : false,
|
|
122
125
|
undefined,
|
package/src/contract-dsl.ts
CHANGED
|
@@ -40,7 +40,7 @@ type NamedConstraintNameSpec<Name extends string = string> = {
|
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
export type ScalarFieldState<
|
|
43
|
-
|
|
43
|
+
Descriptor extends ColumnTypeDescriptor = ColumnTypeDescriptor,
|
|
44
44
|
TypeRef extends NamedStorageTypeRef | undefined = undefined,
|
|
45
45
|
Nullable extends boolean = boolean,
|
|
46
46
|
ColumnName extends string | undefined = string | undefined,
|
|
@@ -49,7 +49,7 @@ export type ScalarFieldState<
|
|
|
49
49
|
Many extends boolean = false,
|
|
50
50
|
> = {
|
|
51
51
|
readonly kind: 'scalar';
|
|
52
|
-
readonly descriptor?:
|
|
52
|
+
readonly descriptor?: Descriptor | undefined;
|
|
53
53
|
readonly typeRef?: TypeRef | undefined;
|
|
54
54
|
readonly nullable: Nullable;
|
|
55
55
|
readonly columnName?: ColumnName | undefined;
|
|
@@ -63,7 +63,7 @@ export type ScalarFieldState<
|
|
|
63
63
|
|
|
64
64
|
type AnyScalarFieldState = {
|
|
65
65
|
readonly kind: 'scalar';
|
|
66
|
-
readonly descriptor?:
|
|
66
|
+
readonly descriptor?: ColumnTypeDescriptor | undefined;
|
|
67
67
|
readonly typeRef?: NamedStorageTypeRef | undefined;
|
|
68
68
|
readonly nullable: boolean;
|
|
69
69
|
readonly columnName?: string | undefined;
|
|
@@ -76,7 +76,7 @@ type AnyScalarFieldState = {
|
|
|
76
76
|
|
|
77
77
|
type HasNamedConstraintId<State extends AnyScalarFieldState> =
|
|
78
78
|
State extends ScalarFieldState<
|
|
79
|
-
|
|
79
|
+
ColumnTypeDescriptor,
|
|
80
80
|
NamedStorageTypeRef | undefined,
|
|
81
81
|
boolean,
|
|
82
82
|
string | undefined,
|
|
@@ -91,7 +91,7 @@ type HasNamedConstraintId<State extends AnyScalarFieldState> =
|
|
|
91
91
|
|
|
92
92
|
type HasNamedConstraintUnique<State extends AnyScalarFieldState> =
|
|
93
93
|
State extends ScalarFieldState<
|
|
94
|
-
|
|
94
|
+
ColumnTypeDescriptor,
|
|
95
95
|
NamedStorageTypeRef | undefined,
|
|
96
96
|
boolean,
|
|
97
97
|
string | undefined,
|
|
@@ -118,7 +118,7 @@ type ApplyFieldSqlSpec<
|
|
|
118
118
|
Spec extends FieldSqlSpecForState<State>,
|
|
119
119
|
> =
|
|
120
120
|
State extends ScalarFieldState<
|
|
121
|
-
infer
|
|
121
|
+
infer Descriptor,
|
|
122
122
|
infer TypeRef,
|
|
123
123
|
infer Nullable,
|
|
124
124
|
infer ColumnName,
|
|
@@ -127,7 +127,7 @@ type ApplyFieldSqlSpec<
|
|
|
127
127
|
infer Many
|
|
128
128
|
>
|
|
129
129
|
? ScalarFieldState<
|
|
130
|
-
|
|
130
|
+
Descriptor,
|
|
131
131
|
TypeRef,
|
|
132
132
|
Nullable,
|
|
133
133
|
Spec extends { readonly column: infer NextColumn extends string } ? NextColumn : ColumnName,
|
|
@@ -176,7 +176,7 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
176
176
|
|
|
177
177
|
optional(): ScalarFieldBuilder<
|
|
178
178
|
State extends ScalarFieldState<
|
|
179
|
-
infer
|
|
179
|
+
infer Descriptor,
|
|
180
180
|
infer TypeRef,
|
|
181
181
|
boolean,
|
|
182
182
|
infer ColumnName,
|
|
@@ -184,30 +184,35 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
184
184
|
infer UniqueSpec,
|
|
185
185
|
infer Many
|
|
186
186
|
>
|
|
187
|
-
? ScalarFieldState<
|
|
187
|
+
? ScalarFieldState<Descriptor, TypeRef, true, ColumnName, IdSpec, UniqueSpec, Many>
|
|
188
188
|
: AnyScalarFieldState
|
|
189
189
|
> {
|
|
190
|
-
return new ScalarFieldBuilder(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
190
|
+
return new ScalarFieldBuilder(
|
|
191
|
+
blindCast<
|
|
192
|
+
State extends ScalarFieldState<
|
|
193
|
+
infer Descriptor,
|
|
194
|
+
infer TypeRef,
|
|
195
|
+
boolean,
|
|
196
|
+
infer ColumnName,
|
|
197
|
+
infer IdSpec,
|
|
198
|
+
infer UniqueSpec,
|
|
199
|
+
infer Many
|
|
200
|
+
>
|
|
201
|
+
? ScalarFieldState<Descriptor, TypeRef, true, ColumnName, IdSpec, UniqueSpec, Many>
|
|
202
|
+
: AnyScalarFieldState,
|
|
203
|
+
'object spread does not narrow the generic State conditional; runtime shape is correct'
|
|
204
|
+
>({
|
|
205
|
+
...this.state,
|
|
206
|
+
nullable: true,
|
|
207
|
+
}),
|
|
208
|
+
);
|
|
204
209
|
}
|
|
205
210
|
|
|
206
211
|
column<ColumnName extends string>(
|
|
207
212
|
name: ColumnName,
|
|
208
213
|
): ScalarFieldBuilder<
|
|
209
214
|
State extends ScalarFieldState<
|
|
210
|
-
infer
|
|
215
|
+
infer Descriptor,
|
|
211
216
|
infer TypeRef,
|
|
212
217
|
infer Nullable,
|
|
213
218
|
string | undefined,
|
|
@@ -215,28 +220,33 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
215
220
|
infer UniqueSpec,
|
|
216
221
|
infer Many
|
|
217
222
|
>
|
|
218
|
-
? ScalarFieldState<
|
|
223
|
+
? ScalarFieldState<Descriptor, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, Many>
|
|
219
224
|
: AnyScalarFieldState
|
|
220
225
|
> {
|
|
221
|
-
return new ScalarFieldBuilder(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
226
|
+
return new ScalarFieldBuilder(
|
|
227
|
+
blindCast<
|
|
228
|
+
State extends ScalarFieldState<
|
|
229
|
+
infer Descriptor,
|
|
230
|
+
infer TypeRef,
|
|
231
|
+
infer Nullable,
|
|
232
|
+
string | undefined,
|
|
233
|
+
infer IdSpec,
|
|
234
|
+
infer UniqueSpec,
|
|
235
|
+
infer Many
|
|
236
|
+
>
|
|
237
|
+
? ScalarFieldState<Descriptor, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, Many>
|
|
238
|
+
: AnyScalarFieldState,
|
|
239
|
+
'object spread does not narrow the generic State conditional; runtime shape is correct'
|
|
240
|
+
>({
|
|
241
|
+
...this.state,
|
|
242
|
+
columnName: name,
|
|
243
|
+
}),
|
|
244
|
+
);
|
|
235
245
|
}
|
|
236
246
|
|
|
237
247
|
many(): ScalarFieldBuilder<
|
|
238
248
|
State extends ScalarFieldState<
|
|
239
|
-
infer
|
|
249
|
+
infer Descriptor,
|
|
240
250
|
infer TypeRef,
|
|
241
251
|
infer Nullable,
|
|
242
252
|
infer ColumnName,
|
|
@@ -244,13 +254,13 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
244
254
|
infer UniqueSpec,
|
|
245
255
|
boolean
|
|
246
256
|
>
|
|
247
|
-
? ScalarFieldState<
|
|
257
|
+
? ScalarFieldState<Descriptor, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, true>
|
|
248
258
|
: AnyScalarFieldState
|
|
249
259
|
> {
|
|
250
260
|
return new ScalarFieldBuilder(
|
|
251
261
|
blindCast<
|
|
252
262
|
State extends ScalarFieldState<
|
|
253
|
-
infer
|
|
263
|
+
infer Descriptor,
|
|
254
264
|
infer TypeRef,
|
|
255
265
|
infer Nullable,
|
|
256
266
|
infer ColumnName,
|
|
@@ -258,7 +268,7 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
258
268
|
infer UniqueSpec,
|
|
259
269
|
boolean
|
|
260
270
|
>
|
|
261
|
-
? ScalarFieldState<
|
|
271
|
+
? ScalarFieldState<Descriptor, TypeRef, Nullable, ColumnName, IdSpec, UniqueSpec, true>
|
|
262
272
|
: AnyScalarFieldState,
|
|
263
273
|
'object spread does not narrow the generic State conditional; runtime shape is correct'
|
|
264
274
|
>({
|
|
@@ -286,7 +296,7 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
286
296
|
options?: NamedConstraintSpec<Name>,
|
|
287
297
|
): ScalarFieldBuilder<
|
|
288
298
|
State extends ScalarFieldState<
|
|
289
|
-
infer
|
|
299
|
+
infer Descriptor,
|
|
290
300
|
infer TypeRef,
|
|
291
301
|
infer Nullable,
|
|
292
302
|
infer ColumnName,
|
|
@@ -295,7 +305,7 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
295
305
|
infer Many
|
|
296
306
|
>
|
|
297
307
|
? ScalarFieldState<
|
|
298
|
-
|
|
308
|
+
Descriptor,
|
|
299
309
|
TypeRef,
|
|
300
310
|
Nullable,
|
|
301
311
|
ColumnName,
|
|
@@ -305,35 +315,40 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
305
315
|
>
|
|
306
316
|
: AnyScalarFieldState
|
|
307
317
|
> {
|
|
308
|
-
return new ScalarFieldBuilder(
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
infer Many
|
|
319
|
-
>
|
|
320
|
-
? ScalarFieldState<
|
|
321
|
-
CodecId,
|
|
322
|
-
TypeRef,
|
|
323
|
-
Nullable,
|
|
324
|
-
ColumnName,
|
|
325
|
-
NamedConstraintSpec<Name>,
|
|
326
|
-
UniqueSpec,
|
|
327
|
-
Many
|
|
318
|
+
return new ScalarFieldBuilder(
|
|
319
|
+
blindCast<
|
|
320
|
+
State extends ScalarFieldState<
|
|
321
|
+
infer Descriptor,
|
|
322
|
+
infer TypeRef,
|
|
323
|
+
infer Nullable,
|
|
324
|
+
infer ColumnName,
|
|
325
|
+
NamedConstraintSpec | undefined,
|
|
326
|
+
infer UniqueSpec,
|
|
327
|
+
infer Many
|
|
328
328
|
>
|
|
329
|
-
|
|
329
|
+
? ScalarFieldState<
|
|
330
|
+
Descriptor,
|
|
331
|
+
TypeRef,
|
|
332
|
+
Nullable,
|
|
333
|
+
ColumnName,
|
|
334
|
+
NamedConstraintSpec<Name>,
|
|
335
|
+
UniqueSpec,
|
|
336
|
+
Many
|
|
337
|
+
>
|
|
338
|
+
: AnyScalarFieldState,
|
|
339
|
+
'object spread does not narrow the generic State conditional; runtime shape is correct'
|
|
340
|
+
>({
|
|
341
|
+
...this.state,
|
|
342
|
+
id: options?.name ? { name: options.name } : {},
|
|
343
|
+
}),
|
|
344
|
+
);
|
|
330
345
|
}
|
|
331
346
|
|
|
332
347
|
unique<const Name extends string | undefined = undefined>(
|
|
333
348
|
options?: NamedConstraintSpec<Name>,
|
|
334
349
|
): ScalarFieldBuilder<
|
|
335
350
|
State extends ScalarFieldState<
|
|
336
|
-
infer
|
|
351
|
+
infer Descriptor,
|
|
337
352
|
infer TypeRef,
|
|
338
353
|
infer Nullable,
|
|
339
354
|
infer ColumnName,
|
|
@@ -342,7 +357,7 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
342
357
|
infer Many
|
|
343
358
|
>
|
|
344
359
|
? ScalarFieldState<
|
|
345
|
-
|
|
360
|
+
Descriptor,
|
|
346
361
|
TypeRef,
|
|
347
362
|
Nullable,
|
|
348
363
|
ColumnName,
|
|
@@ -352,28 +367,33 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
352
367
|
>
|
|
353
368
|
: AnyScalarFieldState
|
|
354
369
|
> {
|
|
355
|
-
return new ScalarFieldBuilder(
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
infer Many
|
|
366
|
-
>
|
|
367
|
-
? ScalarFieldState<
|
|
368
|
-
CodecId,
|
|
369
|
-
TypeRef,
|
|
370
|
-
Nullable,
|
|
371
|
-
ColumnName,
|
|
372
|
-
IdSpec,
|
|
373
|
-
NamedConstraintSpec<Name>,
|
|
374
|
-
Many
|
|
370
|
+
return new ScalarFieldBuilder(
|
|
371
|
+
blindCast<
|
|
372
|
+
State extends ScalarFieldState<
|
|
373
|
+
infer Descriptor,
|
|
374
|
+
infer TypeRef,
|
|
375
|
+
infer Nullable,
|
|
376
|
+
infer ColumnName,
|
|
377
|
+
infer IdSpec,
|
|
378
|
+
NamedConstraintSpec | undefined,
|
|
379
|
+
infer Many
|
|
375
380
|
>
|
|
376
|
-
|
|
381
|
+
? ScalarFieldState<
|
|
382
|
+
Descriptor,
|
|
383
|
+
TypeRef,
|
|
384
|
+
Nullable,
|
|
385
|
+
ColumnName,
|
|
386
|
+
IdSpec,
|
|
387
|
+
NamedConstraintSpec<Name>,
|
|
388
|
+
Many
|
|
389
|
+
>
|
|
390
|
+
: AnyScalarFieldState,
|
|
391
|
+
'object spread does not narrow the generic State conditional; runtime shape is correct'
|
|
392
|
+
>({
|
|
393
|
+
...this.state,
|
|
394
|
+
unique: options?.name ? { name: options.name } : {},
|
|
395
|
+
}),
|
|
396
|
+
);
|
|
377
397
|
}
|
|
378
398
|
|
|
379
399
|
sql<const Spec extends FieldSqlSpecForState<State>>(
|
|
@@ -406,7 +426,12 @@ export class ScalarFieldBuilder<State extends AnyScalarFieldState = AnyScalarFie
|
|
|
406
426
|
|
|
407
427
|
export class EnumScalarFieldBuilder<
|
|
408
428
|
Handle extends EnumTypeHandle,
|
|
409
|
-
State extends AnyScalarFieldState = ScalarFieldState<
|
|
429
|
+
State extends AnyScalarFieldState = ScalarFieldState<
|
|
430
|
+
ColumnTypeDescriptor,
|
|
431
|
+
Handle,
|
|
432
|
+
false,
|
|
433
|
+
undefined
|
|
434
|
+
>,
|
|
410
435
|
> extends ScalarFieldBuilder<State> {
|
|
411
436
|
readonly #handle: Handle;
|
|
412
437
|
|
|
@@ -436,7 +461,7 @@ export class EnumScalarFieldBuilder<
|
|
|
436
461
|
|
|
437
462
|
function columnField<Descriptor extends ColumnTypeDescriptor>(
|
|
438
463
|
descriptor: Descriptor,
|
|
439
|
-
): ScalarFieldBuilder<ScalarFieldState<Descriptor
|
|
464
|
+
): ScalarFieldBuilder<ScalarFieldState<Descriptor, undefined, false, undefined>> {
|
|
440
465
|
return new ScalarFieldBuilder({
|
|
441
466
|
kind: 'scalar',
|
|
442
467
|
descriptor,
|
|
@@ -446,7 +471,7 @@ function columnField<Descriptor extends ColumnTypeDescriptor>(
|
|
|
446
471
|
|
|
447
472
|
function generatedField<Descriptor extends ColumnTypeDescriptor>(
|
|
448
473
|
spec: GeneratedFieldSpec & { readonly type: Descriptor },
|
|
449
|
-
): ScalarFieldBuilder<ScalarFieldState<Descriptor
|
|
474
|
+
): ScalarFieldBuilder<ScalarFieldState<Descriptor, undefined, false, undefined>> {
|
|
450
475
|
return new ScalarFieldBuilder({
|
|
451
476
|
kind: 'scalar',
|
|
452
477
|
descriptor: {
|
|
@@ -460,10 +485,12 @@ function generatedField<Descriptor extends ColumnTypeDescriptor>(
|
|
|
460
485
|
|
|
461
486
|
function namedTypeField<TypeRef extends string>(
|
|
462
487
|
typeRef: TypeRef,
|
|
463
|
-
): ScalarFieldBuilder<ScalarFieldState<
|
|
488
|
+
): ScalarFieldBuilder<ScalarFieldState<ColumnTypeDescriptor, TypeRef, false, undefined>>;
|
|
464
489
|
function namedTypeField<TypeRef extends StorageTypeInstance>(
|
|
465
490
|
typeRef: TypeRef,
|
|
466
|
-
): ScalarFieldBuilder<
|
|
491
|
+
): ScalarFieldBuilder<
|
|
492
|
+
ScalarFieldState<ColumnTypeDescriptor<TypeRef['codecId']>, TypeRef, false, undefined>
|
|
493
|
+
>;
|
|
467
494
|
function namedTypeField<Handle extends EnumTypeHandle>(
|
|
468
495
|
typeRef: Handle,
|
|
469
496
|
): EnumScalarFieldBuilder<Handle>;
|
|
@@ -471,7 +498,7 @@ function namedTypeField(typeRef: NamedStorageTypeRef): ScalarFieldBuilder {
|
|
|
471
498
|
if (isEnumTypeHandle(typeRef)) {
|
|
472
499
|
return new EnumScalarFieldBuilder(
|
|
473
500
|
blindCast<
|
|
474
|
-
ScalarFieldState<
|
|
501
|
+
ScalarFieldState<ColumnTypeDescriptor, typeof typeRef, false, undefined>,
|
|
475
502
|
'literal object lacks explicit many; cast to the full ScalarFieldState so optional() conditional resolves Many = false'
|
|
476
503
|
>({
|
|
477
504
|
kind: 'scalar',
|
package/src/contract-types.ts
CHANGED
|
@@ -695,6 +695,31 @@ type EnumValueUnion<FieldState> = [FieldTypeRefOf<FieldState>] extends [
|
|
|
695
695
|
: Values[number]
|
|
696
696
|
: never;
|
|
697
697
|
|
|
698
|
+
// The member-value literal tuple carried on a descriptor's `entityRef.entity`
|
|
699
|
+
// (e.g. a target's native-enum entity), or `never` when the descriptor has no
|
|
700
|
+
// entityRef, its entity has no `members`, or `members` is widened to
|
|
701
|
+
// `readonly string[]` — this is checked with non-optional property shapes so
|
|
702
|
+
// a descriptor genuinely lacking `entityRef` fails the structural match
|
|
703
|
+
// instead of matching vacuously through the framework type's optional slot.
|
|
704
|
+
type DescriptorEntityMembers<Descriptor> = Descriptor extends {
|
|
705
|
+
readonly entityRef: {
|
|
706
|
+
readonly entity: { readonly members: infer Members extends readonly string[] };
|
|
707
|
+
};
|
|
708
|
+
}
|
|
709
|
+
? Members
|
|
710
|
+
: never;
|
|
711
|
+
|
|
712
|
+
// The value-set member union for a descriptor-carried entity (the type-level
|
|
713
|
+
// mirror of the runtime's generic `deriveValueSetFromEntity` fold), or
|
|
714
|
+
// `never` for a field with no descriptor, a descriptor with no entityRef.entity,
|
|
715
|
+
// or a widened (non-literal) members tuple — mirroring `EnumValueUnion`'s
|
|
716
|
+
// erasure guard.
|
|
717
|
+
type DescriptorValueSetUnion<FieldState> = [FieldDescriptorOf<FieldState>] extends [never]
|
|
718
|
+
? never
|
|
719
|
+
: readonly string[] extends DescriptorEntityMembers<FieldDescriptorOf<FieldState>>
|
|
720
|
+
? never
|
|
721
|
+
: DescriptorEntityMembers<FieldDescriptorOf<FieldState>>[number];
|
|
722
|
+
|
|
698
723
|
// The codec's `output` / `input` JS type for a field's column, before
|
|
699
724
|
// nullability. `unknown` when the codec is not in the definition's codec map.
|
|
700
725
|
type CodecChannelType<
|
|
@@ -711,19 +736,27 @@ type CodecChannelType<
|
|
|
711
736
|
: unknown
|
|
712
737
|
: unknown;
|
|
713
738
|
|
|
714
|
-
//
|
|
715
|
-
//
|
|
739
|
+
// The literal value union for a field: the enum-typed union takes precedence
|
|
740
|
+
// (matching today's behavior), falling back to the descriptor-carried
|
|
741
|
+
// value-set union; `never` when neither applies.
|
|
742
|
+
type FieldValueUnion<FieldState> = [EnumValueUnion<FieldState>] extends [never]
|
|
743
|
+
? DescriptorValueSetUnion<FieldState>
|
|
744
|
+
: EnumValueUnion<FieldState>;
|
|
745
|
+
|
|
746
|
+
// A field's read/write JS type: the value union (enum or descriptor value-set)
|
|
747
|
+
// when the field carries one, otherwise the codec channel type, with column
|
|
748
|
+
// nullability applied.
|
|
716
749
|
type FieldChannelType<
|
|
717
750
|
Definition,
|
|
718
751
|
ModelName extends ModelNames<Definition>,
|
|
719
752
|
FieldName extends ModelFieldNames<Definition, ModelName>,
|
|
720
753
|
Channel extends 'output' | 'input',
|
|
721
754
|
> =
|
|
722
|
-
| ([
|
|
755
|
+
| ([FieldValueUnion<ModelFieldState<Definition, ModelName, FieldName>>] extends [never]
|
|
723
756
|
? CodecChannelType<Definition, ModelName, FieldName, Channel>
|
|
724
757
|
: StorageColumnManyOf<ModelStorageColumn<Definition, ModelName, FieldName>> extends true
|
|
725
|
-
? ReadonlyArray<
|
|
726
|
-
:
|
|
758
|
+
? ReadonlyArray<FieldValueUnion<ModelFieldState<Definition, ModelName, FieldName>>>
|
|
759
|
+
: FieldValueUnion<ModelFieldState<Definition, ModelName, FieldName>>)
|
|
727
760
|
| (FieldNullableOf<ModelFieldState<Definition, ModelName, FieldName>> extends true
|
|
728
761
|
? null
|
|
729
762
|
: never);
|