@prisma-next/sql-relational-core 0.3.0-pr.93.5 → 0.3.0-pr.95.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.
Files changed (41) hide show
  1. package/dist/ast/predicate.d.ts +2 -2
  2. package/dist/ast/predicate.d.ts.map +1 -1
  3. package/dist/ast/types.d.ts +21 -9
  4. package/dist/ast/types.d.ts.map +1 -1
  5. package/dist/{chunk-D4JLPIWO.js → chunk-2BWK6XEY.js} +1 -1
  6. package/dist/chunk-2BWK6XEY.js.map +1 -0
  7. package/dist/{chunk-5N34PNVZ.js → chunk-2MAKNVCP.js} +25 -1
  8. package/dist/chunk-2MAKNVCP.js.map +1 -0
  9. package/dist/{chunk-M23L3JHG.js → chunk-3F4RFQIB.js} +45 -35
  10. package/dist/chunk-3F4RFQIB.js.map +1 -0
  11. package/dist/{chunk-J6O2HVBM.js → chunk-HV334QHG.js} +2 -2
  12. package/dist/{chunk-J6O2HVBM.js.map → chunk-HV334QHG.js.map} +1 -1
  13. package/dist/{chunk-U7IAFPVU.js → chunk-L2FZU4IV.js} +29 -11
  14. package/dist/chunk-L2FZU4IV.js.map +1 -0
  15. package/dist/exports/ast.js +2 -2
  16. package/dist/exports/guards.d.ts +1 -1
  17. package/dist/exports/guards.d.ts.map +1 -1
  18. package/dist/exports/guards.js +13 -3
  19. package/dist/exports/operations-registry.js +2 -2
  20. package/dist/exports/schema.js +3 -4
  21. package/dist/exports/types.js +1 -1
  22. package/dist/index.js +5 -5
  23. package/dist/operations-registry.d.ts.map +1 -1
  24. package/dist/schema.d.ts +14 -9
  25. package/dist/schema.d.ts.map +1 -1
  26. package/dist/types.d.ts +69 -30
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/utils/guards.d.ts +43 -16
  29. package/dist/utils/guards.d.ts.map +1 -1
  30. package/package.json +9 -9
  31. package/src/ast/predicate.ts +3 -11
  32. package/src/ast/types.ts +23 -9
  33. package/src/exports/guards.ts +5 -0
  34. package/src/operations-registry.ts +112 -73
  35. package/src/schema.ts +40 -29
  36. package/src/types.ts +102 -52
  37. package/src/utils/guards.ts +88 -18
  38. package/dist/chunk-5N34PNVZ.js.map +0 -1
  39. package/dist/chunk-D4JLPIWO.js.map +0 -1
  40. package/dist/chunk-M23L3JHG.js.map +0 -1
  41. package/dist/chunk-U7IAFPVU.js.map +0 -1
