@prisma-next/sql-relational-core 0.3.0-dev.10 → 0.3.0-dev.113

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 (188) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +18 -1
  3. package/dist/errors-BNiBIGfC.d.mts +2 -0
  4. package/dist/errors-DXSQwbhk.mjs +3 -0
  5. package/dist/exports/ast.d.mts +126 -0
  6. package/dist/exports/ast.d.mts.map +1 -0
  7. package/dist/exports/ast.mjs +253 -0
  8. package/dist/exports/ast.mjs.map +1 -0
  9. package/dist/exports/errors.d.mts +2 -0
  10. package/dist/exports/errors.mjs +3 -0
  11. package/dist/exports/guards.d.mts +5 -0
  12. package/dist/exports/guards.mjs +3 -0
  13. package/dist/exports/operations-registry.d.mts +5 -0
  14. package/dist/exports/operations-registry.mjs +3 -0
  15. package/dist/exports/param.d.mts +5 -0
  16. package/dist/exports/param.mjs +3 -0
  17. package/dist/exports/plan.d.mts +2 -0
  18. package/dist/exports/plan.mjs +17 -0
  19. package/dist/exports/plan.mjs.map +1 -0
  20. package/dist/exports/query-lane-context.d.mts +2 -0
  21. package/dist/exports/query-lane-context.mjs +1 -0
  22. package/dist/exports/query-operations.d.mts +2 -0
  23. package/dist/exports/query-operations.mjs +18 -0
  24. package/dist/exports/query-operations.mjs.map +1 -0
  25. package/dist/exports/schema.d.mts +5 -0
  26. package/dist/exports/schema.mjs +4 -0
  27. package/dist/exports/types.d.mts +4 -0
  28. package/dist/exports/types.mjs +3 -0
  29. package/dist/exports/utils/guards.d.mts +5 -0
  30. package/dist/exports/utils/guards.mjs +3 -0
  31. package/dist/guards-D1ax7TKN.mjs +57 -0
  32. package/dist/guards-D1ax7TKN.mjs.map +1 -0
  33. package/dist/guards-DC2Ll67p.d.mts +31 -0
  34. package/dist/guards-DC2Ll67p.d.mts.map +1 -0
  35. package/dist/index.d.mts +12 -0
  36. package/dist/index.mjs +13 -0
  37. package/dist/operations-registry-CBmGut8O.d.mts +9 -0
  38. package/dist/operations-registry-CBmGut8O.d.mts.map +1 -0
  39. package/dist/operations-registry-D8INFH9J.mjs +145 -0
  40. package/dist/operations-registry-D8INFH9J.mjs.map +1 -0
  41. package/dist/param-CFyhvphn.mjs +14 -0
  42. package/dist/param-CFyhvphn.mjs.map +1 -0
  43. package/dist/param-Cmdv_exJ.d.mts +8 -0
  44. package/dist/param-Cmdv_exJ.d.mts.map +1 -0
  45. package/dist/plan-BrZtMUA9.d.mts +517 -0
  46. package/dist/plan-BrZtMUA9.d.mts.map +1 -0
  47. package/dist/query-lane-context-BTtg0xm8.d.mts +278 -0
  48. package/dist/query-lane-context-BTtg0xm8.d.mts.map +1 -0
  49. package/dist/query-operation-registry-B6bClJs8.d.mts +27 -0
  50. package/dist/query-operation-registry-B6bClJs8.d.mts.map +1 -0
  51. package/dist/schema-XcyJSq4j.mjs +174 -0
  52. package/dist/schema-XcyJSq4j.mjs.map +1 -0
  53. package/dist/schema-j3Srik3R.d.mts +88 -0
  54. package/dist/schema-j3Srik3R.d.mts.map +1 -0
  55. package/dist/types-BZKzxgOb.mjs +18 -0
  56. package/dist/types-BZKzxgOb.mjs.map +1 -0
  57. package/dist/types-CMyotK6U.d.mts +443 -0
  58. package/dist/types-CMyotK6U.d.mts.map +1 -0
  59. package/dist/types-I6Hsg-GU.mjs +1102 -0
  60. package/dist/types-I6Hsg-GU.mjs.map +1 -0
  61. package/package.json +40 -56
  62. package/src/ast/codec-types.ts +123 -22
  63. package/src/ast/driver-types.ts +20 -3
  64. package/src/ast/join.ts +3 -23
  65. package/src/ast/sql-codecs.ts +81 -0
  66. package/src/ast/types.ts +1704 -74
  67. package/src/exports/ast.ts +1 -7
  68. package/src/exports/guards.ts +3 -4
  69. package/src/exports/query-operations.ts +1 -0
  70. package/src/exports/utils/guards.ts +1 -0
  71. package/src/operations-registry.ts +115 -89
  72. package/src/plan.ts +4 -4
  73. package/src/query-lane-context.ts +79 -1
  74. package/src/query-operation-registry.ts +35 -0
  75. package/src/schema.ts +104 -43
  76. package/src/types.ts +333 -84
  77. package/src/utils/guards.ts +44 -80
  78. package/dist/ast/adapter-types.d.ts +0 -28
  79. package/dist/ast/adapter-types.d.ts.map +0 -1
  80. package/dist/ast/codec-types.d.ts +0 -141
  81. package/dist/ast/codec-types.d.ts.map +0 -1
  82. package/dist/ast/common.d.ts +0 -7
  83. package/dist/ast/common.d.ts.map +0 -1
  84. package/dist/ast/delete.d.ts +0 -8
  85. package/dist/ast/delete.d.ts.map +0 -1
  86. package/dist/ast/driver-types.d.ts +0 -20
  87. package/dist/ast/driver-types.d.ts.map +0 -1
  88. package/dist/ast/insert.d.ts +0 -8
  89. package/dist/ast/insert.d.ts.map +0 -1
  90. package/dist/ast/join.d.ts +0 -6
  91. package/dist/ast/join.d.ts.map +0 -1
  92. package/dist/ast/order.d.ts +0 -6
  93. package/dist/ast/order.d.ts.map +0 -1
  94. package/dist/ast/predicate.d.ts +0 -4
  95. package/dist/ast/predicate.d.ts.map +0 -1
  96. package/dist/ast/select.d.ts +0 -18
  97. package/dist/ast/select.d.ts.map +0 -1
  98. package/dist/ast/types.d.ts +0 -118
  99. package/dist/ast/types.d.ts.map +0 -1
  100. package/dist/ast/update.d.ts +0 -9
  101. package/dist/ast/update.d.ts.map +0 -1
  102. package/dist/ast/util.d.ts +0 -2
  103. package/dist/ast/util.d.ts.map +0 -1
  104. package/dist/chunk-2F7DSEOU.js +0 -8
  105. package/dist/chunk-2F7DSEOU.js.map +0 -1
  106. package/dist/chunk-36WJWNHT.js +0 -1
  107. package/dist/chunk-36WJWNHT.js.map +0 -1
  108. package/dist/chunk-5N34PNVZ.js +0 -62
  109. package/dist/chunk-5N34PNVZ.js.map +0 -1
  110. package/dist/chunk-7I3EMQID.js +0 -16
  111. package/dist/chunk-7I3EMQID.js.map +0 -1
  112. package/dist/chunk-CBTYMOX2.js +0 -152
  113. package/dist/chunk-CBTYMOX2.js.map +0 -1
  114. package/dist/chunk-G52ENULI.js +0 -1
  115. package/dist/chunk-G52ENULI.js.map +0 -1
  116. package/dist/chunk-KYSP7L5C.js +0 -16
  117. package/dist/chunk-KYSP7L5C.js.map +0 -1
  118. package/dist/chunk-M23L3JHG.js +0 -159
  119. package/dist/chunk-M23L3JHG.js.map +0 -1
  120. package/dist/chunk-MM74SVJ4.js +0 -13
  121. package/dist/chunk-MM74SVJ4.js.map +0 -1
  122. package/dist/chunk-U7AXAUJA.js +0 -1
  123. package/dist/chunk-U7AXAUJA.js.map +0 -1
  124. package/dist/chunk-WZBPVEZI.js +0 -320
  125. package/dist/chunk-WZBPVEZI.js.map +0 -1
  126. package/dist/errors.d.ts +0 -2
  127. package/dist/errors.d.ts.map +0 -1
  128. package/dist/exports/ast.d.ts +0 -14
  129. package/dist/exports/ast.d.ts.map +0 -1
  130. package/dist/exports/ast.js +0 -46
  131. package/dist/exports/ast.js.map +0 -1
  132. package/dist/exports/errors.d.ts +0 -2
  133. package/dist/exports/errors.d.ts.map +0 -1
  134. package/dist/exports/errors.js +0 -9
  135. package/dist/exports/errors.js.map +0 -1
  136. package/dist/exports/guards.d.ts +0 -2
  137. package/dist/exports/guards.d.ts.map +0 -1
  138. package/dist/exports/guards.js +0 -21
  139. package/dist/exports/guards.js.map +0 -1
  140. package/dist/exports/operations-registry.d.ts +0 -2
  141. package/dist/exports/operations-registry.d.ts.map +0 -1
  142. package/dist/exports/operations-registry.js +0 -9
  143. package/dist/exports/operations-registry.js.map +0 -1
  144. package/dist/exports/param.d.ts +0 -3
  145. package/dist/exports/param.d.ts.map +0 -1
  146. package/dist/exports/param.js +0 -7
  147. package/dist/exports/param.js.map +0 -1
  148. package/dist/exports/plan.d.ts +0 -2
  149. package/dist/exports/plan.d.ts.map +0 -1
  150. package/dist/exports/plan.js +0 -7
  151. package/dist/exports/plan.js.map +0 -1
  152. package/dist/exports/query-lane-context.d.ts +0 -2
  153. package/dist/exports/query-lane-context.d.ts.map +0 -1
  154. package/dist/exports/query-lane-context.js +0 -2
  155. package/dist/exports/query-lane-context.js.map +0 -1
  156. package/dist/exports/schema.d.ts +0 -3
  157. package/dist/exports/schema.d.ts.map +0 -1
  158. package/dist/exports/schema.js +0 -14
  159. package/dist/exports/schema.js.map +0 -1
  160. package/dist/exports/types.d.ts +0 -2
  161. package/dist/exports/types.d.ts.map +0 -1
  162. package/dist/exports/types.js +0 -10
  163. package/dist/exports/types.js.map +0 -1
  164. package/dist/index.d.ts +0 -9
  165. package/dist/index.d.ts.map +0 -1
  166. package/dist/index.js +0 -81
  167. package/dist/index.js.map +0 -1
  168. package/dist/operations-registry.d.ts +0 -5
  169. package/dist/operations-registry.d.ts.map +0 -1
  170. package/dist/param.d.ts +0 -4
  171. package/dist/param.d.ts.map +0 -1
  172. package/dist/plan.d.ts +0 -23
  173. package/dist/plan.d.ts.map +0 -1
  174. package/dist/query-lane-context.d.ts +0 -16
  175. package/dist/query-lane-context.d.ts.map +0 -1
  176. package/dist/schema.d.ts +0 -63
  177. package/dist/schema.d.ts.map +0 -1
  178. package/dist/types.d.ts +0 -332
  179. package/dist/types.d.ts.map +0 -1
  180. package/dist/utils/guards.d.ts +0 -55
  181. package/dist/utils/guards.d.ts.map +0 -1
  182. package/src/ast/common.ts +0 -36
  183. package/src/ast/delete.ts +0 -17
  184. package/src/ast/insert.ts +0 -17
  185. package/src/ast/order.ts +0 -11
  186. package/src/ast/predicate.ts +0 -30
  187. package/src/ast/select.ts +0 -39
  188. package/src/ast/update.ts +0 -19
