@prisma-next/sql-contract-ts 0.14.0-dev.18 → 0.14.0-dev.19

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/package.json CHANGED
@@ -1,27 +1,27 @@
1
1
  {
2
2
  "name": "@prisma-next/sql-contract-ts",
3
- "version": "0.14.0-dev.18",
3
+ "version": "0.14.0-dev.19",
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.18",
10
- "@prisma-next/contract": "0.14.0-dev.18",
11
- "@prisma-next/contract-authoring": "0.14.0-dev.18",
12
- "@prisma-next/framework-components": "0.14.0-dev.18",
13
- "@prisma-next/sql-contract": "0.14.0-dev.18",
14
- "@prisma-next/utils": "0.14.0-dev.18",
9
+ "@prisma-next/config": "0.14.0-dev.19",
10
+ "@prisma-next/contract": "0.14.0-dev.19",
11
+ "@prisma-next/contract-authoring": "0.14.0-dev.19",
12
+ "@prisma-next/framework-components": "0.14.0-dev.19",
13
+ "@prisma-next/sql-contract": "0.14.0-dev.19",
14
+ "@prisma-next/utils": "0.14.0-dev.19",
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.18",
21
- "@prisma-next/tsconfig": "0.14.0-dev.18",
20
+ "@prisma-next/test-utils": "0.14.0-dev.19",
21
+ "@prisma-next/tsconfig": "0.14.0-dev.19",
22
22
  "@types/pg": "8.20.0",
23
23
  "pg": "8.21.0",
24
- "@prisma-next/tsdown": "0.14.0-dev.18",
24
+ "@prisma-next/tsdown": "0.14.0-dev.19",
25
25
  "tsdown": "0.22.1",
26
26
  "typescript": "5.9.3",
27
27
  "vitest": "4.1.8"
@@ -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
- : never;
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
- : never
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
- : never);
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
- : never
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
- : never);
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
- : never
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
- : never);
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<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name>>
292
- : never
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<CodecId, TypeRef, Nullable, ColumnName, IdSpec, NamedConstraintSpec<Name>>
306
- : never);
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
  }
@@ -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 } : {}),
@@ -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 { __codecTypes?: infer C }
25
- ? C extends Record<string, { output: unknown }>
26
- ? C
27
- : Record<string, never>
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<string, never>) &
482
+ } & (TypeRef extends string ? { readonly typeRef: TypeRef } : Record<never, never>) &
480
483
  (TypeParams extends Record<string, unknown>
481
484
  ? { readonly typeParams: TypeParams }
482
- : Record<string, never>);
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
- ? T
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
- : EnumValueUnion<ModelFieldState<Definition, ModelName, FieldName>>)
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);