package/src/types.ts CHANGED
@@ -10,6 +10,8 @@ import type {
10
10
  BinaryOp,
11
11
  ColumnRef,
12
12
  Direction,
13
+ Expression,
14
+ ExpressionSource,
13
15
  OperationExpr,
14
16
  ParamRef,
15
17
  QueryAst,
@@ -22,13 +24,21 @@ export interface ParamPlaceholder {
22
24
  readonly name: string;
23
25
  }
24
26
 
27
+ /**
28
+ * ValueSource represents any value that can appear in a comparison or as an argument.
29
+ * This includes:
30
+ * - ParamPlaceholder: A parameter placeholder (e.g., `param('userId')`)
31
+ * - ExpressionSource: Something that can be converted to an Expression (ColumnBuilder, ExpressionBuilder)
32
+ */
33
+ export type ValueSource = ParamPlaceholder | ExpressionSource;
34
+
25
35
  export interface OrderBuilder<
26
- ColumnName extends string = string,
27
- ColumnMeta extends StorageColumn = StorageColumn,
28
- JsType = unknown,
36
+ _ColumnName extends string = string,
37
+ _ColumnMeta extends StorageColumn = StorageColumn,
38
+ _JsType = unknown,
29
39
  > {
30
40
  readonly kind: 'order';
31
- readonly expr: ColumnBuilder<ColumnName, ColumnMeta, JsType> | OperationExpr;
41
+ readonly expr: Expression;
32
42
  readonly dir: Direction;
33
43
  }
34
44
 
@@ -45,6 +55,7 @@ export function createOrderBuilder(
45
55
  /**
46
56
  * ColumnBuilder with optional operation methods based on the column's typeId.
47
57
  * When Operations is provided and the column's typeId matches, operation methods are included.
58
+ * Implements ExpressionSource to provide type-safe conversion to ColumnRef.
48
59
  */
49
60
  export type ColumnBuilder<
50
61
  ColumnName extends string = string,
@@ -56,20 +67,17 @@ export type ColumnBuilder<
56
67
  readonly table: string;
57
68
  readonly column: ColumnName;
58
69
  readonly columnMeta: ColumnMeta;
59
- eq(value: ParamPlaceholder | AnyColumnBuilderBase): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
60
- neq(
61
- value: ParamPlaceholder | AnyColumnBuilderBase,
62
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
63
- gt(value: ParamPlaceholder | AnyColumnBuilderBase): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
64
- lt(value: ParamPlaceholder | AnyColumnBuilderBase): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
65
- gte(
66
- value: ParamPlaceholder | AnyColumnBuilderBase,
67
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
68
- lte(
69
- value: ParamPlaceholder | AnyColumnBuilderBase,
70
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
70
+ // Methods accept ValueSource (ParamPlaceholder or ExpressionSource)
71
+ eq(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
72
+ neq(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
73
+ gt(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
74
+ lt(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
75
+ gte(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
76
+ lte(value: ValueSource): BinaryBuilder<ColumnName, ColumnMeta, JsType>;
71
77
  asc(): OrderBuilder<ColumnName, ColumnMeta, JsType>;
72
78
  desc(): OrderBuilder<ColumnName, ColumnMeta, JsType>;
79
+ /** Converts this column builder to a ColumnRef expression */
80
+ toExpr(): ColumnRef;
73
81
  // Helper property for type extraction (not used at runtime)
74
82
  readonly __jsType: JsType;
75
83
  } & (ColumnMeta['codecId'] extends string
@@ -84,14 +92,47 @@ export type ColumnBuilder<
84
92
  : Record<string, never>);
85
93
 
86
94
  export interface BinaryBuilder<
87
- ColumnName extends string = string,
88
- ColumnMeta extends StorageColumn = StorageColumn,
89
- JsType = unknown,
95
+ _ColumnName extends string = string,
96
+ _ColumnMeta extends StorageColumn = StorageColumn,
97
+ _JsType = unknown,
90
98
  > {
91
99
  readonly kind: 'binary';
92
100
  readonly op: BinaryOp;
93
- readonly left: ColumnBuilder<ColumnName, ColumnMeta, JsType> | OperationExpr;
94
- readonly right: ParamPlaceholder | AnyColumnBuilderBase;
101
+ readonly left: Expression;
102
+ readonly right: ValueSource;
103
+ }
104
+
105
+ // Forward declare AnyBinaryBuilder and AnyOrderBuilder for use in ExpressionBuilder
106
+ export type AnyBinaryBuilder = BinaryBuilder;
107
+ export type AnyOrderBuilder = OrderBuilder;
108
+
109
+ /**
110
+ * ExpressionBuilder represents the result of an operation (e.g., col.distance(...)).
111
+ * Unlike ColumnBuilder (which represents a column), ExpressionBuilder represents
112
+ * an operation expression and provides the same DSL methods for chaining.
113
+ *
114
+ * Implements ExpressionSource to provide type-safe conversion to OperationExpr.
115
+ */
116
+ export interface ExpressionBuilder<JsType = unknown> extends ExpressionSource {
117
+ readonly kind: 'expression';
118
+ readonly expr: OperationExpr;
119
+ readonly columnMeta: StorageColumn;
120
+
121
+ // Methods accept ValueSource (ParamPlaceholder or ExpressionSource)
122
+ eq(value: ValueSource): AnyBinaryBuilder;
123
+ neq(value: ValueSource): AnyBinaryBuilder;
124
+ gt(value: ValueSource): AnyBinaryBuilder;
125
+ lt(value: ValueSource): AnyBinaryBuilder;
126
+ gte(value: ValueSource): AnyBinaryBuilder;
127
+ lte(value: ValueSource): AnyBinaryBuilder;
128
+ asc(): AnyOrderBuilder;
129
+ desc(): AnyOrderBuilder;
130
+
131
+ /** Converts this expression builder to the underlying OperationExpr */
132
+ toExpr(): OperationExpr;
133
+
134
+ // Helper property for type extraction (not used at runtime)
135
+ readonly __jsType: JsType;
95
136
  }
96
137
 
97
138
  // Helper aliases for usage sites where the specific column parameters are irrelevant
@@ -108,14 +149,16 @@ export type AnyColumnBuilderBase = {
108
149
  readonly table: string;
109
150
  readonly column: string;
110
151
  readonly columnMeta: StorageColumn;
111
- eq(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;
112
- neq(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;
113
- gt(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;
114
- lt(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;
115
- gte(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;
116
- lte(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;
152
+ // Methods accept ValueSource (ParamPlaceholder or ExpressionSource)
153
+ eq(value: ValueSource): AnyBinaryBuilder;
154
+ neq(value: ValueSource): AnyBinaryBuilder;
155
+ gt(value: ValueSource): AnyBinaryBuilder;
156
+ lt(value: ValueSource): AnyBinaryBuilder;
157
+ gte(value: ValueSource): AnyBinaryBuilder;
158
+ lte(value: ValueSource): AnyBinaryBuilder;
117
159
  asc(): AnyOrderBuilder;
118
160
  desc(): AnyOrderBuilder;
161
+ toExpr(): ColumnRef;
119
162
  readonly __jsType: unknown;
120
163
  // Allow any operation methods (from conditional type)
121
164
  readonly [key: string]: unknown;
@@ -130,8 +173,12 @@ export type AnyColumnBuilder =
130
173
  any
131
174
  >
132
175
  | AnyColumnBuilderBase;
133
- export type AnyBinaryBuilder = BinaryBuilder<string, StorageColumn, unknown>;
134
- export type AnyOrderBuilder = OrderBuilder<string, StorageColumn, unknown>;
176
+
177
+ /**
178
+ * Union type for any builder that can produce an Expression.
179
+ * Used in DSL method signatures where either a column or operation result can be passed.
180
+ */
181
+ export type AnyExpressionSource = AnyColumnBuilder | ExpressionBuilder;
135
182
 
136
183
  export function isColumnBuilder(value: unknown): value is AnyColumnBuilder {
137
184
  return (
@@ -264,7 +311,7 @@ type OperationArgs<Args extends ReadonlyArray<ArgSpec>> = Args extends readonly
264
311
  : [];
265
312
 
266
313
  type ArgToType<Arg extends ArgSpec> = Arg extends { kind: 'typeId' }
267
- ? AnyColumnBuilder
314
+ ? AnyExpressionSource
268
315
  : Arg extends { kind: 'param' }
269
316
  ? ParamPlaceholder
270
317
  : Arg extends { kind: 'literal' }
@@ -273,25 +320,25 @@ type ArgToType<Arg extends ArgSpec> = Arg extends { kind: 'typeId' }
273
320
 
274
321
  /**
275
322
  * Maps operation return spec to return type.
276
- * - builtin types: ColumnBuilder with appropriate JsType (matches runtime behavior)
277
- * - typeId types: ColumnBuilder (for now, could be more specific in future)
323
+ * Operations return ExpressionBuilder, not ColumnBuilder, because the result
324
+ * represents an expression (OperationExpr) rather than a column reference.
278
325
  */
279
326
  type OperationReturn<
280
327
  Returns extends ReturnSpec,
281
- ColumnName extends string,
282
- ColumnMeta extends StorageColumn,
328
+ _ColumnName extends string,
329
+ _ColumnMeta extends StorageColumn,
283
330
  _JsType,
284
331
  > = Returns extends { kind: 'builtin'; type: infer T }
285
332
  ? T extends 'number'
286
- ? ColumnBuilder<ColumnName, ColumnMeta, number>
333
+ ? ExpressionBuilder<number>
287
334
  : T extends 'boolean'
288
- ? ColumnBuilder<ColumnName, ColumnMeta, boolean>
335
+ ? ExpressionBuilder<boolean>
289
336
  : T extends 'string'
290
- ? ColumnBuilder<ColumnName, ColumnMeta, string>
291
- : ColumnBuilder<ColumnName, ColumnMeta, unknown>
337
+ ? ExpressionBuilder<string>
338
+ : ExpressionBuilder<unknown>
292
339
  : Returns extends { kind: 'typeId' }
293
- ? AnyColumnBuilder
294
- : ColumnBuilder<ColumnName, ColumnMeta, unknown>;
340
+ ? ExpressionBuilder<unknown>
341
+ : ExpressionBuilder<unknown>;
295
342
 
296
343
  /**
297
344
  * Computes JavaScript type for a column at column creation time.
@@ -351,17 +398,18 @@ export type InferProjectionRow<P extends Record<string, AnyColumnBuilder>> = {
351
398
  };
352
399
 
353
400
  /**
354
- * Nested projection type - allows recursive nesting of ColumnBuilder or nested objects.
401
+ * Nested projection type - allows recursive nesting of ColumnBuilder, ExpressionBuilder, or nested objects.
355
402
  */
356
403
  export type NestedProjection = Record<
357
404
  string,
358
- | AnyColumnBuilder
405
+ | AnyExpressionSource
359
406
  | Record<
360
407
  string,
361
- | AnyColumnBuilder
408
+ | AnyExpressionSource
362
409
  | Record<
363
410
  string,
364
- AnyColumnBuilder | Record<string, AnyColumnBuilder | Record<string, AnyColumnBuilder>>
411
+ | AnyExpressionSource
412
+ | Record<string, AnyExpressionSource | Record<string, AnyExpressionSource>>
365
413
  >
366
414
  >
367
415
  >;
@@ -384,17 +432,19 @@ type ExtractIncludeType<
384
432
  * by looking up the include alias in the Includes type map.
385
433
  */
386
434
  export type InferNestedProjectionRow<
387
- P extends Record<string, AnyColumnBuilder | boolean | NestedProjection>,
435
+ P extends Record<string, AnyExpressionSource | boolean | NestedProjection>,
388
436
  CodecTypes extends Record<string, { readonly output: unknown }> = Record<string, never>,
389
437
  Includes extends Record<string, unknown> = Record<string, never>,
390
438
  > = {
391
- [K in keyof P]: P[K] extends AnyColumnBuilder
392
- ? ExtractJsTypeFromColumnBuilder<P[K]>
393
- : P[K] extends true
394
- ? Array<ExtractIncludeType<K & string, Includes>> // Include reference - infers Array<ChildShape> from Includes map
395
- : P[K] extends NestedProjection
396
- ? InferNestedProjectionRow<P[K], CodecTypes, Includes>
397
- : never;
439
+ [K in keyof P]: P[K] extends ExpressionBuilder<infer JsType>
440
+ ? JsType
441
+ : P[K] extends AnyColumnBuilder
442
+ ? ExtractJsTypeFromColumnBuilder<P[K]>
443
+ : P[K] extends true
444
+ ? Array<ExtractIncludeType<K & string, Includes>> // Include reference - infers Array<ChildShape> from Includes map
445
+ : P[K] extends NestedProjection
446
+ ? InferNestedProjectionRow<P[K], CodecTypes, Includes>
447
+ : never;
398
448
  };
399
449
 
400
450
  /**
@@ -1,16 +1,27 @@
1
1
  import type { StorageColumn } from '@prisma-next/sql-contract/types';
2
- import type { ColumnRef, LiteralExpr, OperationExpr, ParamRef } from '../ast/types';
3
- import type { AnyColumnBuilder, ParamPlaceholder } from '../types';
2
+ import type {
3
+ ColumnRef,
4
+ Expression,
5
+ ExpressionSource,
6
+ LiteralExpr,
7
+ OperationExpr,
8
+ ParamRef,
9
+ } from '../ast/types';
10
+ import type {
11
+ AnyColumnBuilder,
12
+ AnyExpressionSource,
13
+ ExpressionBuilder,
14
+ ParamPlaceholder,
15
+ ValueSource,
16
+ } from '../types';
4
17
 
5
18
  /**
6
- * Helper to extract columnMeta from a ColumnBuilder.
19
+ * Helper to extract columnMeta from a ColumnBuilder or ExpressionBuilder.
7
20
  * Returns StorageColumn if present, undefined otherwise.
8
- * AnyColumnBuilder is a union that includes types with columnMeta property,
9
- * so we can safely access it after checking for existence.
21
+ * Both ColumnBuilder and ExpressionBuilder have columnMeta property.
10
22
  */
11
- export function getColumnMeta(expr: AnyColumnBuilder): StorageColumn | undefined {
12
- // AnyColumnBuilder includes AnyColumnBuilderBase which has columnMeta: StorageColumn
13
- // and ColumnBuilder which has columnMeta: ColumnMeta extends StorageColumn
23
+ export function getColumnMeta(expr: AnyExpressionSource): StorageColumn | undefined {
24
+ // Both ColumnBuilder and ExpressionBuilder have columnMeta: StorageColumn
14
25
  // TypeScript should narrow the type after the 'in' check
15
26
  if ('columnMeta' in expr) {
16
27
  return expr.columnMeta;
@@ -66,15 +77,17 @@ export function collectColumnRefs(
66
77
  /**
67
78
  * Type predicate to check if an expression is an OperationExpr.
68
79
  */
69
- export function isOperationExpr(expr: AnyColumnBuilder | OperationExpr): expr is OperationExpr {
80
+ export function isOperationExpr(
81
+ expr: AnyExpressionSource | OperationExpr | Expression,
82
+ ): expr is OperationExpr {
70
83
  return typeof expr === 'object' && expr !== null && 'kind' in expr && expr.kind === 'operation';
71
84
  }
72
85
 
73
86
  /**
74
- * Helper to extract table and column from a ColumnBuilder or OperationExpr.
75
- * For OperationExpr, recursively unwraps to find the base ColumnRef.
87
+ * Helper to extract table and column from a ColumnBuilder, ExpressionBuilder, or OperationExpr.
88
+ * For ExpressionBuilder or OperationExpr, recursively unwraps to find the base ColumnRef.
76
89
  */
77
- export function getColumnInfo(expr: AnyColumnBuilder | OperationExpr): {
90
+ export function getColumnInfo(expr: AnyExpressionSource | OperationExpr): {
78
91
  table: string;
79
92
  column: string;
80
93
  } {
@@ -82,6 +95,10 @@ export function getColumnInfo(expr: AnyColumnBuilder | OperationExpr): {
82
95
  const baseCol = extractBaseColumnRef(expr);
83
96
  return { table: baseCol.table, column: baseCol.column };
84
97
  }
98
+ if (isExpressionBuilder(expr)) {
99
+ const baseCol = extractBaseColumnRef(expr.expr);
100
+ return { table: baseCol.table, column: baseCol.column };
101
+ }
85
102
  // expr is ColumnBuilder - TypeScript can't narrow properly
86
103
  const colBuilder = expr as unknown as { table: string; column: string };
87
104
  return { table: colBuilder.table, column: colBuilder.column };
@@ -99,18 +116,71 @@ export function isColumnBuilder(value: unknown): value is AnyColumnBuilder {
99
116
  );
100
117
  }
101
118
 
119
+ /**
120
+ * Type predicate to check if a value is an ExpressionBuilder.
121
+ */
122
+ export function isExpressionBuilder(value: unknown): value is ExpressionBuilder {
123
+ return (
124
+ typeof value === 'object' &&
125
+ value !== null &&
126
+ 'kind' in value &&
127
+ (value as { kind: unknown }).kind === 'expression'
128
+ );
129
+ }
130
+
131
+ /**
132
+ * Type predicate to check if a value is an ExpressionSource (has toExpr method).
133
+ */
134
+ export function isExpressionSource(value: unknown): value is ExpressionSource {
135
+ return (
136
+ typeof value === 'object' &&
137
+ value !== null &&
138
+ 'toExpr' in value &&
139
+ typeof (value as ExpressionSource).toExpr === 'function'
140
+ );
141
+ }
142
+
143
+ /**
144
+ * Converts any ExpressionSource to an Expression.
145
+ * This is the canonical way to get an AST Expression from a builder.
146
+ *
147
+ * @param source - A ColumnBuilder or ExpressionBuilder
148
+ * @returns The corresponding Expression (ColumnRef or OperationExpr)
149
+ */
150
+ export function toExpression(source: ExpressionSource): Expression {
151
+ return source.toExpr();
152
+ }
153
+
154
+ /**
155
+ * Converts an AnyExpressionSource to an Expression.
156
+ * Handles both ColumnBuilder and ExpressionBuilder.
157
+ *
158
+ * @param source - A ColumnBuilder or ExpressionBuilder
159
+ * @returns The corresponding Expression (ColumnRef or OperationExpr)
160
+ */
161
+ export function expressionFromSource(source: AnyExpressionSource): Expression {
162
+ return source.toExpr();
163
+ }
164
+
165
+ /**
166
+ * Type predicate to check if a value is a ValueSource.
167
+ * ValueSource is either a ParamPlaceholder or an ExpressionSource.
168
+ */
169
+ export function isValueSource(value: unknown): value is ValueSource {
170
+ return isParamPlaceholder(value) || isExpressionSource(value);
171
+ }
172
+
102
173
  /**
103
174
  * Extracts and returns an OperationExpr from a builder.
104
175
  * Returns the OperationExpr if the builder is an OperationExpr or has an _operationExpr property,
105
176
  * otherwise returns undefined.
106
177
  *
178
+ * @deprecated Use isExpressionBuilder() instead. This function exists for backward compatibility
179
+ * with code that uses the hidden _operationExpr property pattern.
180
+ *
107
181
  * @design-note: This function accesses the hidden `_operationExpr` property, which is a code smell.
108
- * The issue is that `executeOperation()` in relational-core returns a ColumnBuilder-shaped object
109
- * with a hidden `_operationExpr` property, creating coupling between lanes and relational-core
110
- * implementation details. A cleaner design would be to have operation results be a separate
111
- * type (e.g., `OperationResultBuilder`) that properly represents expression nodes rather than
112
- * pretending to be a ColumnBuilder. This would require refactoring the operation execution
113
- * system in relational-core to return proper expression types.
182
+ * The ExpressionBuilder type (introduced in the operation-expr-refactoring) provides a cleaner
183
+ * approach by explicitly representing operation results as a distinct type.
114
184
  */
115
185
  export function getOperationExpr(
116
186
  builder: AnyColumnBuilder | OperationExpr,
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/guards.ts"],"sourcesContent":["import type { StorageColumn } from '@prisma-next/sql-contract/types';\nimport type { ColumnRef, LiteralExpr, OperationExpr, ParamRef } from '../ast/types';\nimport type { AnyColumnBuilder, ParamPlaceholder } from '../types';\n\n/**\n * Helper to extract columnMeta from a ColumnBuilder.\n * Returns StorageColumn if present, undefined otherwise.\n * AnyColumnBuilder is a union that includes types with columnMeta property,\n * so we can safely access it after checking for existence.\n */\nexport function getColumnMeta(expr: AnyColumnBuilder): StorageColumn | undefined {\n // AnyColumnBuilder includes AnyColumnBuilderBase which has columnMeta: StorageColumn\n // and ColumnBuilder which has columnMeta: ColumnMeta extends StorageColumn\n // TypeScript should narrow the type after the 'in' check\n if ('columnMeta' in expr) {\n return expr.columnMeta;\n }\n return undefined;\n}\n\n/**\n * Type predicate to check if a value is a ParamPlaceholder.\n */\nexport function isParamPlaceholder(value: unknown): value is ParamPlaceholder {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n (value as { kind: unknown }).kind === 'param-placeholder' &&\n 'name' in value &&\n typeof (value as { name: unknown }).name === 'string'\n );\n}\n\n/**\n * Recursively extracts the base ColumnRef from an OperationExpr.\n * If the expression is already a ColumnRef, it is returned directly.\n */\nexport function extractBaseColumnRef(expr: ColumnRef | OperationExpr): ColumnRef {\n if (expr.kind === 'col') {\n return expr;\n }\n return extractBaseColumnRef(expr.self);\n}\n\n/**\n * Recursively collects all ColumnRef nodes from an expression tree.\n * Handles nested OperationExpr structures by traversing both self and args.\n */\nexport function collectColumnRefs(\n expr: ColumnRef | ParamRef | LiteralExpr | OperationExpr,\n): ColumnRef[] {\n if (expr.kind === 'col') {\n return [expr];\n }\n if (expr.kind === 'operation') {\n const refs: ColumnRef[] = collectColumnRefs(expr.self);\n for (const arg of expr.args) {\n refs.push(...collectColumnRefs(arg));\n }\n return refs;\n }\n return [];\n}\n\n/**\n * Type predicate to check if an expression is an OperationExpr.\n */\nexport function isOperationExpr(expr: AnyColumnBuilder | OperationExpr): expr is OperationExpr {\n return typeof expr === 'object' && expr !== null && 'kind' in expr && expr.kind === 'operation';\n}\n\n/**\n * Helper to extract table and column from a ColumnBuilder or OperationExpr.\n * For OperationExpr, recursively unwraps to find the base ColumnRef.\n */\nexport function getColumnInfo(expr: AnyColumnBuilder | OperationExpr): {\n table: string;\n column: string;\n} {\n if (isOperationExpr(expr)) {\n const baseCol = extractBaseColumnRef(expr);\n return { table: baseCol.table, column: baseCol.column };\n }\n // expr is ColumnBuilder - TypeScript can't narrow properly\n const colBuilder = expr as unknown as { table: string; column: string };\n return { table: colBuilder.table, column: colBuilder.column };\n}\n\n/**\n * Type predicate to check if a value is a ColumnBuilder.\n */\nexport function isColumnBuilder(value: unknown): value is AnyColumnBuilder {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n (value as { kind: unknown }).kind === 'column'\n );\n}\n\n/**\n * Extracts and returns an OperationExpr from a builder.\n * Returns the OperationExpr if the builder is an OperationExpr or has an _operationExpr property,\n * otherwise returns undefined.\n *\n * @design-note: This function accesses the hidden `_operationExpr` property, which is a code smell.\n * The issue is that `executeOperation()` in relational-core returns a ColumnBuilder-shaped object\n * with a hidden `_operationExpr` property, creating coupling between lanes and relational-core\n * implementation details. A cleaner design would be to have operation results be a separate\n * type (e.g., `OperationResultBuilder`) that properly represents expression nodes rather than\n * pretending to be a ColumnBuilder. This would require refactoring the operation execution\n * system in relational-core to return proper expression types.\n */\nexport function getOperationExpr(\n builder: AnyColumnBuilder | OperationExpr,\n): OperationExpr | undefined {\n if (isOperationExpr(builder)) {\n return builder;\n }\n const builderWithExpr = builder as unknown as { _operationExpr?: OperationExpr };\n return builderWithExpr._operationExpr;\n}\n"],"mappings":";AAUO,SAAS,cAAc,MAAmD;AAI/E,MAAI,gBAAgB,MAAM;AACxB,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAKO,SAAS,mBAAmB,OAA2C;AAC5E,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAA4B,SAAS,uBACtC,UAAU,SACV,OAAQ,MAA4B,SAAS;AAEjD;AAMO,SAAS,qBAAqB,MAA4C;AAC/E,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,KAAK,IAAI;AACvC;AAMO,SAAS,kBACd,MACa;AACb,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO,CAAC,IAAI;AAAA,EACd;AACA,MAAI,KAAK,SAAS,aAAa;AAC7B,UAAM,OAAoB,kBAAkB,KAAK,IAAI;AACrD,eAAW,OAAO,KAAK,MAAM;AAC3B,WAAK,KAAK,GAAG,kBAAkB,GAAG,CAAC;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACA,SAAO,CAAC;AACV;AAKO,SAAS,gBAAgB,MAA+D;AAC7F,SAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,QAAQ,KAAK,SAAS;AACtF;AAMO,SAAS,cAAc,MAG5B;AACA,MAAI,gBAAgB,IAAI,GAAG;AACzB,UAAM,UAAU,qBAAqB,IAAI;AACzC,WAAO,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO;AAAA,EACxD;AAEA,QAAM,aAAa;AACnB,SAAO,EAAE,OAAO,WAAW,OAAO,QAAQ,WAAW,OAAO;AAC9D;AAKO,SAAS,gBAAgB,OAA2C;AACzE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAA4B,SAAS;AAE1C;AAeO,SAAS,iBACd,SAC2B;AAC3B,MAAI,gBAAgB,OAAO,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,kBAAkB;AACxB,SAAO,gBAAgB;AACzB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type {\n ResultType as CoreResultType,\n ExecutionPlan,\n PlanRefs,\n} from '@prisma-next/contract/types';\nimport type { ArgSpec, ReturnSpec } from '@prisma-next/operations';\nimport type { SqlContract, SqlStorage, StorageColumn } from '@prisma-next/sql-contract/types';\nimport type { SqlLoweringSpec } from '@prisma-next/sql-operations';\nimport type {\n BinaryOp,\n ColumnRef,\n Direction,\n OperationExpr,\n ParamRef,\n QueryAst,\n} from './ast/types';\nimport type { SqlQueryPlan } from './plan';\nimport type { QueryLaneContext } from './query-lane-context';\n\nexport interface ParamPlaceholder {\n readonly kind: 'param-placeholder';\n readonly name: string;\n}\n\nexport interface OrderBuilder<\n ColumnName extends string = string,\n ColumnMeta extends StorageColumn = StorageColumn,\n JsType = unknown,\n> {\n readonly kind: 'order';\n readonly expr: ColumnBuilder<ColumnName, ColumnMeta, JsType> | OperationExpr;\n readonly dir: Direction;\n}\n\n/**\n * Creates an OrderBuilder for use in orderBy clauses.\n */\nexport function createOrderBuilder(\n expr: AnyColumnBuilder | OperationExpr,\n dir: Direction,\n): AnyOrderBuilder {\n return { kind: 'order', expr, dir } as AnyOrderBuilder;\n}\n\n/**\n * ColumnBuilder with optional operation methods based on the column's typeId.\n * When Operations is provided and the column's typeId matches, operation methods are included.\n */\nexport type ColumnBuilder<\n ColumnName extends string = string,\n ColumnMeta extends StorageColumn = StorageColumn,\n JsType = unknown,\n Operations extends OperationTypes = Record<string, never>,\n> = {\n readonly kind: 'column';\n readonly table: string;\n readonly column: ColumnName;\n readonly columnMeta: ColumnMeta;\n eq(value: ParamPlaceholder | AnyColumnBuilderBase): BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n neq(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n gt(value: ParamPlaceholder | AnyColumnBuilderBase): BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n lt(value: ParamPlaceholder | AnyColumnBuilderBase): BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n gte(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n lte(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n asc(): OrderBuilder<ColumnName, ColumnMeta, JsType>;\n desc(): OrderBuilder<ColumnName, ColumnMeta, JsType>;\n // Helper property for type extraction (not used at runtime)\n readonly __jsType: JsType;\n} & (ColumnMeta['codecId'] extends string\n ? ColumnMeta['codecId'] extends keyof Operations\n ? OperationMethods<\n OperationsForTypeId<ColumnMeta['codecId'] & string, Operations>,\n ColumnName,\n StorageColumn,\n JsType\n >\n : Record<string, never>\n : Record<string, never>);\n\nexport interface BinaryBuilder<\n ColumnName extends string = string,\n ColumnMeta extends StorageColumn = StorageColumn,\n JsType = unknown,\n> {\n readonly kind: 'binary';\n readonly op: BinaryOp;\n readonly left: ColumnBuilder<ColumnName, ColumnMeta, JsType> | OperationExpr;\n readonly right: ParamPlaceholder | AnyColumnBuilderBase;\n}\n\n// Helper aliases for usage sites where the specific column parameters are irrelevant\n// Accepts any ColumnBuilder regardless of its Operations parameter\n// Note: We use `any` here because TypeScript's variance rules don't allow us to express\n// \"any type that extends OperationTypes\" in a way that works for assignment.\n// Contract-specific OperationTypes (e.g., PgVectorOperationTypes) are not assignable\n// to the base OperationTypes in generic parameter position, even though they extend it structurally.\n// Helper type that accepts any ColumnBuilder regardless of its generic parameters\n// This is needed because conditional types in ColumnBuilder create incompatible intersection types\n// when Operations differs, even though structurally they're compatible\nexport type AnyColumnBuilderBase = {\n readonly kind: 'column';\n readonly table: string;\n readonly column: string;\n readonly columnMeta: StorageColumn;\n eq(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;\n neq(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;\n gt(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;\n lt(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;\n gte(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;\n lte(value: ParamPlaceholder | AnyColumnBuilderBase): AnyBinaryBuilder;\n asc(): AnyOrderBuilder;\n desc(): AnyOrderBuilder;\n readonly __jsType: unknown;\n // Allow any operation methods (from conditional type)\n readonly [key: string]: unknown;\n};\n\nexport type AnyColumnBuilder =\n | ColumnBuilder<\n string,\n StorageColumn,\n unknown,\n // biome-ignore lint/suspicious/noExplicitAny: AnyColumnBuilder must accept column builders with any operation types\n any\n >\n | AnyColumnBuilderBase;\nexport type AnyBinaryBuilder = BinaryBuilder<string, StorageColumn, unknown>;\nexport type AnyOrderBuilder = OrderBuilder<string, StorageColumn, unknown>;\n\nexport function isColumnBuilder(value: unknown): value is AnyColumnBuilder {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n (value as { kind: unknown }).kind === 'column'\n );\n}\n\nexport interface JoinOnBuilder {\n eqCol(left: AnyColumnBuilder, right: AnyColumnBuilder): JoinOnPredicate;\n}\n\nexport interface JoinOnPredicate {\n readonly kind: 'join-on';\n readonly left: AnyColumnBuilder;\n readonly right: AnyColumnBuilder;\n}\n\nexport type Expr = ColumnRef | ParamRef;\n\n/**\n * Helper type to extract codec output type from CodecTypes.\n * Returns never if the codecId is not found in CodecTypes.\n */\ntype ExtractCodecOutputType<\n CodecId extends string,\n CodecTypes extends Record<string, { readonly output: unknown }>,\n> = CodecId extends keyof CodecTypes\n ? CodecTypes[CodecId] extends { readonly output: infer Output }\n ? Output\n : never\n : never;\n\n/**\n * Type-level operation signature.\n * Represents an operation at the type level, similar to OperationSignature at runtime.\n */\nexport type OperationTypeSignature = {\n readonly args: ReadonlyArray<ArgSpec>;\n readonly returns: ReturnSpec;\n readonly lowering: SqlLoweringSpec;\n readonly capabilities?: ReadonlyArray<string>;\n};\n\n/**\n * Type-level operation registry.\n * Maps typeId → operations, where operations is a record of method name → operation signature.\n *\n * Example:\n * ```typescript\n * type MyOperations: OperationTypes = {\n * 'pg/vector@1': {\n * cosineDistance: {\n * args: [{ kind: 'typeId'; type: 'pg/vector@1' }];\n * returns: { kind: 'builtin'; type: 'number' };\n * lowering: { targetFamily: 'sql'; strategy: 'function'; template: '...' };\n * };\n * };\n * };\n * ```\n */\nexport type OperationTypes = Record<string, Record<string, OperationTypeSignature>>;\n\n/**\n * CodecTypes represents a map of typeId to codec definitions.\n * Each codec definition must have an `output` property indicating the JavaScript type.\n *\n * Example:\n * ```typescript\n * type MyCodecTypes: CodecTypes = {\n * 'pg/int4@1': { output: number };\n * 'pg/text@1': { output: string };\n * };\n * ```\n */\nexport type CodecTypes = Record<string, { readonly output: unknown }>;\n\n/**\n * Extracts operations for a given typeId from the operation registry.\n * Returns an empty record if the typeId is not found.\n *\n * @example\n * ```typescript\n * type Ops = OperationsForTypeId<'pg/vector@1', MyOperations>;\n * // Ops = { cosineDistance: { ... }, l2Distance: { ... } }\n * ```\n */\nexport type OperationsForTypeId<\n TypeId extends string,\n Operations extends OperationTypes,\n> = Operations extends Record<string, never>\n ? Record<string, never>\n : TypeId extends keyof Operations\n ? Operations[TypeId]\n : Record<string, never>;\n\n/**\n * Maps operation signatures to method signatures on ColumnBuilder.\n * Each operation becomes a method that returns a ColumnBuilder or BinaryBuilder\n * based on the return type.\n */\ntype OperationMethods<\n Ops extends Record<string, OperationTypeSignature>,\n ColumnName extends string,\n ColumnMeta extends StorageColumn,\n JsType,\n> = {\n [K in keyof Ops]: Ops[K] extends OperationTypeSignature\n ? (\n ...args: OperationArgs<Ops[K]['args']>\n ) => OperationReturn<Ops[K]['returns'], ColumnName, ColumnMeta, JsType>\n : never;\n};\n\n/**\n * Maps operation argument specs to TypeScript argument types.\n * - typeId args: ColumnBuilder (accepts base columns or operation results)\n * - param args: ParamPlaceholder\n * - literal args: unknown (could be more specific in future)\n */\ntype OperationArgs<Args extends ReadonlyArray<ArgSpec>> = Args extends readonly [\n infer First,\n ...infer Rest,\n]\n ? First extends ArgSpec\n ? [ArgToType<First>, ...(Rest extends ReadonlyArray<ArgSpec> ? OperationArgs<Rest> : [])]\n : []\n : [];\n\ntype ArgToType<Arg extends ArgSpec> = Arg extends { kind: 'typeId' }\n ? AnyColumnBuilder\n : Arg extends { kind: 'param' }\n ? ParamPlaceholder\n : Arg extends { kind: 'literal' }\n ? unknown\n : never;\n\n/**\n * Maps operation return spec to return type.\n * - builtin types: ColumnBuilder with appropriate JsType (matches runtime behavior)\n * - typeId types: ColumnBuilder (for now, could be more specific in future)\n */\ntype OperationReturn<\n Returns extends ReturnSpec,\n ColumnName extends string,\n ColumnMeta extends StorageColumn,\n _JsType,\n> = Returns extends { kind: 'builtin'; type: infer T }\n ? T extends 'number'\n ? ColumnBuilder<ColumnName, ColumnMeta, number>\n : T extends 'boolean'\n ? ColumnBuilder<ColumnName, ColumnMeta, boolean>\n : T extends 'string'\n ? ColumnBuilder<ColumnName, ColumnMeta, string>\n : ColumnBuilder<ColumnName, ColumnMeta, unknown>\n : Returns extends { kind: 'typeId' }\n ? AnyColumnBuilder\n : ColumnBuilder<ColumnName, ColumnMeta, unknown>;\n\n/**\n * Computes JavaScript type for a column at column creation time.\n *\n * Type inference:\n * - Read columnMeta.codecId as typeId string literal\n * - Look up CodecTypes[typeId].output\n * - Apply nullability: nullable ? Output | null : Output\n */\ntype ColumnMetaTypeId<ColumnMeta> = ColumnMeta extends { codecId: infer CodecId extends string }\n ? CodecId\n : ColumnMeta extends { type: infer TypeId extends string }\n ? TypeId\n : never;\n\nexport type ComputeColumnJsType<\n _Contract extends SqlContract<SqlStorage>,\n _TableName extends string,\n _ColumnName extends string,\n ColumnMeta extends StorageColumn,\n CodecTypes extends Record<string, { readonly output: unknown }>,\n> = ColumnMeta extends { nullable: infer Nullable }\n ? ColumnMetaTypeId<ColumnMeta> extends infer TypeId\n ? TypeId extends string\n ? ExtractCodecOutputType<TypeId, CodecTypes> extends infer CodecOutput\n ? [CodecOutput] extends [never]\n ? unknown // Codec not found in CodecTypes\n : Nullable extends true\n ? CodecOutput | null\n : CodecOutput\n : unknown\n : unknown\n : unknown\n : unknown;\n\n/**\n * Infers Row type from a projection object.\n * Maps Record<string, ColumnBuilder> to Record<string, JSType>\n *\n * Extracts the pre-computed JsType from each ColumnBuilder in the projection.\n */\n/**\n * Extracts the inferred JsType carried by a ColumnBuilder.\n */\ntype ExtractJsTypeFromColumnBuilder<CB extends AnyColumnBuilder> =\n CB extends ColumnBuilder<\n infer _ColumnName extends string,\n infer _ColumnMeta extends StorageColumn,\n infer JsType,\n infer _Ops\n >\n ? JsType\n : never;\n\nexport type InferProjectionRow<P extends Record<string, AnyColumnBuilder>> = {\n [K in keyof P]: ExtractJsTypeFromColumnBuilder<P[K]>;\n};\n\n/**\n * Nested projection type - allows recursive nesting of ColumnBuilder or nested objects.\n */\nexport type NestedProjection = Record<\n string,\n | AnyColumnBuilder\n | Record<\n string,\n | AnyColumnBuilder\n | Record<\n string,\n AnyColumnBuilder | Record<string, AnyColumnBuilder | Record<string, AnyColumnBuilder>>\n >\n >\n>;\n\n/**\n * Helper type to extract include type from Includes map.\n * Returns the value type if K is a key of Includes, otherwise returns unknown.\n */\ntype ExtractIncludeType<\n K extends string,\n Includes extends Record<string, unknown>,\n> = K extends keyof Includes ? Includes[K] : unknown;\n\n/**\n * Infers Row type from a nested projection object.\n * Recursively maps Record<string, ColumnBuilder | boolean | NestedProjection> to nested object types.\n *\n * Extracts the pre-computed JsType from each ColumnBuilder at leaves.\n * When a value is `true`, it represents an include reference and infers `Array<ChildShape>`\n * by looking up the include alias in the Includes type map.\n */\nexport type InferNestedProjectionRow<\n P extends Record<string, AnyColumnBuilder | boolean | NestedProjection>,\n CodecTypes extends Record<string, { readonly output: unknown }> = Record<string, never>,\n Includes extends Record<string, unknown> = Record<string, never>,\n> = {\n [K in keyof P]: P[K] extends AnyColumnBuilder\n ? ExtractJsTypeFromColumnBuilder<P[K]>\n : P[K] extends true\n ? Array<ExtractIncludeType<K & string, Includes>> // Include reference - infers Array<ChildShape> from Includes map\n : P[K] extends NestedProjection\n ? InferNestedProjectionRow<P[K], CodecTypes, Includes>\n : never;\n};\n\n/**\n * Infers Row type from a tuple of ColumnBuilders used in returning() clause.\n * Extracts column name and JsType from each ColumnBuilder and creates a Record.\n */\nexport type InferReturningRow<Columns extends readonly AnyColumnBuilder[]> =\n Columns extends readonly [infer First, ...infer Rest]\n ? First extends ColumnBuilder<\n infer Name,\n infer _Meta,\n infer JsType,\n infer _Ops extends OperationTypes\n >\n ? Name extends string\n ? Rest extends readonly AnyColumnBuilder[]\n ? { [K in Name]: JsType } & InferReturningRow<Rest>\n : { [K in Name]: JsType }\n : never\n : never\n : Record<string, never>;\n\n/**\n * Utility type to check if a contract has the required capabilities for includeMany.\n * Requires both `lateral` and `jsonAgg` to be `true` in the contract's capabilities for the target.\n * Capabilities are nested by target: `{ [target]: { lateral: true, jsonAgg: true } }`\n */\nexport type HasIncludeManyCapabilities<TContract extends SqlContract<SqlStorage>> =\n TContract extends { capabilities: infer C; target: infer T }\n ? T extends string\n ? C extends Record<string, Record<string, boolean>>\n ? C extends { [K in T]: infer TargetCaps }\n ? TargetCaps extends { lateral: true; jsonAgg: true }\n ? true\n : false\n : false\n : false\n : false\n : false;\n\n/**\n * SQL-specific Plan type that refines the ast field to use QueryAst.\n * This is the type used by SQL query builders.\n */\nexport type SqlPlan<Row = unknown> = ExecutionPlan<Row, QueryAst>;\n\n/**\n * Helper types for extracting contract structure.\n */\nexport type TablesOf<TContract> = TContract extends {\n storage: { tables: infer U };\n}\n ? U\n : never;\n\nexport type TableKey<TContract> = Extract<keyof TablesOf<TContract>, string>;\n\n// Common types for contract.d.ts generation (SQL-specific)\n// These types are used by emitted contract.d.ts files to provide type-safe DSL/ORM types\n\n/**\n * Unique symbol for metadata property to avoid collisions with user-defined properties\n */\nexport declare const META: unique symbol;\n\n/**\n * Extracts metadata from a type that has a META property\n */\nexport type Meta<T extends { [META]: unknown }> = T[typeof META];\n\n/**\n * Metadata interface for table definitions\n */\nexport interface TableMetadata<Name extends string> {\n name: Name;\n}\n\n/**\n * Metadata interface for model definitions\n */\nexport interface ModelMetadata<Name extends string> {\n name: Name;\n}\n\n/**\n * Base interface for table definitions with metadata\n * Used in contract.d.ts to define storage-level table types\n */\nexport interface TableDef<Name extends string> {\n readonly [META]: TableMetadata<Name>;\n}\n\n/**\n * Base interface for model definitions with metadata\n * Used in contract.d.ts to define application-level model types\n */\nexport interface ModelDef<Name extends string> {\n readonly [META]: ModelMetadata<Name>;\n}\n\nexport type ColumnsOf<\n TContract,\n K extends TableKey<TContract>,\n> = K extends keyof TablesOf<TContract>\n ? TablesOf<TContract>[K] extends { columns: infer C }\n ? C\n : never\n : never;\n\nexport interface RawTemplateOptions {\n readonly refs?: PlanRefs;\n readonly annotations?: Record<string, unknown>;\n readonly projection?: ReadonlyArray<string>;\n}\n\nexport interface RawFunctionOptions extends RawTemplateOptions {\n readonly params: ReadonlyArray<unknown>;\n}\n\nexport type RawTemplateFactory = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n) => ExecutionPlan;\n\nexport interface RawFactory extends RawTemplateFactory {\n (text: string, options: RawFunctionOptions): ExecutionPlan;\n with(options: RawTemplateOptions): RawTemplateFactory;\n}\n\nexport type { RuntimeError } from '@prisma-next/plan';\n\nexport interface BuildParamsMap {\n readonly [name: string]: unknown;\n}\n\nexport interface BuildOptions {\n readonly params?: BuildParamsMap;\n}\n\nexport interface SqlBuilderOptions<\n TContract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>,\n> {\n readonly context: QueryLaneContext<TContract>;\n}\n\n/**\n * SQL-specific ResultType that works with both Plan and SqlQueryPlan.\n * This extends the core ResultType to also handle SqlQueryPlan.\n * Example: `type Row = ResultType<typeof plan>`\n */\nexport type ResultType<P> = P extends SqlQueryPlan<infer R> ? R : CoreResultType<P>;\n"],"mappings":";AAqCO,SAAS,mBACd,MACA,KACiB;AACjB,SAAO,EAAE,MAAM,SAAS,MAAM,IAAI;AACpC;AA6FO,SAAS,gBAAgB,OAA2C;AACzE,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACT,MAA4B,SAAS;AAE1C;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/operations-registry.ts"],"sourcesContent":["import type { OperationRegistry } from '@prisma-next/operations';\nimport { hasAllCapabilities } from '@prisma-next/operations';\nimport { planInvalid } from '@prisma-next/plan';\nimport type { StorageColumn } from '@prisma-next/sql-contract/types';\nimport type { SqlOperationSignature } from '@prisma-next/sql-operations';\nimport type { BinaryOp, ColumnRef, LiteralExpr, OperationExpr, ParamRef } from './ast/types';\nimport type { AnyColumnBuilder, ColumnBuilder, OperationTypes, ParamPlaceholder } from './types';\nimport { isParamPlaceholder } from './utils/guards';\n\nfunction isColumnBuilder(value: unknown): value is AnyColumnBuilder {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n (value as { kind: unknown }).kind === 'column'\n );\n}\n\n/**\n * Executes an operation and returns a column-shaped result object.\n * This is the canonical entrypoint for operation invocation, enabling\n * future enhancements like telemetry, caching, or tracing.\n *\n * @param signature - The operation signature from the registry\n * @param selfBuilder - The column builder that the operation is called on\n * @param args - The arguments passed to the operation\n * @param columnMeta - The metadata of the column the operation is called on\n * @returns A column-shaped builder with the operation expression attached\n */\nfunction executeOperation(\n signature: SqlOperationSignature,\n selfBuilder: AnyColumnBuilder,\n args: unknown[],\n columnMeta: StorageColumn,\n operationRegistry?: OperationRegistry,\n contractCapabilities?: Record<string, Record<string, boolean>>,\n): AnyColumnBuilder & { _operationExpr?: OperationExpr } {\n if (args.length !== signature.args.length) {\n throw planInvalid(\n `Operation ${signature.method} expects ${signature.args.length} arguments, got ${args.length}`,\n );\n }\n\n // Check if this column builder has an existing operation expression\n const selfBuilderWithExpr = selfBuilder as unknown as {\n _operationExpr?: OperationExpr;\n table: string;\n column: string;\n };\n const selfExpr: ColumnRef | OperationExpr = selfBuilderWithExpr._operationExpr\n ? selfBuilderWithExpr._operationExpr\n : {\n kind: 'col',\n table: selfBuilderWithExpr.table,\n column: selfBuilderWithExpr.column,\n };\n\n const operationArgs: Array<ColumnRef | ParamRef | LiteralExpr | OperationExpr> = [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const argSpec = signature.args[i];\n if (!argSpec) {\n throw planInvalid(`Missing argument spec for argument ${i}`);\n }\n\n if (argSpec.kind === 'param') {\n if (!isParamPlaceholder(arg)) {\n throw planInvalid(`Argument ${i} must be a parameter placeholder`);\n }\n operationArgs.push({\n kind: 'param',\n index: 0,\n name: arg.name,\n });\n } else if (argSpec.kind === 'typeId') {\n if (!isColumnBuilder(arg)) {\n throw planInvalid(`Argument ${i} must be a ColumnBuilder`);\n }\n const colBuilderWithExpr = arg as unknown as {\n _operationExpr?: OperationExpr;\n table: string;\n column: string;\n };\n // Check if the column builder has an operation expression\n if (colBuilderWithExpr._operationExpr) {\n operationArgs.push(colBuilderWithExpr._operationExpr);\n } else {\n // Fall back to raw ColumnRef\n operationArgs.push({\n kind: 'col',\n table: colBuilderWithExpr.table,\n column: colBuilderWithExpr.column,\n });\n }\n } else if (argSpec.kind === 'literal') {\n operationArgs.push({\n kind: 'literal',\n value: arg,\n });\n }\n }\n\n const operationExpr: OperationExpr = {\n kind: 'operation',\n method: signature.method,\n forTypeId: signature.forTypeId,\n self: selfExpr,\n args: operationArgs,\n returns: signature.returns,\n lowering: signature.lowering,\n };\n\n const returnTypeId = signature.returns.kind === 'typeId' ? signature.returns.type : undefined;\n const returnColumnMeta: StorageColumn = returnTypeId\n ? {\n ...columnMeta,\n codecId: returnTypeId,\n }\n : columnMeta;\n\n const createComparisonMethod = (op: BinaryOp) => (value: ParamPlaceholder) =>\n Object.freeze({\n kind: 'binary' as const,\n op,\n left: operationExpr,\n right: value,\n });\n\n const baseResult = {\n kind: 'column' as const,\n table: selfBuilderWithExpr.table,\n column: selfBuilderWithExpr.column,\n get columnMeta() {\n return returnColumnMeta;\n },\n eq: createComparisonMethod('eq'),\n neq: createComparisonMethod('neq'),\n gt: createComparisonMethod('gt'),\n lt: createComparisonMethod('lt'),\n gte: createComparisonMethod('gte'),\n lte: createComparisonMethod('lte'),\n asc() {\n return Object.freeze({\n kind: 'order' as const,\n expr: operationExpr,\n dir: 'asc' as const,\n });\n },\n desc() {\n return Object.freeze({\n kind: 'order' as const,\n expr: operationExpr,\n dir: 'desc' as const,\n });\n },\n _operationExpr: operationExpr,\n } as unknown as AnyColumnBuilder & {\n _operationExpr?: OperationExpr;\n };\n\n // If the return type is a typeId, attach operations for that type\n if (returnTypeId && operationRegistry) {\n const resultWithOps = attachOperationsToColumnBuilder(\n baseResult as ColumnBuilder<string, StorageColumn, unknown, Record<string, never>>,\n returnColumnMeta,\n operationRegistry,\n contractCapabilities,\n ) as AnyColumnBuilder & {\n _operationExpr?: OperationExpr;\n };\n return Object.freeze(resultWithOps);\n }\n\n return Object.freeze(baseResult);\n}\n\nexport function attachOperationsToColumnBuilder<\n ColumnName extends string,\n ColumnMeta extends StorageColumn,\n JsType = unknown,\n Operations extends OperationTypes = Record<string, never>,\n>(\n columnBuilder: ColumnBuilder<ColumnName, ColumnMeta, JsType, Record<string, never>>,\n columnMeta: ColumnMeta,\n registry: OperationRegistry | undefined,\n contractCapabilities?: Record<string, Record<string, boolean>>,\n): ColumnBuilder<ColumnName, ColumnMeta, JsType, Operations> {\n if (!registry) {\n return columnBuilder as ColumnBuilder<ColumnName, ColumnMeta, JsType, Operations>;\n }\n\n // Use codecId to look up operations registered for this column's type\n const codecId = columnMeta.codecId;\n if (!codecId) {\n return columnBuilder as ColumnBuilder<ColumnName, ColumnMeta, JsType, Operations>;\n }\n\n const operations = registry.byType(codecId) as SqlOperationSignature[];\n if (operations.length === 0) {\n return columnBuilder as ColumnBuilder<ColumnName, ColumnMeta, JsType, Operations>;\n }\n\n const builderWithOps = columnBuilder as unknown as ColumnBuilder<\n ColumnName,\n ColumnMeta,\n JsType,\n Operations\n >;\n\n for (const operation of operations) {\n if (operation.capabilities && operation.capabilities.length > 0) {\n if (!contractCapabilities) {\n continue;\n }\n\n if (!hasAllCapabilities(operation.capabilities, contractCapabilities)) {\n continue;\n }\n }\n // Method sugar: attach operation as a method on the column builder\n (builderWithOps as Record<string, unknown>)[operation.method] = function (\n this: ColumnBuilder<ColumnName, ColumnMeta, JsType, Record<string, never>>,\n ...args: unknown[]\n ) {\n return executeOperation(\n operation,\n this as unknown as ColumnBuilder<string, StorageColumn, unknown>,\n args,\n columnMeta,\n registry,\n contractCapabilities,\n );\n };\n }\n\n return builderWithOps;\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/schema.ts"],"sourcesContent":["import type { OperationRegistry } from '@prisma-next/operations';\nimport { planInvalid } from '@prisma-next/plan';\nimport type {\n ExtractCodecTypes,\n ExtractOperationTypes,\n SqlContract,\n SqlStorage,\n StorageColumn,\n} from '@prisma-next/sql-contract/types';\nimport type { BinaryOp, TableRef } from './ast/types';\nimport { attachOperationsToColumnBuilder } from './operations-registry';\nimport type { QueryLaneContext } from './query-lane-context';\nimport type {\n AnyColumnBuilderBase,\n BinaryBuilder,\n CodecTypes as CodecTypesType,\n ColumnBuilder,\n ComputeColumnJsType,\n OperationTypeSignature,\n OperationTypes,\n OrderBuilder,\n ParamPlaceholder,\n} from './types';\nimport { isColumnBuilder } from './types';\n\ntype TableColumns<Table extends { columns: Record<string, StorageColumn> }> = Table['columns'];\n\ntype ColumnBuilders<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> = {\n readonly [K in keyof Columns]: ColumnBuilder<\n K & string,\n Columns[K],\n ComputeColumnJsType<Contract, TableName, K & string, Columns[K], CodecTypes>,\n Operations\n >;\n};\n\nexport class ColumnBuilderImpl<\n ColumnName extends string,\n ColumnMeta extends StorageColumn,\n JsType = unknown,\n> {\n readonly kind = 'column' as const;\n\n constructor(\n readonly table: string,\n readonly column: ColumnName,\n private readonly storageColumn: ColumnMeta,\n ) {}\n\n get columnMeta(): ColumnMeta {\n return this.storageColumn;\n }\n\n // Type-level helper property (not used at runtime)\n get __jsType(): JsType {\n return undefined as unknown as JsType;\n }\n\n private createBinaryBuilder(\n op: BinaryOp,\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n if (value == null) {\n throw planInvalid('Parameter placeholder or column builder required for column comparison');\n }\n if (value.kind === 'param-placeholder' || isColumnBuilder(value)) {\n return Object.freeze({\n kind: 'binary' as const,\n op,\n left: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n right: value,\n }) as BinaryBuilder<ColumnName, ColumnMeta, JsType>;\n }\n throw planInvalid('Parameter placeholder or column builder required for column comparison');\n }\n\n eq(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('eq', value);\n }\n\n neq(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('neq', value);\n }\n\n gt(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('gt', value);\n }\n\n lt(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('lt', value);\n }\n\n gte(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('gte', value);\n }\n\n lte(\n value: ParamPlaceholder | AnyColumnBuilderBase,\n ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {\n return this.createBinaryBuilder('lte', value);\n }\n\n asc(): OrderBuilder<ColumnName, ColumnMeta, JsType> {\n return Object.freeze({\n kind: 'order' as const,\n expr: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n dir: 'asc' as const,\n }) as OrderBuilder<ColumnName, ColumnMeta, JsType>;\n }\n\n desc(): OrderBuilder<ColumnName, ColumnMeta, JsType> {\n return Object.freeze({\n kind: 'order' as const,\n expr: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,\n dir: 'desc' as const,\n }) as OrderBuilder<ColumnName, ColumnMeta, JsType>;\n }\n}\n\nexport class TableBuilderImpl<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> implements TableRef\n{\n readonly kind = 'table' as const;\n readonly columns: ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>;\n private readonly _name: TableName;\n\n constructor(\n name: TableName,\n columns: ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>,\n ) {\n this._name = name;\n this.columns = columns;\n }\n\n get name(): string {\n return this._name;\n }\n}\n\nfunction buildColumns<\n Contract extends SqlContract<SqlStorage>,\n TableName extends keyof Contract['storage']['tables'] & string,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n>(\n tableName: TableName,\n storage: SqlStorage,\n _contract: Contract,\n operationRegistry?: OperationRegistry,\n contractCapabilities?: Record<string, Record<string, boolean>>,\n): ColumnBuilders<\n Contract,\n TableName,\n Contract['storage']['tables'][TableName]['columns'],\n CodecTypes,\n Operations\n> {\n const table = storage.tables[tableName];\n\n if (!table) {\n throw planInvalid(`Unknown table ${tableName}`);\n }\n\n type Columns = Contract['storage']['tables'][TableName]['columns'];\n const tableColumns = table.columns as Columns;\n\n const result = {} as {\n [K in keyof Columns]: ColumnBuilder<\n K & string,\n Columns[K],\n ComputeColumnJsType<Contract, TableName, K & string, Columns[K], CodecTypes>,\n Operations\n >;\n };\n\n const assignColumn = <ColumnKey extends keyof Columns & string>(\n columnName: ColumnKey,\n columnDef: Columns[ColumnKey],\n ) => {\n type JsType = ComputeColumnJsType<\n Contract,\n TableName,\n ColumnKey,\n Columns[ColumnKey],\n CodecTypes\n >;\n\n const columnBuilder = new ColumnBuilderImpl<ColumnKey, Columns[ColumnKey], JsType>(\n tableName,\n columnName,\n columnDef,\n );\n\n const builderWithOps = attachOperationsToColumnBuilder<\n ColumnKey,\n Columns[ColumnKey],\n JsType,\n Operations\n >(\n columnBuilder as unknown as ColumnBuilder<\n ColumnKey,\n Columns[ColumnKey],\n JsType,\n Record<string, never>\n >,\n columnDef,\n operationRegistry,\n contractCapabilities,\n );\n\n (result as Record<string, unknown>)[columnName] = builderWithOps;\n };\n\n for (const columnName of Object.keys(tableColumns) as Array<keyof Columns & string>) {\n const columnDef = tableColumns[columnName];\n if (!columnDef) continue;\n assignColumn(columnName, columnDef);\n }\n\n return result as ColumnBuilders<Contract, TableName, Columns, CodecTypes, Operations>;\n}\n\n/**\n * Creates a Proxy that enables accessing table columns directly on the table object,\n * in addition to the standard `table.columns.columnName` syntax.\n *\n * This allows both access patterns:\n * - `tables.user.columns.id` (standard access)\n * - `tables.user.id` (convenience access via proxy)\n *\n * The proxy intercepts property access and routes column name lookups to\n * `table.columns[prop]`, while preserving direct access to table properties\n * like `name`, `kind`, and `columns`.\n */\nfunction createTableProxy<\n Contract extends SqlContract<SqlStorage>,\n TableName extends string,\n Columns extends Record<string, StorageColumn>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n>(\n table: TableBuilderImpl<Contract, TableName, Columns, CodecTypes, Operations>,\n): TableBuilderImpl<Contract, TableName, Columns, CodecTypes, Operations> {\n return new Proxy(table, {\n get(target, prop) {\n if (prop === 'name' || prop === 'kind' || prop === 'columns') {\n return Reflect.get(target, prop);\n }\n if (typeof prop === 'string' && prop in target.columns) {\n return target.columns[prop as keyof typeof target.columns];\n }\n return undefined;\n },\n });\n}\n\ntype ExtractSchemaTables<\n Contract extends SqlContract<SqlStorage>,\n CodecTypes extends CodecTypesType,\n Operations extends OperationTypes,\n> = {\n readonly [TableName in keyof Contract['storage']['tables']]: TableBuilderImpl<\n Contract,\n TableName & string,\n TableColumns<Contract['storage']['tables'][TableName]>,\n CodecTypes,\n Operations\n > &\n TableRef;\n};\n\nexport type SchemaHandle<\n Contract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>,\n CodecTypes extends CodecTypesType = CodecTypesType,\n Operations extends OperationTypes = Record<string, never>,\n> = {\n readonly tables: ExtractSchemaTables<Contract, CodecTypes, Operations>;\n};\n\ntype SchemaReturnType<Contract extends SqlContract<SqlStorage>> = SchemaHandle<\n Contract,\n ExtractCodecTypes<Contract>,\n ToOperationTypes<ExtractOperationTypes<Contract>>\n>;\n\ntype NormalizeOperationTypes<T> = {\n [TypeId in keyof T]: {\n [Method in keyof T[TypeId]]: T[TypeId][Method] extends OperationTypeSignature\n ? T[TypeId][Method]\n : OperationTypeSignature;\n };\n};\n\ntype ToOperationTypes<T> = T extends OperationTypes ? T : NormalizeOperationTypes<T>;\n\n/**\n * Creates a schema handle for building SQL queries.\n *\n * @param context - Query lane context containing contract, codec and operation registries\n * @returns A schema handle with typed table builders\n *\n * @example\n * ```typescript\n * const schemaHandle = schema<Contract>(context);\n * const userTable = schemaHandle.tables.user;\n * ```\n */\nexport function schema<Contract extends SqlContract<SqlStorage>>(\n context: QueryLaneContext<Contract>,\n): SchemaReturnType<Contract> {\n const contract = context.contract;\n const storage = contract.storage;\n type CodecTypes = ExtractCodecTypes<Contract>;\n type Operations = ToOperationTypes<ExtractOperationTypes<Contract>>;\n const tables = {} as ExtractSchemaTables<Contract, CodecTypes, Operations>;\n const contractCapabilities = contract.capabilities;\n\n const operationRegistry = context.operations;\n\n for (const tableName of Object.keys(storage.tables) as Array<\n keyof Contract['storage']['tables'] & string\n >) {\n const columns = buildColumns<Contract, typeof tableName, CodecTypes, Operations>(\n tableName,\n storage,\n contract,\n operationRegistry,\n contractCapabilities,\n );\n const table = new TableBuilderImpl<\n Contract,\n typeof tableName & string,\n Contract['storage']['tables'][typeof tableName]['columns'],\n CodecTypes,\n Operations\n >(tableName, columns);\n const proxiedTable = createTableProxy<\n Contract,\n typeof tableName & string,\n Contract['storage']['tables'][typeof tableName]['columns'],\n CodecTypes,\n Operations\n >(table);\n (tables as Record<string, unknown>)[tableName] = Object.freeze(\n proxiedTable,\n ) as ExtractSchemaTables<Contract, CodecTypes, Operations>[typeof tableName];\n }\n\n return Object.freeze({ tables }) as SchemaReturnType<Contract>;\n}\n\nexport type { ColumnBuilderImpl as Column, TableBuilderImpl as Table };\n"],"mappings":"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","names":[]}