package/src/schema.ts CHANGED
@@ -1,27 +1,27 @@
1
1
  import type { OperationRegistry } from '@prisma-next/operations';
2
2
  import { planInvalid } from '@prisma-next/plan';
3
3
  import type {
4
- ExtractCodecTypes,
5
- ExtractOperationTypes,
4
+ ExtractTypeMapsFromContract,
5
+ ResolveCodecTypes,
6
+ ResolveOperationTypes,
6
7
  SqlContract,
7
8
  SqlStorage,
8
9
  StorageColumn,
9
10
  } from '@prisma-next/sql-contract/types';
10
- import type { BinaryOp, TableRef } from './ast/types';
11
+ import { type BinaryOp, ColumnRef, type ExpressionSource, type TableRef } from './ast/types';
11
12
  import { attachOperationsToColumnBuilder } from './operations-registry';
12
- import type { QueryLaneContext } from './query-lane-context';
13
+ import type { ExecutionContext } from './query-lane-context';
13
14
  import type {
14
- AnyColumnBuilderBase,
15
15
  BinaryBuilder,
16
16
  CodecTypes as CodecTypesType,
17
17
  ColumnBuilder,
18
18
  ComputeColumnJsType,
19
+ NullCheckBuilder,
19
20
  OperationTypeSignature,
20
21
  OperationTypes,
21
22
  OrderBuilder,
22
23
  ParamPlaceholder,
23
24
  } from './types';
24
- import { isColumnBuilder } from './types';
25
25
 
26
26
  type TableColumns<Table extends { columns: Record<string, StorageColumn> }> = Table['columns'];
27
27
 
@@ -44,7 +44,8 @@ export class ColumnBuilderImpl<
44
44
  ColumnName extends string,
45
45
  ColumnMeta extends StorageColumn,
46
46
  JsType = unknown,
47
- > {
47
+ > implements ExpressionSource
48
+ {
48
49
  readonly kind = 'column' as const;
49
50
 
50
51
  constructor(
@@ -62,64 +63,72 @@ export class ColumnBuilderImpl<
62
63
  return undefined as unknown as JsType;
63
64
  }
64
65
 
66
+ /**
67
+ * Converts this column builder to a ColumnRef expression.
68
+ * This is the canonical way to get an AST node from a builder.
69
+ */
70
+ toExpr(): ColumnRef {
71
+ return new ColumnRef(this.table, this.column);
72
+ }
73
+
65
74
  private createBinaryBuilder(
66
75
  op: BinaryOp,
67
- value: ParamPlaceholder | AnyColumnBuilderBase,
76
+ value: ParamPlaceholder | ExpressionSource,
68
77
  ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
69
78
  if (value == null) {
70
- throw planInvalid('Parameter placeholder or column builder required for column comparison');
79
+ throw planInvalid(
80
+ 'Parameter placeholder or expression source required for column comparison',
81
+ );
71
82
  }
72
- if (value.kind === 'param-placeholder' || isColumnBuilder(value)) {
83
+ // Check for ExpressionSource first (has toExpr method)
84
+ if ('toExpr' in value && typeof value.toExpr === 'function') {
73
85
  return Object.freeze({
74
86
  kind: 'binary' as const,
75
87
  op,
76
- left: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,
88
+ left: this.toExpr(),
77
89
  right: value,
78
90
  }) as BinaryBuilder<ColumnName, ColumnMeta, JsType>;
79
91
  }
80
- throw planInvalid('Parameter placeholder or column builder required for column comparison');
92
+ // Must be a ParamPlaceholder
93
+ if ('kind' in value && value.kind === 'param-placeholder') {
94
+ return Object.freeze({
95
+ kind: 'binary' as const,
96
+ op,
97
+ left: this.toExpr(),
98
+ right: value,
99
+ }) as BinaryBuilder<ColumnName, ColumnMeta, JsType>;
100
+ }
101
+ throw planInvalid('Parameter placeholder or expression source required for column comparison');
81
102
  }
82
103
 
83
- eq(
84
- value: ParamPlaceholder | AnyColumnBuilderBase,
85
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
104
+ eq(value: ParamPlaceholder | ExpressionSource): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
86
105
  return this.createBinaryBuilder('eq', value);
87
106
  }
88
107
 
89
- neq(
90
- value: ParamPlaceholder | AnyColumnBuilderBase,
91
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
108
+ neq(value: ParamPlaceholder | ExpressionSource): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
92
109
  return this.createBinaryBuilder('neq', value);
93
110
  }
94
111
 
95
- gt(
96
- value: ParamPlaceholder | AnyColumnBuilderBase,
97
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
112
+ gt(value: ParamPlaceholder | ExpressionSource): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
98
113
  return this.createBinaryBuilder('gt', value);
99
114
  }
100
115
 
101
- lt(
102
- value: ParamPlaceholder | AnyColumnBuilderBase,
103
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
116
+ lt(value: ParamPlaceholder | ExpressionSource): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
104
117
  return this.createBinaryBuilder('lt', value);
105
118
  }
106
119
 
107
- gte(
108
- value: ParamPlaceholder | AnyColumnBuilderBase,
109
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
120
+ gte(value: ParamPlaceholder | ExpressionSource): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
110
121
  return this.createBinaryBuilder('gte', value);
111
122
  }
112
123
 
113
- lte(
114
- value: ParamPlaceholder | AnyColumnBuilderBase,
115
- ): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
124
+ lte(value: ParamPlaceholder | ExpressionSource): BinaryBuilder<ColumnName, ColumnMeta, JsType> {
116
125
  return this.createBinaryBuilder('lte', value);
117
126
  }
118
127
 
119
128
  asc(): OrderBuilder<ColumnName, ColumnMeta, JsType> {
120
129
  return Object.freeze({
121
130
  kind: 'order' as const,
122
- expr: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,
131
+ expr: this.toExpr(),
123
132
  dir: 'asc' as const,
124
133
  }) as OrderBuilder<ColumnName, ColumnMeta, JsType>;
125
134
  }
@@ -127,10 +136,34 @@ export class ColumnBuilderImpl<
127
136
  desc(): OrderBuilder<ColumnName, ColumnMeta, JsType> {
128
137
  return Object.freeze({
129
138
  kind: 'order' as const,
130
- expr: this as unknown as ColumnBuilder<ColumnName, ColumnMeta, JsType>,
139
+ expr: this.toExpr(),
131
140
  dir: 'desc' as const,
132
141
  }) as OrderBuilder<ColumnName, ColumnMeta, JsType>;
133
142
  }
143
+
144
+ /**
145
+ * Creates an IS NULL check for this column.
146
+ * Available on all columns at runtime, but typed to only be visible on nullable columns.
147
+ */
148
+ isNull(): NullCheckBuilder<ColumnName, ColumnMeta, JsType> {
149
+ return Object.freeze({
150
+ kind: 'nullCheck' as const,
151
+ expr: this.toExpr(),
152
+ isNull: true,
153
+ }) as NullCheckBuilder<ColumnName, ColumnMeta, JsType>;
154
+ }
155
+
156
+ /**
157
+ * Creates an IS NOT NULL check for this column.
158
+ * Available on all columns at runtime, but typed to only be visible on nullable columns.
159
+ */
160
+ isNotNull(): NullCheckBuilder<ColumnName, ColumnMeta, JsType> {
161
+ return Object.freeze({
162
+ kind: 'nullCheck' as const,
163
+ expr: this.toExpr(),
164
+ isNull: false,
165
+ }) as NullCheckBuilder<ColumnName, ColumnMeta, JsType>;
166
+ }
134
167
  }
135
168
 
136
169
  export class TableBuilderImpl<
@@ -290,18 +323,39 @@ type ExtractSchemaTables<
290
323
  TableRef;
291
324
  };
292
325
 
326
+ /**
327
+ * Extracts the types registry shape from a contract.
328
+ * Each key is a type name from storage.types, and the value preserves the
329
+ * literal type from the contract (including codecId, nativeType, and typeParams).
330
+ * Returns an empty object type {} when storage.types is undefined.
331
+ */
332
+ type ExtractSchemaTypes<Contract extends SqlContract<SqlStorage>> =
333
+ Contract['storage']['types'] extends infer Types
334
+ ? Types extends Record<string, unknown>
335
+ ? { readonly [TypeName in keyof Types]: Types[TypeName] }
336
+ : Record<string, never>
337
+ : Record<string, never>;
338
+
293
339
  export type SchemaHandle<
294
340
  Contract extends SqlContract<SqlStorage> = SqlContract<SqlStorage>,
295
341
  CodecTypes extends CodecTypesType = CodecTypesType,
296
342
  Operations extends OperationTypes = Record<string, never>,
297
343
  > = {
298
344
  readonly tables: ExtractSchemaTables<Contract, CodecTypes, Operations>;
345
+ /**
346
+ * Initialized type helpers from storage.types.
347
+ * Each entry corresponds to a named type instance in the contract's storage.types.
348
+ */
349
+ readonly types: ExtractSchemaTypes<Contract>;
299
350
  };
300
351
 
301
- type SchemaReturnType<Contract extends SqlContract<SqlStorage>> = SchemaHandle<
352
+ type SchemaReturnType<
353
+ Contract extends SqlContract<SqlStorage>,
354
+ TTypeMaps = ExtractTypeMapsFromContract<Contract>,
355
+ > = SchemaHandle<
302
356
  Contract,
303
- ExtractCodecTypes<Contract>,
304
- ToOperationTypes<ExtractOperationTypes<Contract>>
357
+ ResolveCodecTypes<Contract, TTypeMaps>,
358
+ ToOperationTypes<ResolveOperationTypes<Contract, TTypeMaps>>
305
359
  >;
306
360
 
307
361
  type NormalizeOperationTypes<T> = {
@@ -318,21 +372,25 @@ type ToOperationTypes<T> = T extends OperationTypes ? T : NormalizeOperationType
318
372
  * Creates a schema handle for building SQL queries.
319
373
  *
320
374
  * @param context - Query lane context containing contract, codec and operation registries
321
- * @returns A schema handle with typed table builders
375
+ * @returns A schema handle with typed table builders and type helpers
322
376
  *
323
377
  * @example
324
378
  * ```typescript
379
+ * // No-emit: infers TypeMaps from ContractWithTypeMaps
325
380
  * const schemaHandle = schema<Contract>(context);
326
- * const userTable = schemaHandle.tables.user;
381
+ *
382
+ * // Emitted: pass TypeMaps explicitly
383
+ * const schemaHandle = schema<Contract, TypeMaps>(context);
327
384
  * ```
328
385
  */
329
- export function schema<Contract extends SqlContract<SqlStorage>>(
330
- context: QueryLaneContext<Contract>,
331
- ): SchemaReturnType<Contract> {
386
+ export function schema<
387
+ Contract extends SqlContract<SqlStorage>,
388
+ TTypeMaps = ExtractTypeMapsFromContract<Contract>,
389
+ >(context: ExecutionContext<Contract>): SchemaReturnType<Contract, TTypeMaps> {
332
390
  const contract = context.contract;
333
391
  const storage = contract.storage;
334
- type CodecTypes = ExtractCodecTypes<Contract>;
335
- type Operations = ToOperationTypes<ExtractOperationTypes<Contract>>;
392
+ type CodecTypes = ResolveCodecTypes<Contract, TTypeMaps>;
393
+ type Operations = ToOperationTypes<ResolveOperationTypes<Contract, TTypeMaps>>;
336
394
  const tables = {} as ExtractSchemaTables<Contract, CodecTypes, Operations>;
337
395
  const contractCapabilities = contract.capabilities;
338
396
 
@@ -367,7 +425,10 @@ export function schema<Contract extends SqlContract<SqlStorage>>(
367
425
  ) as ExtractSchemaTables<Contract, CodecTypes, Operations>[typeof tableName];
368
426
  }
369
427
 
370
- return Object.freeze({ tables }) as SchemaReturnType<Contract>;
428
+ // Get type helpers from context (populated by runtime context creation)
429
+ const types = context.types as ExtractSchemaTypes<Contract>;
430
+
431
+ return Object.freeze({ tables, types }) as SchemaReturnType<Contract, TTypeMaps>;
371
432
  }
372
433
 
373
434
  export type { ColumnBuilderImpl as Column, TableBuilderImpl as Table };