@prisma-next/sql-relational-core 0.13.0-dev.4 → 0.13.0-dev.40

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 (53) hide show
  1. package/dist/{ddl-types-D3vlEjMA.d.mts → ddl-types-BVO002FS.d.mts} +6 -2
  2. package/dist/ddl-types-BVO002FS.d.mts.map +1 -0
  3. package/dist/{ddl-types-X9_XHUl0.mjs → ddl-types-DAox2c8w.mjs} +4 -1
  4. package/dist/ddl-types-DAox2c8w.mjs.map +1 -0
  5. package/dist/{errors-CPLfzKkw.d.mts → errors-BbatEYjA.d.mts} +2 -2
  6. package/dist/{errors-CPLfzKkw.d.mts.map → errors-BbatEYjA.d.mts.map} +1 -1
  7. package/dist/exports/ast.d.mts +11 -3
  8. package/dist/exports/ast.d.mts.map +1 -1
  9. package/dist/exports/ast.mjs +3 -3
  10. package/dist/exports/codec-descriptor-registry.d.mts.map +1 -1
  11. package/dist/exports/codec-descriptor-registry.mjs +2 -13
  12. package/dist/exports/codec-descriptor-registry.mjs.map +1 -1
  13. package/dist/exports/contract-free.d.mts +60 -3
  14. package/dist/exports/contract-free.d.mts.map +1 -1
  15. package/dist/exports/contract-free.mjs +123 -3
  16. package/dist/exports/contract-free.mjs.map +1 -1
  17. package/dist/exports/errors.d.mts +1 -1
  18. package/dist/exports/expression.d.mts +1 -1
  19. package/dist/exports/expression.mjs +1 -1
  20. package/dist/exports/middleware.d.mts +1 -1
  21. package/dist/exports/plan.d.mts +2 -2
  22. package/dist/exports/types.d.mts +3 -3
  23. package/dist/index.d.mts +9 -9
  24. package/dist/index.mjs +3 -3
  25. package/dist/{middleware-BXSFukKU.d.mts → middleware-Dyyo4IP1.d.mts} +2 -2
  26. package/dist/{middleware-BXSFukKU.d.mts.map → middleware-Dyyo4IP1.d.mts.map} +1 -1
  27. package/dist/{plan-DObuWSWi.d.mts → plan-DUjdGLY3.d.mts} +2 -2
  28. package/dist/{plan-DObuWSWi.d.mts.map → plan-DUjdGLY3.d.mts.map} +1 -1
  29. package/dist/{sql-execution-plan-JwVeAzXt.d.mts → sql-execution-plan-DjMEAjKK.d.mts} +2 -2
  30. package/dist/{sql-execution-plan-JwVeAzXt.d.mts.map → sql-execution-plan-DjMEAjKK.d.mts.map} +1 -1
  31. package/dist/types-BQ_zfC-S.d.mts +233 -0
  32. package/dist/types-BQ_zfC-S.d.mts.map +1 -0
  33. package/dist/{types-LGikJRYV.d.mts → types-CUHnDsdV.d.mts} +3 -3
  34. package/dist/{types-LGikJRYV.d.mts.map → types-CUHnDsdV.d.mts.map} +1 -1
  35. package/dist/{types-BbGUx5Bi.d.mts → types-DQrmgP8Y.d.mts} +17 -5
  36. package/dist/{types-BbGUx5Bi.d.mts.map → types-DQrmgP8Y.d.mts.map} +1 -1
  37. package/dist/{types-D72v8s92.mjs → types-lJUc6cY-.mjs} +78 -18
  38. package/dist/types-lJUc6cY-.mjs.map +1 -0
  39. package/package.json +11 -11
  40. package/src/ast/ddl-types.ts +5 -0
  41. package/src/ast/driver-types.ts +8 -0
  42. package/src/ast/types.ts +98 -19
  43. package/src/codec-ref-for-column.ts +2 -35
  44. package/src/contract-free/column.ts +2 -0
  45. package/src/contract-free/dml.ts +5 -0
  46. package/src/contract-free/table.ts +191 -1
  47. package/src/exports/contract-free.ts +5 -0
  48. package/src/types.ts +134 -22
  49. package/dist/ddl-types-D3vlEjMA.d.mts.map +0 -1
  50. package/dist/ddl-types-X9_XHUl0.mjs.map +0 -1
  51. package/dist/types-CQVke4QO.d.mts +0 -181
  52. package/dist/types-CQVke4QO.d.mts.map +0 -1
  53. package/dist/types-D72v8s92.mjs.map +0 -1
package/src/types.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Contract, ContractModelDefinitions } from '@prisma-next/contract/types';
1
+ import type { Contract } from '@prisma-next/contract/types';
2
2
  import type { ParamSpec } from '@prisma-next/operations';
3
3
  import type {
4
4
  ExtractFieldOutputTypes,
@@ -13,11 +13,45 @@ import type { SqlExecutionPlan } from './sql-execution-plan';
13
13
  export type Expr = ColumnRef | ParamRef;
14
14
 
15
15
  /**
16
- * Extracts the model name for a given table by iterating models to find the one
17
- * whose `storage.table` matches.
16
+ * The minimal contract shape the per-namespace column resolver needs: the
17
+ * application-domain models and the storage tables, both keyed by namespace
18
+ * coordinate, plus (via the optional TypeMaps phantom key, read structurally by
19
+ * {@link ExtractFieldOutputTypes}) the refined field-output map. Every emitted
20
+ * `Contract<SqlStorage>` satisfies it, as does `sql-builder`'s `TableProxyContract`
21
+ * — so the resolver indexes the coordinate directly without forcing callers to
22
+ * carry the full `Contract`.
18
23
  */
19
- type ExtractTableToModel<TContract extends Contract<SqlStorage>, TableName extends string> =
20
- ContractModelDefinitions<TContract> extends infer Models extends Record<string, unknown>
24
+ export type ColumnResolutionContract = {
25
+ readonly domain: {
26
+ readonly namespaces: Readonly<
27
+ Record<string, { readonly models: Readonly<Record<string, unknown>> }>
28
+ >;
29
+ };
30
+ readonly storage: {
31
+ readonly namespaces: Readonly<
32
+ Record<
33
+ string,
34
+ { readonly entries: Readonly<Record<string, Readonly<Record<string, unknown>>>> }
35
+ >
36
+ >;
37
+ };
38
+ };
39
+
40
+ type NamespaceModels<
41
+ TContract extends ColumnResolutionContract,
42
+ NsId extends string,
43
+ > = TContract['domain']['namespaces'][NsId] extends {
44
+ readonly models: infer Models extends Record<string, unknown>;
45
+ }
46
+ ? Models
47
+ : never;
48
+
49
+ type ExtractTableToModel<
50
+ TContract extends ColumnResolutionContract,
51
+ NsId extends string,
52
+ TableName extends string,
53
+ > =
54
+ NamespaceModels<TContract, NsId> extends infer Models extends Record<string, unknown>
21
55
  ? {
22
56
  [M in keyof Models & string]: Models[M] extends {
23
57
  readonly storage: { readonly table: TableName };
@@ -27,17 +61,14 @@ type ExtractTableToModel<TContract extends Contract<SqlStorage>, TableName exten
27
61
  }[keyof Models & string]
28
62
  : never;
29
63
 
30
- /**
31
- * Extracts the field name for a given column by finding the field in
32
- * `model.storage.fields` whose `column` matches.
33
- */
34
64
  type ExtractColumnToField<
35
- TContract extends Contract<SqlStorage>,
65
+ TContract extends ColumnResolutionContract,
66
+ NsId extends string,
36
67
  TableName extends string,
37
68
  ColumnName extends string,
38
69
  > =
39
- ExtractTableToModel<TContract, TableName> extends infer ModelName extends string
40
- ? ContractModelDefinitions<TContract> extends infer Models extends Record<string, unknown>
70
+ ExtractTableToModel<TContract, NsId, TableName> extends infer ModelName extends string
71
+ ? NamespaceModels<TContract, NsId> extends infer Models extends Record<string, unknown>
41
72
  ? ModelName & keyof Models extends infer MKey extends string
42
73
  ? Models[MKey] extends {
43
74
  readonly storage: { readonly fields: infer Fields extends Record<string, unknown> };
@@ -52,6 +83,28 @@ type ExtractColumnToField<
52
83
  : never
53
84
  : never;
54
85
 
86
+ /** Resolves to `never` when the table or column is absent in the namespace. */
87
+ type NamespaceStorageColumn<
88
+ TContract extends ColumnResolutionContract,
89
+ NsId extends string,
90
+ TableName extends string,
91
+ ColumnName extends string,
92
+ > = TContract['storage']['namespaces'][NsId] extends {
93
+ readonly entries: { readonly table: infer Tables extends Record<string, unknown> };
94
+ }
95
+ ? TableName extends keyof Tables
96
+ ? Tables[TableName] extends {
97
+ readonly columns: infer Columns extends Record<string, unknown>;
98
+ }
99
+ ? ColumnName extends keyof Columns
100
+ ? Columns[ColumnName] extends StorageColumn
101
+ ? Columns[ColumnName]
102
+ : never
103
+ : never
104
+ : never
105
+ : never
106
+ : never;
107
+
55
108
  type FallbackCodecLookup<
56
109
  ColumnMeta extends StorageColumn,
57
110
  CodecTypes extends Record<string, { readonly output: unknown }>,
@@ -65,6 +118,53 @@ type FallbackCodecLookup<
65
118
  : unknown
66
119
  : unknown;
67
120
 
121
+ /**
122
+ * The refined (typeParam-applied) JS output type for a field within a namespace
123
+ * coordinate, read from the emitter's namespace-nested `FieldOutputTypes` map at
124
+ * `FieldOutputTypes[NsId][Model][Field]`. This preserves parameterized codec
125
+ * refinements (e.g. `Vector<N>`, `Char<N>`) that a bare codec-output lookup
126
+ * would drop. Resolves to `never` when the coordinate is absent from the map.
127
+ */
128
+ type NamespaceFieldOutput<
129
+ TContract extends ColumnResolutionContract,
130
+ NsId extends string,
131
+ ModelName extends string,
132
+ FieldName extends string,
133
+ > =
134
+ ExtractFieldOutputTypes<TContract> extends infer Outputs
135
+ ? NsId extends keyof Outputs
136
+ ? Outputs[NsId] extends infer NamespaceOutputs
137
+ ? ModelName extends keyof NamespaceOutputs
138
+ ? NamespaceOutputs[ModelName] extends infer ModelOutputs
139
+ ? FieldName extends keyof ModelOutputs
140
+ ? ModelOutputs[FieldName]
141
+ : never
142
+ : never
143
+ : never
144
+ : never
145
+ : never
146
+ : never;
147
+
148
+ /**
149
+ * The secondary resolution path, taken for a storage column not backed by a
150
+ * domain model field in the namespace (e.g. a column with no corresponding
151
+ * field); refined model fields resolve via {@link NamespaceFieldOutput}.
152
+ */
153
+ type ColumnCodecFallback<
154
+ TContract extends ColumnResolutionContract,
155
+ NsId extends string,
156
+ TableName extends string,
157
+ ColumnName extends string,
158
+ CodecTypes extends Record<string, { readonly output: unknown }>,
159
+ > =
160
+ NamespaceStorageColumn<TContract, NsId, TableName, ColumnName> extends infer ColumnMeta
161
+ ? [ColumnMeta] extends [never]
162
+ ? never
163
+ : ColumnMeta extends StorageColumn
164
+ ? FallbackCodecLookup<ColumnMeta, CodecTypes>
165
+ : never
166
+ : never;
167
+
68
168
  /**
69
169
  * Type-level operation signature.
70
170
  * Represents an operation at the type level for use in contract type maps.
@@ -126,25 +226,37 @@ export type OperationsForTypeId<TypeId extends string, Operations extends Operat
126
226
  ? Operations[TypeId]
127
227
  : Record<string, never>;
128
228
 
229
+ /**
230
+ * Resolves the JavaScript output type of a column addressed by an explicit
231
+ * namespace coordinate.
232
+ *
233
+ * The table→model and column→field mapping is resolved per-namespace from
234
+ * `domain.namespaces[NsId]['models']`, and the refined output type from the
235
+ * emitter's namespace-nested `FieldOutputTypes[NsId][Model][Field]` — so a bare
236
+ * table name shared across namespaces resolves to each namespace's own field,
237
+ * and parameterized codec refinements (e.g. `Vector<N>`) are preserved. A
238
+ * storage column not backed by a model field in the namespace falls back to a
239
+ * codec-output lookup; a column absent in the namespace resolves to `never`.
240
+ */
129
241
  export type ComputeColumnJsType<
130
- TContract extends Contract<SqlStorage>,
242
+ TContract extends ColumnResolutionContract,
243
+ NsId extends string,
131
244
  TableName extends string,
132
245
  ColumnName extends string,
133
- ColumnMeta extends StorageColumn,
134
246
  CodecTypes extends Record<string, { readonly output: unknown }>,
135
247
  > =
136
- ExtractTableToModel<TContract, TableName> extends infer ModelName
248
+ ExtractTableToModel<TContract, NsId, TableName> extends infer ModelName
137
249
  ? [ModelName] extends [never]
138
- ? FallbackCodecLookup<ColumnMeta, CodecTypes>
250
+ ? ColumnCodecFallback<TContract, NsId, TableName, ColumnName, CodecTypes>
139
251
  : ModelName extends string
140
- ? ExtractColumnToField<TContract, TableName, ColumnName> extends infer FieldName
252
+ ? ExtractColumnToField<TContract, NsId, TableName, ColumnName> extends infer FieldName
141
253
  ? [FieldName] extends [never]
142
- ? FallbackCodecLookup<ColumnMeta, CodecTypes>
254
+ ? ColumnCodecFallback<TContract, NsId, TableName, ColumnName, CodecTypes>
143
255
  : FieldName extends string
144
- ? ModelName extends keyof ExtractFieldOutputTypes<TContract>
145
- ? FieldName extends keyof ExtractFieldOutputTypes<TContract>[ModelName]
146
- ? ExtractFieldOutputTypes<TContract>[ModelName][FieldName]
147
- : never
256
+ ? NamespaceFieldOutput<TContract, NsId, ModelName, FieldName> extends infer Out
257
+ ? [Out] extends [never]
258
+ ? ColumnCodecFallback<TContract, NsId, TableName, ColumnName, CodecTypes>
259
+ : Out
148
260
  : never
149
261
  : never
150
262
  : never
@@ -1 +0,0 @@
1
- {"version":3,"file":"ddl-types-D3vlEjMA.d.mts","names":[],"sources":["../src/ast/ddl-types.ts"],"mappings":";;;;;;;AAcA;;;;AACqB;AAGrB;;UAJiB,sBAAA;EAAA,SACN,UAAU;AAAA;AAAA,UAGJ,uBAAA;EACf,OAAA,CAAQ,IAAA,EAAM,oBAAA,EAAsB,GAAA,EAAK,sBAAA,GAAyB,CAAA;EAClE,QAAA,CAAS,IAAA,EAAM,qBAAA,EAAuB,GAAA,EAAK,sBAAA,GAAyB,CAAA;AAAA;AAAA,uBAGhD,gBAAA;EAAA,kBACF,IAAA;EAAA,SACT,MAAA,IAAU,OAAA,EAAS,uBAAA,CAAwB,CAAA,GAAI,GAAA,EAAK,sBAAA,GAAyB,CAAA;EAAA,UAE5E,MAAA;AAAA;AAAA,cAKC,oBAAA,SAA6B,gBAAA;EAAA,SAC/B,IAAA;EAAA,SACA,KAAA,EAAO,8BAAA;cAEJ,KAAA,EAAO,8BAAA;EASV,MAAA,IAAU,OAAA,EAAS,uBAAA,CAAwB,CAAA,GAAI,GAAA,EAAK,sBAAA,GAAyB,CAAA;AAAA;AAAA,cAK3E,qBAAA,SAA8B,gBAAA;EAAA,SAChC,IAAA;EAAA,SACA,UAAA;cAEG,UAAA;EAMH,MAAA,IAAU,OAAA,EAAS,uBAAA,CAAwB,CAAA,GAAI,GAAA,EAAK,sBAAA,GAAyB,CAAA;AAAA;AAAA,KAK5E,mBAAA,GAAsB,oBAAA,GAAuB,qBAAqB;AAAA,cAEjE,SAAA;EAAA,SACF,IAAA;EAAA,SACA,IAAA;EAAA,SACA,OAAA;EAAA,SACA,UAAA;EAAA,SACA,OAAA,GAAU,mBAAA;cAEP,OAAA;IAAA,SACD,IAAA;IAAA,SACA,IAAA;IAAA,SACA,OAAA;IAAA,SACA,UAAA;IAAA,SACA,OAAA,GAAU,mBAAmB;EAAA;AAAA;AAAA,uBAWpB,OAAA;EAAA,kBACF,IAAA;EAlEoE;;;AAEtE;AAKlB;;EAmEE,SAAA;EAAA,UAIU,MAAA;EAIV,gBAAA,IAAoB,WAAW;AAAA;AAAA,iBAKjB,SAAA,CAAU,KAAA,YAAiB,KAAA,IAAS,OAAO;;;;;;;;cAoB9C,oBAAA;EAAA,SACF,IAAA;EAAA,SACA,OAAA,EAAS,aAAa;EAAA,SACtB,IAAA;cAEG,OAAA;IAAA,SAAoB,OAAA;IAAA,SAAqC,IAAA;EAAA;AAAA;;;;;;AA5FkB;AAKzF;cAqGa,oBAAA;EAAA,SACF,IAAA;EAAA,SACA,OAAA,EAAS,aAAA;EAAA,SACT,QAAA;EAAA,SACA,UAAA,EAAY,aAAA;EAAA,SACZ,QAAA,EAAU,iBAAA;EAAA,SACV,QAAA,EAAU,iBAAA;EAAA,SACV,IAAA;cAEG,OAAA;IAAA,SACD,OAAA;IAAA,SACA,QAAA;IAAA,SACA,UAAA;IAAA,SACA,QAAA,GAAW,iBAAA;IAAA,SACX,QAAA,GAAW,iBAAA;IAAA,SACX,IAAA;EAAA;AAAA;;;;;;;AA1G4E;cA6H5E,gBAAA;EAAA,SACF,IAAA;EAAA,SACA,OAAA,EAAS,aAAa;EAAA,SACtB,IAAA;cAEG,OAAA;IAAA,SAAoB,OAAA;IAAA,SAAqC,IAAA;EAAA;AAAA;AAAA,KAO3D,kBAAA,GAAqB,oBAAA,GAAuB,oBAAA,GAAuB,gBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ddl-types-X9_XHUl0.mjs","names":[],"sources":["../src/ast/ddl-types.ts"],"sourcesContent":["import type { ColumnDefaultLiteralInputValue } from '@prisma-next/contract/types';\nimport { isColumnDefaultLiteralInputValue } from '@prisma-next/contract/types';\nimport type { ReferentialAction } from '@prisma-next/sql-contract/types';\nimport type { AnyParamRef } from './types';\n\n/**\n * Render-time context the column-default visitor needs to make dialect\n * decisions that depend on the parent column. Today only the parent\n * column's native type (`\"jsonb\"`, `\"text\"`, …) — the Postgres renderer\n * uses it to decide whether to emit a `::jsonb` / `::json` cast on JSON\n * literal defaults so the emitted DDL matches the column type without\n * relying on Postgres's implicit text → jsonb cast at default-evaluation\n * time. Additional fields can join without re-shaping the interface.\n */\nexport interface DdlColumnRenderContext {\n readonly nativeType: string;\n}\n\nexport interface DdlColumnDefaultVisitor<R> {\n literal(node: LiteralColumnDefault, ctx: DdlColumnRenderContext): R;\n function(node: FunctionColumnDefault, ctx: DdlColumnRenderContext): R;\n}\n\nexport abstract class DdlColumnDefault {\n abstract readonly kind: string;\n abstract accept<R>(visitor: DdlColumnDefaultVisitor<R>, ctx: DdlColumnRenderContext): R;\n\n protected freeze(): void {\n Object.freeze(this);\n }\n}\n\nexport class LiteralColumnDefault extends DdlColumnDefault {\n readonly kind = 'literal' as const;\n readonly value: ColumnDefaultLiteralInputValue;\n\n constructor(value: ColumnDefaultLiteralInputValue) {\n super();\n if (!isColumnDefaultLiteralInputValue(value)) {\n throw new Error('Invalid column default literal value');\n }\n this.value = value;\n this.freeze();\n }\n\n override accept<R>(visitor: DdlColumnDefaultVisitor<R>, ctx: DdlColumnRenderContext): R {\n return visitor.literal(this, ctx);\n }\n}\n\nexport class FunctionColumnDefault extends DdlColumnDefault {\n readonly kind = 'function' as const;\n readonly expression: string;\n\n constructor(expression: string) {\n super();\n this.expression = expression;\n this.freeze();\n }\n\n override accept<R>(visitor: DdlColumnDefaultVisitor<R>, ctx: DdlColumnRenderContext): R {\n return visitor.function(this, ctx);\n }\n}\n\nexport type AnyDdlColumnDefault = LiteralColumnDefault | FunctionColumnDefault;\n\nexport class DdlColumn {\n readonly name: string;\n readonly type: string;\n readonly notNull?: boolean | undefined;\n readonly primaryKey?: boolean | undefined;\n readonly default?: AnyDdlColumnDefault | undefined;\n\n constructor(options: {\n readonly name: string;\n readonly type: string;\n readonly notNull?: boolean;\n readonly primaryKey?: boolean;\n readonly default?: AnyDdlColumnDefault;\n }) {\n this.name = options.name;\n this.type = options.type;\n this.notNull = options.notNull;\n this.primaryKey = options.primaryKey;\n this.default = options.default;\n Object.freeze(this);\n }\n}\n\nexport abstract class DdlNode {\n abstract readonly kind: string;\n\n /**\n * Structural brand: every DDL node answers `true`. Lets {@link isDdlNode}\n * recognise any `DdlNode` subclass — including target-contributed kinds —\n * without a central kind registry that subclasses would have to register\n * into.\n */\n isDdlNode(): true {\n return true;\n }\n\n protected freeze(): void {\n Object.freeze(this);\n }\n\n collectParamRefs(): AnyParamRef[] {\n return [];\n }\n}\n\nexport function isDdlNode(value: unknown): value is DdlNode {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'isDdlNode' in value &&\n typeof value.isDdlNode === 'function'\n );\n}\n\n// ---------------------------------------------------------------------------\n// Table-level constraint nodes\n// ---------------------------------------------------------------------------\n\n/**\n * A composite (or single-column) PRIMARY KEY constraint on a `CreateTable`\n * node. When `name` is set, the adapter renders `CONSTRAINT <name> PRIMARY KEY\n * (…)`; otherwise it renders an anonymous `PRIMARY KEY (…)`.\n *\n * Frozen on construction — immutable after creation.\n */\nexport class PrimaryKeyConstraint {\n readonly kind = 'primary-key' as const;\n readonly columns: ReadonlyArray<string>;\n readonly name: string | undefined;\n\n constructor(options: { readonly columns: readonly string[]; readonly name?: string }) {\n this.columns = Object.freeze([...options.columns]);\n this.name = options.name;\n Object.freeze(this);\n }\n}\n\n/**\n * A FOREIGN KEY constraint on a `CreateTable` node. `onDelete` and `onUpdate`\n * use the same `ReferentialAction` vocabulary already used by the migration\n * planner and the contract IR — no parallel string enum.\n *\n * Frozen on construction — immutable after creation.\n */\nexport class ForeignKeyConstraint {\n readonly kind = 'foreign-key' as const;\n readonly columns: ReadonlyArray<string>;\n readonly refTable: string;\n readonly refColumns: ReadonlyArray<string>;\n readonly onDelete: ReferentialAction | undefined;\n readonly onUpdate: ReferentialAction | undefined;\n readonly name: string | undefined;\n\n constructor(options: {\n readonly columns: readonly string[];\n readonly refTable: string;\n readonly refColumns: readonly string[];\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n readonly name?: string;\n }) {\n this.columns = Object.freeze([...options.columns]);\n this.refTable = options.refTable;\n this.refColumns = Object.freeze([...options.refColumns]);\n this.onDelete = options.onDelete;\n this.onUpdate = options.onUpdate;\n this.name = options.name;\n Object.freeze(this);\n }\n}\n\n/**\n * A table-level UNIQUE constraint on a `CreateTable` node. When `name` is\n * set, the adapter renders `CONSTRAINT <name> UNIQUE (…)`; otherwise it\n * renders an anonymous `UNIQUE (…)`.\n *\n * Frozen on construction — immutable after creation.\n */\nexport class UniqueConstraint {\n readonly kind = 'unique' as const;\n readonly columns: ReadonlyArray<string>;\n readonly name: string | undefined;\n\n constructor(options: { readonly columns: readonly string[]; readonly name?: string }) {\n this.columns = Object.freeze([...options.columns]);\n this.name = options.name;\n Object.freeze(this);\n }\n}\n\nexport type DdlTableConstraint = PrimaryKeyConstraint | ForeignKeyConstraint | UniqueConstraint;\n"],"mappings":";;AAuBA,IAAsB,mBAAtB,MAAuC;CAIrC,SAAyB;EACvB,OAAO,OAAO,IAAI;CACpB;AACF;AAEA,IAAa,uBAAb,cAA0C,iBAAiB;CACzD,OAAgB;CAChB;CAEA,YAAY,OAAuC;EACjD,MAAM;EACN,IAAI,CAAC,iCAAiC,KAAK,GACzC,MAAM,IAAI,MAAM,sCAAsC;EAExD,KAAK,QAAQ;EACb,KAAK,OAAO;CACd;CAEA,OAAmB,SAAqC,KAAgC;EACtF,OAAO,QAAQ,QAAQ,MAAM,GAAG;CAClC;AACF;AAEA,IAAa,wBAAb,cAA2C,iBAAiB;CAC1D,OAAgB;CAChB;CAEA,YAAY,YAAoB;EAC9B,MAAM;EACN,KAAK,aAAa;EAClB,KAAK,OAAO;CACd;CAEA,OAAmB,SAAqC,KAAgC;EACtF,OAAO,QAAQ,SAAS,MAAM,GAAG;CACnC;AACF;AAIA,IAAa,YAAb,MAAuB;CACrB;CACA;CACA;CACA;CACA;CAEA,YAAY,SAMT;EACD,KAAK,OAAO,QAAQ;EACpB,KAAK,OAAO,QAAQ;EACpB,KAAK,UAAU,QAAQ;EACvB,KAAK,aAAa,QAAQ;EAC1B,KAAK,UAAU,QAAQ;EACvB,OAAO,OAAO,IAAI;CACpB;AACF;AAEA,IAAsB,UAAtB,MAA8B;;;;;;;CAS5B,YAAkB;EAChB,OAAO;CACT;CAEA,SAAyB;EACvB,OAAO,OAAO,IAAI;CACpB;CAEA,mBAAkC;EAChC,OAAO,CAAC;CACV;AACF;AAEA,SAAgB,UAAU,OAAkC;CAC1D,OACE,OAAO,UAAU,YACjB,UAAU,QACV,eAAe,SACf,OAAO,MAAM,cAAc;AAE/B;;;;;;;;AAaA,IAAa,uBAAb,MAAkC;CAChC,OAAgB;CAChB;CACA;CAEA,YAAY,SAA0E;EACpF,KAAK,UAAU,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;EACjD,KAAK,OAAO,QAAQ;EACpB,OAAO,OAAO,IAAI;CACpB;AACF;;;;;;;;AASA,IAAa,uBAAb,MAAkC;CAChC,OAAgB;CAChB;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,SAOT;EACD,KAAK,UAAU,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;EACjD,KAAK,WAAW,QAAQ;EACxB,KAAK,aAAa,OAAO,OAAO,CAAC,GAAG,QAAQ,UAAU,CAAC;EACvD,KAAK,WAAW,QAAQ;EACxB,KAAK,WAAW,QAAQ;EACxB,KAAK,OAAO,QAAQ;EACpB,OAAO,OAAO,IAAI;CACpB;AACF;;;;;;;;AASA,IAAa,mBAAb,MAA8B;CAC5B,OAAgB;CAChB;CACA;CAEA,YAAY,SAA0E;EACpF,KAAK,UAAU,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;EACjD,KAAK,OAAO,QAAQ;EACpB,OAAO,OAAO,IAAI;CACpB;AACF"}
@@ -1,181 +0,0 @@
1
- import { J as ParamRef, g as ColumnRef } from "./types-BbGUx5Bi.mjs";
2
- import { r as ExecutionContext } from "./query-lane-context-CY0-e8Qo.mjs";
3
- import { t as SqlExecutionPlan } from "./sql-execution-plan-JwVeAzXt.mjs";
4
- import { Contract, ContractModelDefinitions } from "@prisma-next/contract/types";
5
- import { ExtractFieldOutputTypes, SqlStorage, StorageColumn } from "@prisma-next/sql-contract/types";
6
- import { ParamSpec } from "@prisma-next/operations";
7
- import { SqlLoweringSpec } from "@prisma-next/sql-operations";
8
-
9
- //#region src/types.d.ts
10
- type Expr = ColumnRef | ParamRef;
11
- /**
12
- * Extracts the model name for a given table by iterating models to find the one
13
- * whose `storage.table` matches.
14
- */
15
- type ExtractTableToModel<TContract extends Contract<SqlStorage>, TableName extends string> = ContractModelDefinitions<TContract> extends infer Models extends Record<string, unknown> ? { [M in keyof Models & string]: Models[M] extends {
16
- readonly storage: {
17
- readonly table: TableName;
18
- };
19
- } ? M : never }[keyof Models & string] : never;
20
- /**
21
- * Extracts the field name for a given column by finding the field in
22
- * `model.storage.fields` whose `column` matches.
23
- */
24
- type ExtractColumnToField<TContract extends Contract<SqlStorage>, TableName extends string, ColumnName extends string> = ExtractTableToModel<TContract, TableName> extends infer ModelName extends string ? ContractModelDefinitions<TContract> extends infer Models extends Record<string, unknown> ? ModelName & keyof Models extends infer MKey extends string ? Models[MKey] extends {
25
- readonly storage: {
26
- readonly fields: infer Fields extends Record<string, unknown>;
27
- };
28
- } ? { [F in keyof Fields & string]: Fields[F] extends {
29
- readonly column: ColumnName;
30
- } ? F : never }[keyof Fields & string] : never : never : never : never;
31
- type FallbackCodecLookup<ColumnMeta extends StorageColumn, CodecTypes extends Record<string, {
32
- readonly output: unknown;
33
- }>> = ColumnMeta extends {
34
- codecId: infer CodecId extends string;
35
- } ? CodecId extends keyof CodecTypes ? CodecTypes[CodecId] extends {
36
- readonly output: infer O;
37
- } ? ColumnMeta extends {
38
- nullable: true;
39
- } ? O | null : O : unknown : unknown : unknown;
40
- /**
41
- * Type-level operation signature.
42
- * Represents an operation at the type level for use in contract type maps.
43
- */
44
- type OperationTypeSignature = {
45
- readonly args: ReadonlyArray<ParamSpec>;
46
- readonly returns: ParamSpec;
47
- readonly lowering: SqlLoweringSpec;
48
- readonly capabilities?: ReadonlyArray<string>;
49
- };
50
- /**
51
- * Type-level operation registry.
52
- * Maps typeId → operations, where operations is a record of method name → operation signature.
53
- *
54
- * Example:
55
- * ```typescript
56
- * type MyOperations: OperationTypes = {
57
- * 'pg/vector@1': {
58
- * cosineDistance: {
59
- * args: [{ codecId: 'pg/vector@1'; nullable: false }];
60
- * returns: { codecId: 'core/float8'; nullable: false };
61
- * lowering: { targetFamily: 'sql'; strategy: 'function'; template: '...' };
62
- * };
63
- * };
64
- * };
65
- * ```
66
- */
67
- type OperationTypes = Record<string, Record<string, OperationTypeSignature>>;
68
- /**
69
- * CodecTypes represents a map of typeId to codec definitions.
70
- * Each codec definition must have an `output` property indicating the JavaScript type.
71
- *
72
- * Example:
73
- * ```typescript
74
- * type MyCodecTypes: CodecTypes = {
75
- * 'pg/int4@1': { output: number };
76
- * 'pg/text@1': { output: string };
77
- * };
78
- * ```
79
- */
80
- type CodecTypes = Record<string, {
81
- readonly output: unknown;
82
- }>;
83
- /**
84
- * Extracts operations for a given typeId from the operation registry.
85
- * Returns an empty record if the typeId is not found.
86
- *
87
- * @example
88
- * ```typescript
89
- * type Ops = OperationsForTypeId<'pg/vector@1', MyOperations>;
90
- * // Ops = { cosineDistance: { ... }, l2Distance: { ... } }
91
- * ```
92
- */
93
- type OperationsForTypeId<TypeId extends string, Operations extends OperationTypes> = Operations extends Record<string, never> ? Record<string, never> : TypeId extends keyof Operations ? Operations[TypeId] : Record<string, never>;
94
- type ComputeColumnJsType<TContract extends Contract<SqlStorage>, TableName extends string, ColumnName extends string, ColumnMeta extends StorageColumn, CodecTypes extends Record<string, {
95
- readonly output: unknown;
96
- }>> = ExtractTableToModel<TContract, TableName> extends infer ModelName ? [ModelName] extends [never] ? FallbackCodecLookup<ColumnMeta, CodecTypes> : ModelName extends string ? ExtractColumnToField<TContract, TableName, ColumnName> extends infer FieldName ? [FieldName] extends [never] ? FallbackCodecLookup<ColumnMeta, CodecTypes> : FieldName extends string ? ModelName extends keyof ExtractFieldOutputTypes<TContract> ? FieldName extends keyof ExtractFieldOutputTypes<TContract>[ModelName] ? ExtractFieldOutputTypes<TContract>[ModelName][FieldName] : never : never : never : never : never : never;
97
- /**
98
- * Alias for the SQL-domain executable plan, exposed under the legacy
99
- * `SqlPlan` name for compatibility with SQL builder/utility call sites.
100
- * The canonical name is `SqlExecutionPlan` (`./sql-execution-plan`).
101
- */
102
- type SqlPlan<Row = unknown> = SqlExecutionPlan<Row>;
103
- /**
104
- * Helper types for extracting contract structure.
105
- */
106
- type TablesOf<TContract> = TContract extends {
107
- storage: {
108
- tables: infer U;
109
- };
110
- } ? U : never;
111
- type TableKey<TContract> = Extract<keyof TablesOf<TContract>, string>;
112
- /**
113
- * Unique symbol for metadata property to avoid collisions with user-defined properties
114
- */
115
- declare const META: unique symbol;
116
- /**
117
- * Extracts metadata from a type that has a META property
118
- */
119
- type Meta<T extends {
120
- [META]: unknown;
121
- }> = T[typeof META];
122
- /**
123
- * Metadata interface for table definitions
124
- */
125
- interface TableMetadata<Name extends string> {
126
- name: Name;
127
- }
128
- /**
129
- * Metadata interface for model definitions
130
- */
131
- interface ModelMetadata<Name extends string> {
132
- name: Name;
133
- }
134
- /**
135
- * Base interface for table definitions with metadata
136
- * Used in contract.d.ts to define storage-level table types
137
- */
138
- interface TableDef<Name extends string> {
139
- readonly [META]: TableMetadata<Name>;
140
- }
141
- /**
142
- * Base interface for model definitions with metadata
143
- * Used in contract.d.ts to define application-level model types
144
- */
145
- interface ModelDef<Name extends string> {
146
- readonly [META]: ModelMetadata<Name>;
147
- }
148
- type ColumnsOf<TContract, K extends TableKey<TContract>> = K extends keyof TablesOf<TContract> ? TablesOf<TContract>[K] extends {
149
- columns: infer C;
150
- } ? C : never : never;
151
- interface RawTemplateOptions {
152
- readonly annotations?: Record<string, unknown>;
153
- }
154
- interface RawFunctionOptions extends RawTemplateOptions {
155
- readonly params: ReadonlyArray<unknown>;
156
- }
157
- type RawTemplateFactory = (strings: TemplateStringsArray, ...values: readonly unknown[]) => SqlExecutionPlan;
158
- interface RawFactory extends RawTemplateFactory {
159
- (text: string, options: RawFunctionOptions): SqlExecutionPlan;
160
- with(options: RawTemplateOptions): RawTemplateFactory;
161
- }
162
- interface RuntimeError extends Error {
163
- readonly code: string;
164
- readonly category: 'PLAN';
165
- readonly severity: 'error';
166
- readonly details?: Record<string, unknown>;
167
- readonly hints?: readonly string[];
168
- readonly docs?: readonly string[];
169
- }
170
- interface BuildParamsMap {
171
- readonly [name: string]: unknown;
172
- }
173
- interface BuildOptions {
174
- readonly params?: BuildParamsMap;
175
- }
176
- interface SqlBuilderOptions<TContract extends Contract<SqlStorage> = Contract<SqlStorage>> {
177
- readonly context: ExecutionContext<TContract>;
178
- }
179
- //#endregion
180
- export { TableMetadata as C, TableKey as S, RawTemplateOptions as _, ComputeColumnJsType as a, SqlPlan as b, Meta as c, OperationTypeSignature as d, OperationTypes as f, RawTemplateFactory as g, RawFunctionOptions as h, ColumnsOf as i, ModelDef as l, RawFactory as m, BuildParamsMap as n, Expr as o, OperationsForTypeId as p, CodecTypes as r, META as s, BuildOptions as t, ModelMetadata as u, RuntimeError as v, TablesOf as w, TableDef as x, SqlBuilderOptions as y };
181
- //# sourceMappingURL=types-CQVke4QO.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-CQVke4QO.d.mts","names":[],"sources":["../src/types.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-D72v8s92.mjs","names":[],"sources":["../src/ast/types.ts"],"sourcesContent":["import type { ParamSpec } from '@prisma-next/operations';\nimport type { SqlLoweringSpec } from '@prisma-next/sql-operations';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { CodecRef } from './codec-types';\n\nexport type Direction = 'asc' | 'desc';\n\nexport type BinaryOp = 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'like' | 'in' | 'notIn';\n\nexport type AggregateCountFn = 'count';\nexport type AggregateOpFn = 'sum' | 'avg' | 'min' | 'max';\nexport type AggregateFn = AggregateCountFn | AggregateOpFn;\n\n/**\n * Window function names. Currently only `row_number` is wired up — added\n * to support `ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) = 1`\n * lowering for `.distinct(cols)` semantics in the SQL ORM client. `rank`\n * and `dense_rank` are reserved here so future additions don't churn the\n * type; renderers only need to dispatch on the function name string.\n */\nexport type WindowFn = 'row_number' | 'rank' | 'dense_rank';\n\n/** Scalar JS values that map directly to a SQL wire type. Values outside this set must be routed through `param(value, { codecId })` to declare the target codec explicitly. */\nexport type RawSqlLiteral = number | bigint | string | boolean | Uint8Array;\n\nexport interface ExpressionSource {\n toExpr(): AnyExpression;\n}\n\nexport interface ExpressionRewriter {\n columnRef?(expr: ColumnRef): AnyExpression;\n identifierRef?(expr: IdentifierRef): AnyExpression;\n paramRef?(expr: ParamRef): ParamRef | LiteralExpr;\n preparedParamRef?(expr: PreparedParamRef): PreparedParamRef;\n literal?(expr: LiteralExpr): LiteralExpr;\n list?(expr: ListExpression): ListExpression | LiteralExpr;\n select?(ast: SelectAst): SelectAst;\n rawExpr?(expr: RawExpr): AnyExpression;\n}\n\nexport interface AstRewriter extends ExpressionRewriter {\n tableSource?(source: TableSource): TableSource;\n eqColJoinOn?(on: EqColJoinOn): EqColJoinOn | AnyExpression;\n}\n\nexport interface ExprVisitor<R> {\n columnRef(expr: ColumnRef): R;\n identifierRef(expr: IdentifierRef): R;\n subquery(expr: SubqueryExpr): R;\n operation(expr: OperationExpr): R;\n aggregate(expr: AggregateExpr): R;\n windowFunc(expr: WindowFuncExpr): R;\n jsonObject(expr: JsonObjectExpr): R;\n jsonArrayAgg(expr: JsonArrayAggExpr): R;\n binary(expr: BinaryExpr): R;\n and(expr: AndExpr): R;\n or(expr: OrExpr): R;\n exists(expr: ExistsExpr): R;\n nullCheck(expr: NullCheckExpr): R;\n not(expr: NotExpr): R;\n literal(expr: LiteralExpr): R;\n param(expr: ParamRef): R;\n preparedParam(expr: PreparedParamRef): R;\n list(expr: ListExpression): R;\n rawExpr(expr: RawExpr): R;\n}\n\nexport interface ExpressionFolder<T> {\n empty: T;\n combine(a: T, b: T): T;\n isAbsorbing?(value: T): boolean;\n columnRef?(expr: ColumnRef): T;\n identifierRef?(expr: IdentifierRef): T;\n paramRef?(expr: ParamRef): T;\n preparedParamRef?(expr: PreparedParamRef): T;\n literal?(expr: LiteralExpr): T;\n list?(expr: ListExpression): T;\n select?(ast: SelectAst): T;\n rawExpr?(expr: RawExpr): T;\n}\n\nexport type ProjectionExpr = AnyExpression;\nexport type InsertValue = ColumnRef | ParamRef | PreparedParamRef | DefaultValueExpr | RawExpr;\nexport type JoinOnExpr = EqColJoinOn | AnyExpression;\nexport type WhereArg = AnyExpression | ToWhereExpr;\nexport type JsonObjectEntry = {\n readonly key: string;\n readonly value: ProjectionExpr;\n};\n\nfunction frozenArrayCopy<T>(values: readonly T[]): ReadonlyArray<T> {\n return Object.freeze([...values]);\n}\n\nfunction frozenOptionalRecordCopy<T extends Record<string, unknown>>(\n value: T | undefined,\n): Readonly<T> | undefined {\n return value === undefined ? undefined : Object.freeze({ ...value });\n}\n\nfunction frozenRecordCopy<T>(record: Readonly<Record<string, T>>): Readonly<Record<string, T>> {\n return Object.freeze({ ...record });\n}\n\nfunction frozenCodecRef(codec: CodecRef): CodecRef {\n const typeParams =\n codec.typeParams === undefined\n ? undefined\n : (structuredClone(codec.typeParams) as CodecRef['typeParams']);\n return Object.freeze(\n typeParams === undefined ? { codecId: codec.codecId } : { codecId: codec.codecId, typeParams },\n );\n}\n\nfunction freezeRows(\n rows: ReadonlyArray<Record<string, InsertValue>>,\n): ReadonlyArray<Readonly<Record<string, InsertValue>>> {\n return Object.freeze(rows.map((row) => Object.freeze({ ...row })));\n}\n\nfunction combineAll<T>(folder: ExpressionFolder<T>, thunks: Array<() => T>): T {\n let result = folder.empty;\n for (const thunk of thunks) {\n if (folder.isAbsorbing?.(result)) {\n return result;\n }\n result = folder.combine(result, thunk());\n }\n return result;\n}\n\nfunction rewriteComparable(value: AnyExpression, rewriter: ExpressionRewriter): AnyExpression {\n switch (value.kind) {\n case 'param-ref':\n return rewriter.paramRef ? rewriter.paramRef(value) : value;\n case 'prepared-param-ref':\n return rewriter.preparedParamRef ? rewriter.preparedParamRef(value) : value;\n case 'literal':\n return rewriter.literal ? rewriter.literal(value) : value;\n case 'list':\n if (rewriter.list) {\n return rewriter.list(value);\n }\n return value.rewrite(rewriter);\n default:\n return value.rewrite(rewriter);\n }\n}\n\nfunction foldComparable<T>(value: AnyExpression, folder: ExpressionFolder<T>): T {\n switch (value.kind) {\n case 'param-ref':\n return folder.paramRef ? folder.paramRef(value) : folder.empty;\n case 'prepared-param-ref':\n return folder.preparedParamRef ? folder.preparedParamRef(value) : folder.empty;\n case 'literal':\n return folder.literal ? folder.literal(value) : folder.empty;\n case 'list':\n return value.fold(folder);\n default:\n return value.fold(folder);\n }\n}\n\nfunction collectColumnRefsWith<TNode extends Expression>(node: TNode): ColumnRef[] {\n return node.fold<ColumnRef[]>({\n empty: [],\n combine: (a, b) => [...a, ...b],\n columnRef: (columnRef) => [columnRef],\n select: (ast) => ast.collectColumnRefs(),\n });\n}\n\nfunction collectParamRefsWith<TNode extends Expression>(node: TNode): AnyParamRef[] {\n return node.fold<AnyParamRef[]>({\n empty: [],\n combine: (a, b) => [...a, ...b],\n paramRef: (paramRef) => [paramRef],\n preparedParamRef: (paramRef) => [paramRef],\n select: (ast) => ast.collectParamRefs(),\n });\n}\n\nfunction rewriteTableSource(table: TableSource, rewriter: AstRewriter): TableSource {\n return rewriter.tableSource ? rewriter.tableSource(table) : table;\n}\n\nfunction rewriteProjectionItem(item: ProjectionItem, rewriter: AstRewriter): ProjectionItem {\n const rewrittenExpr =\n item.expr.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(item.expr)\n : item.expr\n : item.expr.rewrite(rewriter);\n return new ProjectionItem(item.alias, rewrittenExpr, item.codec);\n}\n\nfunction rewriteInsertValue(value: InsertValue, rewriter: AstRewriter): InsertValue {\n switch (value.kind) {\n case 'param-ref':\n return rewriter.paramRef ? rewriteParamRefForInsert(value, rewriter) : value;\n case 'prepared-param-ref':\n return rewriter.preparedParamRef ? rewriter.preparedParamRef(value) : value;\n case 'column-ref':\n return rewriter.columnRef ? rewriteColumnRefForInsert(value, rewriter) : value;\n case 'default-value':\n return value;\n // RawExpr insert values are opaque DB-side expressions (e.g. `now()` /\n // `datetime('now')`) carried in value position; they are not a rewrite\n // target on the insert path.\n case 'raw-expr':\n return value;\n }\n}\n\nfunction rewriteParamRefForInsert(value: ParamRef, rewriter: AstRewriter): InsertValue {\n const rewritten = rewriter.paramRef ? rewriter.paramRef(value) : value;\n return rewritten.kind === 'param-ref' ? rewritten : value;\n}\n\nfunction rewriteColumnRefForInsert(value: ColumnRef, rewriter: AstRewriter): InsertValue {\n const rewritten = rewriter.columnRef ? rewriter.columnRef(value) : value;\n return rewritten.kind === 'column-ref' ? rewritten : value;\n}\n\nfunction rewriteInsertRow(\n row: Readonly<Record<string, InsertValue>>,\n rewriter: AstRewriter,\n): Record<string, InsertValue> {\n const result: Record<string, InsertValue> = {};\n for (const [key, value] of Object.entries(row)) {\n result[key] = rewriteInsertValue(value, rewriter);\n }\n return result;\n}\n\nfunction rewriteUpdateSet(\n set: Readonly<Record<string, AnyExpression>>,\n rewriter: AstRewriter,\n): Record<string, AnyExpression> {\n const result: Record<string, AnyExpression> = {};\n for (const [key, value] of Object.entries(set)) {\n result[key] = value.rewrite(rewriter as ExpressionRewriter);\n }\n return result;\n}\n\nfunction rewriteLimitOffset<T extends number | AnyExpression | undefined>(\n value: T,\n rewriter: AstRewriter,\n): T {\n if (value === undefined || typeof value === 'number') return value;\n return value.rewrite(rewriter) as T;\n}\n\nfunction rewriteOnConflict(onConflict: InsertOnConflict, rewriter: AstRewriter): InsertOnConflict {\n const columns = onConflict.columns.map((columnRef) => {\n const rewritten = rewriter.columnRef ? rewriter.columnRef(columnRef) : columnRef;\n return rewritten.kind === 'column-ref' ? rewritten : columnRef;\n });\n\n if (onConflict.action.kind === 'do-nothing') {\n return new InsertOnConflict(columns, new DoNothingConflictAction());\n }\n\n return new InsertOnConflict(\n columns,\n new DoUpdateSetConflictAction(rewriteUpdateSet(onConflict.action.set, rewriter)),\n );\n}\n\nabstract class AstNode {\n abstract readonly kind: string;\n\n protected freeze(): void {\n Object.freeze(this);\n }\n}\n\nabstract class QueryAst extends AstNode {\n abstract collectParamRefs(): AnyParamRef[];\n abstract toQueryAst(): AnyQueryAst;\n}\n\nabstract class FromSource extends AstNode {\n abstract rewrite(rewriter: AstRewriter): AnyFromSource;\n abstract toFromSource(): AnyFromSource;\n}\n\nabstract class Expression extends AstNode implements ExpressionSource {\n abstract accept<R>(visitor: ExprVisitor<R>): R;\n abstract rewrite(rewriter: ExpressionRewriter): AnyExpression;\n abstract fold<T>(folder: ExpressionFolder<T>): T;\n\n collectColumnRefs(): ColumnRef[] {\n return collectColumnRefsWith(this);\n }\n\n collectParamRefs(): AnyParamRef[] {\n return collectParamRefsWith(this);\n }\n\n baseColumnRef(): ColumnRef {\n throw new Error(`${this.constructor.name} does not expose a base column reference`);\n }\n\n toExpr(): AnyExpression {\n return this as unknown as AnyExpression;\n }\n\n not(): NotExpr {\n return new NotExpr(this as unknown as AnyExpression);\n }\n}\n\nexport class TableSource extends FromSource {\n readonly kind = 'table-source' as const;\n readonly name: string;\n readonly alias: string | undefined;\n /**\n * Resolved storage namespace coordinate for this table, stamped when the\n * table proxy constructs the AST. Renderers qualify via the namespace\n * concretion's `qualifyTable()` using this id — never by re-resolving the\n * bare table name at render time.\n */\n readonly namespaceId: string | undefined;\n\n protected constructor(name: string, alias?: string, namespaceId?: string) {\n super();\n this.name = name;\n this.alias = alias;\n this.namespaceId = namespaceId;\n }\n\n static named(name: string, alias?: string, namespaceId?: string): TableSource {\n const source = new TableSource(name, alias, namespaceId);\n source.freeze();\n return source;\n }\n\n override rewrite(rewriter: AstRewriter): AnyFromSource {\n return rewriter.tableSource ? rewriter.tableSource(this) : this;\n }\n\n override toFromSource(): AnyFromSource {\n return this;\n }\n}\n\nexport interface TableRef {\n readonly name: string;\n readonly alias?: string;\n}\n\nexport class DerivedTableSource extends FromSource {\n readonly kind = 'derived-table-source' as const;\n readonly alias: string;\n readonly query: SelectAst;\n\n constructor(alias: string, query: SelectAst) {\n super();\n this.alias = alias;\n this.query = query;\n this.freeze();\n }\n\n static as(alias: string, query: SelectAst): DerivedTableSource {\n return new DerivedTableSource(alias, query);\n }\n\n // Intentionally does not call rewriter.tableSource — derived tables are rewritten via their inner query, not intercepted at the FromSource level. A future fromSource?(source: AnyFromSource) callback would be needed for that.\n override rewrite(rewriter: AstRewriter): AnyFromSource {\n return new DerivedTableSource(this.alias, this.query.rewrite(rewriter));\n }\n\n override toFromSource(): AnyFromSource {\n return this;\n }\n}\n\nexport class ColumnRef extends Expression {\n readonly kind = 'column-ref' as const;\n readonly table: string;\n readonly column: string;\n\n constructor(table: string, column: string) {\n super();\n this.table = table;\n this.column = column;\n this.freeze();\n }\n\n static of(table: string, column: string): ColumnRef {\n return new ColumnRef(table, column);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.columnRef(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.columnRef ? rewriter.columnRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.columnRef ? folder.columnRef(this) : folder.empty;\n }\n\n override baseColumnRef(): ColumnRef {\n return this;\n }\n}\n\nexport class IdentifierRef extends Expression {\n readonly kind = 'identifier-ref' as const;\n readonly name: string;\n\n constructor(name: string) {\n super();\n this.name = name;\n this.freeze();\n }\n\n static of(name: string): IdentifierRef {\n return new IdentifierRef(name);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.identifierRef(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.identifierRef ? rewriter.identifierRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.identifierRef ? folder.identifierRef(this) : folder.empty;\n }\n}\n\nexport class ParamRef extends Expression {\n readonly kind = 'param-ref' as const;\n readonly value: unknown;\n readonly name: string | undefined;\n /**\n * Codec identity carried by every column-bound `ParamRef`. The encode-side dispatch path materialises the per-instance codec through `contractCodecs.forCodecRef(codec)` — content-keyed memoisation on `(codecId, canonicalize(typeParams))` keeps repeated lookups for the same logical column on one shared {@link Codec}.\n *\n * `codec` may be `undefined` for `ParamRef`s constructed without a column-bound site (literals, transient builder state); the runtime treats those as untyped passthroughs.\n */\n readonly codec: CodecRef | undefined;\n\n constructor(\n value: unknown,\n options?: {\n name?: string;\n codec?: CodecRef;\n },\n ) {\n super();\n this.value = value;\n this.name = options?.name;\n this.codec = options?.codec ? frozenCodecRef(options.codec) : undefined;\n this.freeze();\n }\n\n static of(\n value: unknown,\n options?: {\n name?: string;\n codec?: CodecRef;\n },\n ): ParamRef {\n return new ParamRef(value, options);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.param(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.paramRef ? rewriter.paramRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.paramRef ? folder.paramRef(this) : folder.empty;\n }\n}\n\n/**\n * Bind-site placeholder: occupies the same positions as `ParamRef` in the\n * AST, but carries no value — the value is supplied per-execute by the\n * `PreparedStatement.execute(params)` caller and matched to this node by\n * `name`.\n */\nexport class PreparedParamRef extends Expression {\n readonly kind = 'prepared-param-ref' as const;\n readonly name: string;\n readonly codec: CodecRef;\n\n constructor(name: string, codec: CodecRef) {\n super();\n this.name = name;\n this.codec = frozenCodecRef(codec);\n this.freeze();\n }\n\n static of(name: string, codec: CodecRef): PreparedParamRef {\n return new PreparedParamRef(name, codec);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.preparedParam(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.preparedParamRef ? rewriter.preparedParamRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.preparedParamRef ? folder.preparedParamRef(this) : folder.empty;\n }\n}\n\nexport class DefaultValueExpr extends AstNode {\n readonly kind = 'default-value' as const;\n\n constructor() {\n super();\n this.freeze();\n }\n}\n\nexport class LiteralExpr extends Expression {\n readonly kind = 'literal' as const;\n readonly value: unknown;\n\n constructor(value: unknown) {\n super();\n this.value = value;\n this.freeze();\n }\n\n static of(value: unknown): LiteralExpr {\n return new LiteralExpr(value);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.literal(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.literal ? rewriter.literal(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.literal ? folder.literal(this) : folder.empty;\n }\n}\n\nexport class SubqueryExpr extends Expression {\n readonly kind = 'subquery' as const;\n readonly query: SelectAst;\n\n constructor(query: SelectAst) {\n super();\n this.query = query;\n this.freeze();\n }\n\n static of(query: SelectAst): SubqueryExpr {\n return new SubqueryExpr(query);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.subquery(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n const query = this.query.rewrite(rewriter);\n return new SubqueryExpr(query);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.select ? folder.select(this.query) : folder.empty;\n }\n}\n\nexport class OperationExpr extends Expression {\n readonly kind = 'operation' as const;\n readonly method: string;\n readonly self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr>;\n readonly returns: ParamSpec;\n readonly lowering: SqlLoweringSpec;\n\n constructor(options: {\n readonly method: string;\n readonly self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr> | undefined;\n readonly returns: ParamSpec;\n readonly lowering: SqlLoweringSpec;\n }) {\n super();\n this.method = options.method;\n this.self = options.self;\n this.args = frozenArrayCopy(options.args ?? []);\n this.returns = options.returns;\n this.lowering = options.lowering;\n this.freeze();\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.operation(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new OperationExpr({\n method: this.method,\n self: this.self.rewrite(rewriter),\n args: this.args.map((arg) => rewriteComparable(arg, rewriter)) as ReadonlyArray<\n AnyExpression | ParamRef | LiteralExpr\n >,\n returns: this.returns,\n lowering: this.lowering,\n });\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => this.self.fold(folder),\n ...this.args.map((arg) => () => foldComparable(arg, folder)),\n ]);\n }\n\n override baseColumnRef(): ColumnRef {\n return this.self.baseColumnRef();\n }\n}\n\nexport class RawExpr extends Expression {\n readonly kind = 'raw-expr' as const;\n readonly parts: ReadonlyArray<string | AnyExpression>;\n readonly returns: ParamSpec;\n\n constructor(options: {\n readonly parts: ReadonlyArray<string | AnyExpression>;\n readonly returns: ParamSpec;\n }) {\n super();\n this.parts = frozenArrayCopy(options.parts);\n this.returns = options.returns;\n this.freeze();\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.rawExpr(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.rawExpr ? rewriter.rawExpr(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n if (folder.rawExpr) {\n return folder.rawExpr(this);\n }\n return combineAll(\n folder,\n this.parts\n .filter((p): p is AnyExpression => typeof p !== 'string')\n .map((p) => () => p.fold(folder)),\n );\n }\n}\n\nexport class AggregateExpr extends Expression {\n readonly kind = 'aggregate' as const;\n readonly fn: AggregateFn;\n readonly expr: AnyExpression | undefined;\n\n constructor(fn: AggregateFn, expr?: AnyExpression) {\n super();\n if (fn !== 'count' && expr === undefined) {\n throw new Error(`Aggregate function \"${fn}\" requires an expression`);\n }\n this.fn = fn;\n this.expr = expr;\n this.freeze();\n }\n\n static count(expr?: AnyExpression): AggregateExpr {\n return new AggregateExpr('count', expr);\n }\n\n static sum(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('sum', expr);\n }\n\n static avg(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('avg', expr);\n }\n\n static min(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('min', expr);\n }\n\n static max(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('max', expr);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.aggregate(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return this.expr === undefined ? this : new AggregateExpr(this.fn, this.expr.rewrite(rewriter));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr ? this.expr.fold(folder) : folder.empty;\n }\n}\n\n/**\n * Window function call: `fn(args) OVER (PARTITION BY ... ORDER BY ...)`.\n *\n * Both `partitionBy` and `orderBy` are optional; an empty `OVER ()`\n * clause is legal SQL but rarely useful. For `ROW_NUMBER`, `RANK`, and\n * `DENSE_RANK` the standard mandates an `ORDER BY` for deterministic\n * results — callers are expected to provide one, but the AST does not\n * enforce it.\n *\n * The `args` slot exists for future window function additions that take\n * arguments (e.g. `COUNT(*) OVER`, `SUM(x) OVER`); `ROW_NUMBER` and the\n * other ranking functions take no arguments.\n */\nexport class WindowFuncExpr extends Expression {\n readonly kind = 'window-func' as const;\n readonly fn: WindowFn;\n readonly args: ReadonlyArray<AnyExpression>;\n readonly partitionBy: ReadonlyArray<AnyExpression> | undefined;\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n\n constructor(options: {\n readonly fn: WindowFn;\n readonly args?: ReadonlyArray<AnyExpression>;\n readonly partitionBy?: ReadonlyArray<AnyExpression>;\n readonly orderBy?: ReadonlyArray<OrderByItem>;\n }) {\n super();\n this.fn = options.fn;\n this.args = options.args && options.args.length > 0 ? frozenArrayCopy(options.args) : [];\n this.partitionBy =\n options.partitionBy && options.partitionBy.length > 0\n ? frozenArrayCopy(options.partitionBy)\n : undefined;\n this.orderBy =\n options.orderBy && options.orderBy.length > 0 ? frozenArrayCopy(options.orderBy) : undefined;\n this.freeze();\n }\n\n static rowNumber(options: {\n readonly partitionBy?: ReadonlyArray<AnyExpression>;\n readonly orderBy?: ReadonlyArray<OrderByItem>;\n }): WindowFuncExpr {\n return new WindowFuncExpr({ fn: 'row_number', ...options });\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.windowFunc(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new WindowFuncExpr({\n fn: this.fn,\n args: this.args.map((arg) => arg.rewrite(rewriter)),\n ...ifDefined(\n 'partitionBy',\n this.partitionBy?.map((expr) => expr.rewrite(rewriter)),\n ),\n ...ifDefined(\n 'orderBy',\n this.orderBy?.map((orderItem) => orderItem.rewrite(rewriter)),\n ),\n });\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n ...this.args.map((arg) => () => arg.fold(folder)),\n ...(this.partitionBy ?? []).map((expr) => () => expr.fold(folder)),\n ...(this.orderBy ?? []).map((orderItem) => () => orderItem.expr.fold(folder)),\n ]);\n }\n}\n\nexport class JsonObjectExpr extends Expression {\n readonly kind = 'json-object' as const;\n readonly entries: ReadonlyArray<JsonObjectEntry>;\n\n constructor(entries: ReadonlyArray<JsonObjectEntry>) {\n super();\n this.entries = frozenArrayCopy(entries.map((entry) => Object.freeze({ ...entry })));\n this.freeze();\n }\n\n static entry(key: string, value: ProjectionExpr): JsonObjectEntry {\n return {\n key,\n value,\n };\n }\n\n static fromEntries(entries: ReadonlyArray<JsonObjectEntry>): JsonObjectExpr {\n return new JsonObjectExpr(entries);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.jsonObject(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new JsonObjectExpr(\n this.entries.map((entry) => ({\n key: entry.key,\n value:\n entry.value.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(entry.value)\n : entry.value\n : entry.value.rewrite(rewriter),\n })),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.entries.map(\n (entry) => () =>\n entry.value.kind === 'literal'\n ? folder.literal\n ? folder.literal(entry.value)\n : folder.empty\n : entry.value.fold(folder),\n ),\n );\n }\n}\n\nexport class OrderByItem extends AstNode {\n readonly kind = 'order-by-item' as const;\n readonly expr: AnyExpression;\n readonly dir: Direction;\n\n constructor(expr: AnyExpression, dir: Direction) {\n super();\n this.expr = expr;\n this.dir = dir;\n this.freeze();\n }\n\n static asc(expr: AnyExpression): OrderByItem {\n return new OrderByItem(expr, 'asc');\n }\n\n static desc(expr: AnyExpression): OrderByItem {\n return new OrderByItem(expr, 'desc');\n }\n\n rewrite(rewriter: ExpressionRewriter): OrderByItem {\n return new OrderByItem(this.expr.rewrite(rewriter), this.dir);\n }\n\n /**\n * A new frozen item with the sort direction flipped and `expr` unchanged.\n * Integrations that own pagination (e.g. backward cursor pagination) use\n * this to reverse a user's sort order without reaching into the AST.\n */\n reverse(): OrderByItem {\n return new OrderByItem(this.expr, this.dir === 'asc' ? 'desc' : 'asc');\n }\n}\n\nexport class JsonArrayAggExpr extends Expression {\n readonly kind = 'json-array-agg' as const;\n readonly expr: AnyExpression;\n readonly onEmpty: 'null' | 'emptyArray';\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n\n constructor(\n expr: AnyExpression,\n onEmpty: 'null' | 'emptyArray' = 'null',\n orderBy?: ReadonlyArray<OrderByItem>,\n ) {\n super();\n this.expr = expr;\n this.onEmpty = onEmpty;\n this.orderBy = orderBy && orderBy.length > 0 ? frozenArrayCopy(orderBy) : undefined;\n this.freeze();\n }\n\n static of(\n expr: AnyExpression,\n onEmpty: 'null' | 'emptyArray' = 'null',\n orderBy?: ReadonlyArray<OrderByItem>,\n ): JsonArrayAggExpr {\n return new JsonArrayAggExpr(expr, onEmpty, orderBy);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.jsonArrayAgg(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new JsonArrayAggExpr(\n this.expr.rewrite(rewriter),\n this.onEmpty,\n this.orderBy?.map((orderItem) => orderItem.rewrite(rewriter)),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => this.expr.fold(folder),\n ...(this.orderBy ?? []).map((orderItem) => () => orderItem.expr.fold(folder)),\n ]);\n }\n}\n\nexport class ListExpression extends Expression {\n readonly kind = 'list' as const;\n readonly values: ReadonlyArray<AnyExpression>;\n\n constructor(values: ReadonlyArray<AnyExpression>) {\n super();\n this.values = frozenArrayCopy(values);\n this.freeze();\n }\n\n static of(values: ReadonlyArray<AnyExpression>): ListExpression {\n return new ListExpression(values);\n }\n\n static fromValues(values: ReadonlyArray<unknown>): ListExpression {\n return new ListExpression(values.map((value) => new LiteralExpr(value)));\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.list(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n if (rewriter.list) {\n return rewriter.list(this);\n }\n\n return new ListExpression(this.values.map((value) => value.rewrite(rewriter)));\n }\n\n fold<T>(folder: ExpressionFolder<T>): T {\n if (folder.list) {\n return folder.list(this);\n }\n return combineAll(\n folder,\n this.values.map((value) => () => value.fold(folder)),\n );\n }\n}\n\nexport class BinaryExpr extends Expression {\n readonly kind = 'binary' as const;\n readonly op: BinaryOp;\n readonly left: AnyExpression;\n readonly right: AnyExpression;\n\n constructor(op: BinaryOp, left: AnyExpression, right: AnyExpression) {\n super();\n this.op = op;\n this.left = left;\n this.right = right;\n this.freeze();\n }\n\n static eq(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('eq', left, right);\n }\n\n static neq(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('neq', left, right);\n }\n\n static gt(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('gt', left, right);\n }\n\n static lt(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('lt', left, right);\n }\n\n static gte(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('gte', left, right);\n }\n\n static lte(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('lte', left, right);\n }\n\n static like(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('like', left, right);\n }\n\n static in(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('in', left, right);\n }\n\n static notIn(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('notIn', left, right);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.binary(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new BinaryExpr(\n this.op,\n rewriteComparable(this.left, rewriter),\n rewriteComparable(this.right, rewriter),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => foldComparable(this.left, folder),\n () => foldComparable(this.right, folder),\n ]);\n }\n}\n\nexport class AndExpr extends Expression {\n readonly kind = 'and' as const;\n readonly exprs: ReadonlyArray<AnyExpression>;\n\n constructor(exprs: ReadonlyArray<AnyExpression>) {\n super();\n this.exprs = frozenArrayCopy(exprs);\n this.freeze();\n }\n\n static of(exprs: ReadonlyArray<AnyExpression>): AndExpr {\n return new AndExpr(exprs);\n }\n\n static true(): AndExpr {\n return new AndExpr([]);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.and(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new AndExpr(this.exprs.map((expr) => expr.rewrite(rewriter)));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.exprs.map((expr) => () => expr.fold(folder)),\n );\n }\n}\n\nexport class OrExpr extends Expression {\n readonly kind = 'or' as const;\n readonly exprs: ReadonlyArray<AnyExpression>;\n\n constructor(exprs: ReadonlyArray<AnyExpression>) {\n super();\n this.exprs = frozenArrayCopy(exprs);\n this.freeze();\n }\n\n static of(exprs: ReadonlyArray<AnyExpression>): OrExpr {\n return new OrExpr(exprs);\n }\n\n static false(): OrExpr {\n return new OrExpr([]);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.or(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new OrExpr(this.exprs.map((expr) => expr.rewrite(rewriter)));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.exprs.map((expr) => () => expr.fold(folder)),\n );\n }\n}\n\nexport class ExistsExpr extends Expression {\n readonly kind = 'exists' as const;\n readonly notExists: boolean;\n readonly subquery: SelectAst;\n\n constructor(subquery: SelectAst, notExists = false) {\n super();\n this.notExists = notExists;\n this.subquery = subquery;\n this.freeze();\n }\n\n static exists(subquery: SelectAst): ExistsExpr {\n return new ExistsExpr(subquery, false);\n }\n\n static notExists(subquery: SelectAst): ExistsExpr {\n return new ExistsExpr(subquery, true);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.exists(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new ExistsExpr(this.subquery.rewrite(rewriter), this.notExists);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.select ? folder.select(this.subquery) : folder.empty;\n }\n}\n\nexport class NullCheckExpr extends Expression {\n readonly kind = 'null-check' as const;\n readonly expr: AnyExpression;\n readonly isNull: boolean;\n\n constructor(expr: AnyExpression, isNull: boolean) {\n super();\n this.expr = expr;\n this.isNull = isNull;\n this.freeze();\n }\n\n static isNull(expr: AnyExpression): NullCheckExpr {\n return new NullCheckExpr(expr, true);\n }\n\n static isNotNull(expr: AnyExpression): NullCheckExpr {\n return new NullCheckExpr(expr, false);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.nullCheck(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new NullCheckExpr(this.expr.rewrite(rewriter), this.isNull);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr.fold(folder);\n }\n}\n\nexport class NotExpr extends Expression {\n readonly kind = 'not' as const;\n readonly expr: AnyExpression;\n\n constructor(expr: AnyExpression) {\n super();\n this.expr = expr;\n this.freeze();\n }\n\n toWhereExpr(): AnyExpression {\n return this;\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.not(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new NotExpr(this.expr.rewrite(rewriter));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr.fold(folder);\n }\n}\n\nexport class EqColJoinOn extends AstNode {\n readonly kind = 'eq-col-join-on' as const;\n readonly left: ColumnRef;\n readonly right: ColumnRef;\n\n constructor(left: ColumnRef, right: ColumnRef) {\n super();\n this.left = left;\n this.right = right;\n this.freeze();\n }\n\n static of(left: ColumnRef, right: ColumnRef): EqColJoinOn {\n return new EqColJoinOn(left, right);\n }\n\n rewrite(rewriter: AstRewriter): EqColJoinOn | AnyExpression {\n return rewriter.eqColJoinOn ? rewriter.eqColJoinOn(this) : this;\n }\n}\n\nexport class JoinAst extends AstNode {\n readonly kind = 'join' as const;\n readonly joinType: 'inner' | 'left' | 'right' | 'full';\n readonly source: AnyFromSource;\n readonly lateral: boolean;\n readonly on: JoinOnExpr;\n\n constructor(\n joinType: 'inner' | 'left' | 'right' | 'full',\n source: AnyFromSource,\n on: JoinOnExpr,\n lateral = false,\n ) {\n super();\n this.joinType = joinType;\n this.source = source;\n this.lateral = lateral;\n this.on = on;\n this.freeze();\n }\n\n static inner(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('inner', source, on, lateral);\n }\n\n static left(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('left', source, on, lateral);\n }\n\n static right(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('right', source, on, lateral);\n }\n\n static full(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('full', source, on, lateral);\n }\n\n rewrite(rewriter: AstRewriter): JoinAst {\n return new JoinAst(\n this.joinType,\n this.source.rewrite(rewriter),\n this.on.kind === 'eq-col-join-on' ? this.on.rewrite(rewriter) : this.on.rewrite(rewriter),\n this.lateral,\n );\n }\n}\n\nexport class ProjectionItem extends AstNode {\n readonly kind = 'projection-item' as const;\n readonly alias: string;\n readonly expr: ProjectionExpr;\n /**\n * Codec identity for the projected cell. Decode-side dispatch resolves the per-instance codec through `contractCodecs.forCodecRef(codec)` — content-keyed memoisation collapses repeated lookups for the same logical column onto one shared {@link Codec}.\n *\n * Stays `undefined` for non-column-bound projections (computed expressions, subqueries, raw aliases) whose decoded type the runtime cannot infer from a single contract column.\n */\n readonly codec: CodecRef | undefined;\n\n constructor(alias: string, expr: ProjectionExpr, codec?: CodecRef) {\n super();\n this.alias = alias;\n this.expr = expr;\n this.codec = codec ? frozenCodecRef(codec) : undefined;\n this.freeze();\n }\n\n static of(alias: string, expr: ProjectionExpr, codec?: CodecRef): ProjectionItem {\n return new ProjectionItem(alias, expr, codec);\n }\n\n withCodec(codec: CodecRef | undefined): ProjectionItem {\n return new ProjectionItem(this.alias, this.expr, codec);\n }\n}\n\nexport type LimitOffsetValue = number | AnyExpression;\n\nexport interface SelectAstOptions {\n readonly from: AnyFromSource;\n readonly joins: ReadonlyArray<JoinAst> | undefined;\n readonly projection: ReadonlyArray<ProjectionItem>;\n readonly where: AnyExpression | undefined;\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n readonly distinct: true | undefined;\n readonly distinctOn: ReadonlyArray<AnyExpression> | undefined;\n readonly groupBy: ReadonlyArray<AnyExpression> | undefined;\n readonly having: AnyExpression | undefined;\n readonly limit: LimitOffsetValue | undefined;\n readonly offset: LimitOffsetValue | undefined;\n readonly selectAllIntent: { readonly table?: string } | undefined;\n}\n\nexport class SelectAst extends QueryAst {\n readonly kind = 'select' as const;\n readonly from: AnyFromSource;\n readonly joins: ReadonlyArray<JoinAst> | undefined;\n readonly projection: ReadonlyArray<ProjectionItem>;\n readonly where: AnyExpression | undefined;\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n readonly distinct: true | undefined;\n readonly distinctOn: ReadonlyArray<AnyExpression> | undefined;\n readonly groupBy: ReadonlyArray<AnyExpression> | undefined;\n readonly having: AnyExpression | undefined;\n readonly limit: LimitOffsetValue | undefined;\n readonly offset: LimitOffsetValue | undefined;\n readonly selectAllIntent: { readonly table?: string } | undefined;\n\n constructor(options: SelectAstOptions) {\n super();\n this.from = options.from;\n this.joins =\n options.joins && options.joins.length > 0 ? frozenArrayCopy(options.joins) : undefined;\n this.projection = frozenArrayCopy(options.projection);\n this.where = options.where;\n this.orderBy =\n options.orderBy && options.orderBy.length > 0 ? frozenArrayCopy(options.orderBy) : undefined;\n this.distinct = options.distinct;\n this.distinctOn =\n options.distinctOn && options.distinctOn.length > 0\n ? frozenArrayCopy(options.distinctOn)\n : undefined;\n this.groupBy =\n options.groupBy && options.groupBy.length > 0 ? frozenArrayCopy(options.groupBy) : undefined;\n this.having = options.having;\n this.limit = options.limit;\n this.offset = options.offset;\n this.selectAllIntent = frozenOptionalRecordCopy(options.selectAllIntent);\n this.freeze();\n }\n\n static from(from: AnyFromSource): SelectAst {\n return new SelectAst({\n from,\n joins: undefined,\n projection: [],\n where: undefined,\n orderBy: undefined,\n distinct: undefined,\n distinctOn: undefined,\n groupBy: undefined,\n having: undefined,\n limit: undefined,\n offset: undefined,\n selectAllIntent: undefined,\n });\n }\n\n withFrom(from: AnyFromSource): SelectAst {\n return new SelectAst({ ...this, from });\n }\n\n withJoins(joins: ReadonlyArray<JoinAst>): SelectAst {\n return new SelectAst({\n ...this,\n joins: joins.length > 0 ? joins : undefined,\n });\n }\n\n withProjection(projection: ReadonlyArray<ProjectionItem>): SelectAst {\n return new SelectAst({ ...this, projection });\n }\n\n addProjection(alias: string, expr: ProjectionExpr): SelectAst {\n return new SelectAst({\n ...this,\n projection: [...this.projection, new ProjectionItem(alias, expr)],\n });\n }\n\n withWhere(where: AnyExpression | undefined): SelectAst {\n return new SelectAst({ ...this, where });\n }\n\n withOrderBy(orderBy: ReadonlyArray<OrderByItem>): SelectAst {\n return new SelectAst({\n ...this,\n orderBy: orderBy.length > 0 ? orderBy : undefined,\n });\n }\n\n withDistinct(enabled = true): SelectAst {\n return new SelectAst({\n ...this,\n distinct: enabled ? true : undefined,\n });\n }\n\n withDistinctOn(distinctOn: ReadonlyArray<AnyExpression>): SelectAst {\n return new SelectAst({\n ...this,\n distinctOn: distinctOn.length > 0 ? distinctOn : undefined,\n });\n }\n\n withGroupBy(groupBy: ReadonlyArray<AnyExpression>): SelectAst {\n return new SelectAst({\n ...this,\n groupBy: groupBy.length > 0 ? groupBy : undefined,\n });\n }\n\n withHaving(having: AnyExpression | undefined): SelectAst {\n return new SelectAst({ ...this, having });\n }\n\n withLimit(limit: LimitOffsetValue | undefined): SelectAst {\n return new SelectAst({ ...this, limit });\n }\n\n withOffset(offset: LimitOffsetValue | undefined): SelectAst {\n return new SelectAst({ ...this, offset });\n }\n\n withSelectAllIntent(selectAllIntent: { readonly table?: string } | undefined): SelectAst {\n return new SelectAst({ ...this, selectAllIntent });\n }\n\n rewrite(rewriter: AstRewriter): SelectAst {\n const rewritten = new SelectAst({\n from: this.from.rewrite(rewriter),\n joins: this.joins?.map((join) => join.rewrite(rewriter)),\n projection: this.projection.map(\n (projection) =>\n new ProjectionItem(\n projection.alias,\n projection.expr.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(projection.expr)\n : projection.expr\n : projection.expr.rewrite(rewriter),\n projection.codec,\n ),\n ),\n where: this.where?.rewrite(rewriter),\n orderBy: this.orderBy?.map((orderItem) => orderItem.rewrite(rewriter)),\n distinct: this.distinct,\n distinctOn: this.distinctOn?.map((expr) => expr.rewrite(rewriter)),\n groupBy: this.groupBy?.map((expr) => expr.rewrite(rewriter)),\n having: this.having?.rewrite(rewriter),\n limit: rewriteLimitOffset(this.limit, rewriter),\n offset: rewriteLimitOffset(this.offset, rewriter),\n selectAllIntent: this.selectAllIntent,\n });\n\n return rewriter.select ? rewriter.select(rewritten) : rewritten;\n }\n\n collectColumnRefs(): ColumnRef[] {\n const refs: ColumnRef[] = [];\n const pushRefs = (columns: ReadonlyArray<ColumnRef>) => {\n refs.push(...columns);\n };\n\n if (this.from.kind === 'derived-table-source') {\n pushRefs(this.from.query.collectColumnRefs());\n }\n\n for (const projection of this.projection) {\n if (!(projection.expr.kind === 'literal')) {\n pushRefs(projection.expr.collectColumnRefs());\n }\n }\n\n if (this.where) {\n pushRefs(this.where.collectColumnRefs());\n }\n if (this.having) {\n pushRefs(this.having.collectColumnRefs());\n }\n for (const orderItem of this.orderBy ?? []) {\n pushRefs(orderItem.expr.collectColumnRefs());\n }\n for (const expr of this.distinctOn ?? []) {\n pushRefs(expr.collectColumnRefs());\n }\n for (const expr of this.groupBy ?? []) {\n pushRefs(expr.collectColumnRefs());\n }\n for (const join of this.joins ?? []) {\n if (join.source.kind === 'derived-table-source') {\n pushRefs(join.source.query.collectColumnRefs());\n }\n if (join.on.kind === 'eq-col-join-on') {\n refs.push(join.on.left, join.on.right);\n } else {\n pushRefs(join.on.collectColumnRefs());\n }\n }\n if (typeof this.limit === 'object') {\n pushRefs(this.limit.collectColumnRefs());\n }\n if (typeof this.offset === 'object') {\n pushRefs(this.offset.collectColumnRefs());\n }\n\n return refs;\n }\n\n collectParamRefs(): AnyParamRef[] {\n const refs: AnyParamRef[] = [];\n const pushRefs = (params: ReadonlyArray<AnyParamRef>) => {\n refs.push(...params);\n };\n\n if (this.from.kind === 'derived-table-source') {\n pushRefs(this.from.query.collectParamRefs());\n }\n\n for (const projection of this.projection) {\n if (!(projection.expr.kind === 'literal')) {\n pushRefs(projection.expr.collectParamRefs());\n }\n }\n\n if (this.where) {\n pushRefs(this.where.collectParamRefs());\n }\n if (this.having) {\n pushRefs(this.having.collectParamRefs());\n }\n for (const orderItem of this.orderBy ?? []) {\n pushRefs(orderItem.expr.collectParamRefs());\n }\n for (const expr of this.distinctOn ?? []) {\n pushRefs(expr.collectParamRefs());\n }\n for (const expr of this.groupBy ?? []) {\n pushRefs(expr.collectParamRefs());\n }\n for (const join of this.joins ?? []) {\n if (join.source.kind === 'derived-table-source') {\n pushRefs(join.source.query.collectParamRefs());\n }\n if (!(join.on.kind === 'eq-col-join-on')) {\n pushRefs(join.on.collectParamRefs());\n }\n }\n if (typeof this.limit === 'object') {\n pushRefs(this.limit.collectParamRefs());\n }\n if (typeof this.offset === 'object') {\n pushRefs(this.offset.collectParamRefs());\n }\n\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nabstract class InsertOnConflictAction extends AstNode {\n abstract toInsertOnConflictAction(): AnyInsertOnConflictAction;\n}\n\nexport class DoNothingConflictAction extends InsertOnConflictAction {\n readonly kind = 'do-nothing' as const;\n\n constructor() {\n super();\n this.freeze();\n }\n\n override toInsertOnConflictAction(): AnyInsertOnConflictAction {\n return this;\n }\n}\n\nexport class DoUpdateSetConflictAction extends InsertOnConflictAction {\n readonly kind = 'do-update-set' as const;\n readonly set: Readonly<Record<string, AnyExpression>>;\n\n constructor(set: Readonly<Record<string, AnyExpression>>) {\n super();\n this.set = frozenRecordCopy(set);\n this.freeze();\n }\n\n override toInsertOnConflictAction(): AnyInsertOnConflictAction {\n return this;\n }\n}\n\nexport class InsertOnConflict extends AstNode {\n readonly kind = 'insert-on-conflict' as const;\n readonly columns: ReadonlyArray<ColumnRef>;\n readonly action: AnyInsertOnConflictAction;\n\n constructor(columns: ReadonlyArray<ColumnRef>, action: AnyInsertOnConflictAction) {\n super();\n this.columns = frozenArrayCopy(columns);\n this.action = action;\n this.freeze();\n }\n\n static on(columns: ReadonlyArray<ColumnRef>): InsertOnConflict {\n return new InsertOnConflict(columns, new DoNothingConflictAction());\n }\n\n doNothing(): InsertOnConflict {\n return new InsertOnConflict(this.columns, new DoNothingConflictAction());\n }\n\n doUpdateSet(set: Readonly<Record<string, AnyExpression>>): InsertOnConflict {\n return new InsertOnConflict(this.columns, new DoUpdateSetConflictAction(set));\n }\n}\n\nexport class InsertAst extends QueryAst {\n readonly kind = 'insert' as const;\n readonly table: TableSource;\n readonly rows: ReadonlyArray<Readonly<Record<string, InsertValue>>>;\n readonly onConflict: InsertOnConflict | undefined;\n readonly returning: ReadonlyArray<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n rows: ReadonlyArray<Record<string, InsertValue>> = [{}],\n onConflict?: InsertOnConflict,\n returning?: ReadonlyArray<ProjectionItem>,\n ) {\n super();\n this.table = table;\n this.rows = freezeRows(rows);\n this.onConflict = onConflict;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static into(table: TableSource): InsertAst {\n return new InsertAst(table);\n }\n\n withRows(rows: ReadonlyArray<Record<string, InsertValue>>): InsertAst {\n return new InsertAst(\n this.table,\n rows.map((row) => ({ ...row })),\n this.onConflict,\n this.returning,\n );\n }\n\n withReturning(returning: ReadonlyArray<ProjectionItem> | undefined): InsertAst {\n return new InsertAst(\n this.table,\n this.rows.map((row) => ({ ...row })),\n this.onConflict,\n returning,\n );\n }\n\n withOnConflict(onConflict: InsertOnConflict | undefined): InsertAst {\n return new InsertAst(\n this.table,\n this.rows.map((row) => ({ ...row })),\n onConflict,\n this.returning,\n );\n }\n\n rewrite(rewriter: AstRewriter): InsertAst {\n return new InsertAst(\n rewriteTableSource(this.table, rewriter),\n this.rows.map((row) => rewriteInsertRow(row, rewriter)),\n this.onConflict ? rewriteOnConflict(this.onConflict, rewriter) : undefined,\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\n );\n }\n\n override collectParamRefs(): AnyParamRef[] {\n const refs: AnyParamRef[] = [];\n for (const row of this.rows) {\n for (const value of Object.values(row)) {\n if (value.kind === 'param-ref' || value.kind === 'prepared-param-ref') {\n refs.push(value);\n } else if (value.kind === 'raw-expr') {\n refs.push(...value.collectParamRefs());\n }\n }\n }\n if (this.onConflict?.action.kind === 'do-update-set') {\n for (const value of Object.values(this.onConflict.action.set)) {\n if (value.kind === 'param-ref' || value.kind === 'prepared-param-ref') {\n refs.push(value);\n }\n }\n }\n for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport class UpdateAst extends QueryAst {\n readonly kind = 'update' as const;\n readonly table: TableSource;\n readonly set: Readonly<Record<string, AnyExpression>>;\n readonly where: AnyExpression | undefined;\n readonly returning: ReadonlyArray<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n set: Readonly<Record<string, AnyExpression>> = {},\n where?: AnyExpression,\n returning?: ReadonlyArray<ProjectionItem>,\n ) {\n super();\n this.table = table;\n this.set = frozenRecordCopy(set);\n this.where = where;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static table(table: TableSource): UpdateAst {\n return new UpdateAst(table);\n }\n\n withSet(set: Readonly<Record<string, AnyExpression>>): UpdateAst {\n return new UpdateAst(this.table, set, this.where, this.returning);\n }\n\n withWhere(where: AnyExpression | undefined): UpdateAst {\n return new UpdateAst(this.table, this.set, where, this.returning);\n }\n\n withReturning(returning: ReadonlyArray<ProjectionItem> | undefined): UpdateAst {\n return new UpdateAst(this.table, this.set, this.where, returning);\n }\n\n rewrite(rewriter: AstRewriter): UpdateAst {\n return new UpdateAst(\n rewriteTableSource(this.table, rewriter),\n rewriteUpdateSet(this.set, rewriter),\n this.where?.rewrite(rewriter),\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\n );\n }\n\n override collectParamRefs(): AnyParamRef[] {\n const refs: AnyParamRef[] = [];\n for (const value of Object.values(this.set)) {\n refs.push(...value.collectParamRefs());\n }\n if (this.where) {\n refs.push(...this.where.collectParamRefs());\n }\n for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport class DeleteAst extends QueryAst {\n readonly kind = 'delete' as const;\n readonly table: TableSource;\n readonly where: AnyExpression | undefined;\n readonly returning: ReadonlyArray<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n where?: AnyExpression,\n returning?: ReadonlyArray<ProjectionItem>,\n ) {\n super();\n this.table = table;\n this.where = where;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static from(table: TableSource): DeleteAst {\n return new DeleteAst(table);\n }\n\n withWhere(where: AnyExpression | undefined): DeleteAst {\n return new DeleteAst(this.table, where, this.returning);\n }\n\n withReturning(returning: ReadonlyArray<ProjectionItem> | undefined): DeleteAst {\n return new DeleteAst(this.table, this.where, returning);\n }\n\n rewrite(rewriter: AstRewriter): DeleteAst {\n return new DeleteAst(\n rewriteTableSource(this.table, rewriter),\n this.where?.rewrite(rewriter),\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\n );\n }\n\n override collectParamRefs(): AnyParamRef[] {\n const refs: AnyParamRef[] = [];\n if (this.where) {\n refs.push(...this.where.collectParamRefs());\n }\n for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\n/**\n * Raw-SQL query AST node carrying interpolated parameter / expression nodes\n * embedded inside literal SQL fragments.\n *\n * `fragments` and `args` are interleaved during lowering:\n * `fragments[0] + lower(args[0]) + fragments[1] + ... + fragments[n]`.\n * Construction enforces `fragments.length === args.length + 1`.\n *\n * Extends {@link QueryAst} (whole-query AST, not a sub-expression).\n * Construction does not validate that each arg is a `ParamRef` /\n * `AnyExpression`: the type system already rejects bare values because\n * `args` is typed `readonly AnyExpression[]`. The user-facing `raw\\`...\\``\n * factory (separate `sql-raw-factory` component) layers stricter\n * type-level rejection on top of this AST node.\n */\nexport class RawSqlExpr extends QueryAst {\n readonly kind = 'raw-sql' as const;\n readonly fragments: readonly string[];\n readonly args: readonly AnyExpression[];\n\n constructor(fragments: readonly string[], args: readonly AnyExpression[]) {\n super();\n if (fragments.length !== args.length + 1) {\n throw new Error(\n `RawSqlExpr: fragments.length must equal args.length + 1 (got fragments=${fragments.length}, args=${args.length})`,\n );\n }\n this.fragments = Object.freeze([...fragments]);\n this.args = Object.freeze([...args]);\n this.freeze();\n }\n\n static of(fragments: readonly string[], args: readonly AnyExpression[]): RawSqlExpr {\n return new RawSqlExpr(fragments, args);\n }\n\n override collectParamRefs(): AnyParamRef[] {\n const refs: AnyParamRef[] = [];\n for (const arg of this.args) {\n if (arg.kind === 'param-ref') {\n refs.push(arg);\n } else {\n refs.push(...arg.collectParamRefs());\n }\n }\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport type AnyQueryAst = SelectAst | InsertAst | UpdateAst | DeleteAst | RawSqlExpr;\nexport type AnyFromSource = TableSource | DerivedTableSource;\nexport type AnyExpression =\n | ColumnRef\n | IdentifierRef\n | ParamRef\n | PreparedParamRef\n | LiteralExpr\n | SubqueryExpr\n | OperationExpr\n | AggregateExpr\n | WindowFuncExpr\n | JsonObjectExpr\n | JsonArrayAggExpr\n | ListExpression\n | BinaryExpr\n | AndExpr\n | OrExpr\n | ExistsExpr\n | NullCheckExpr\n | NotExpr\n | RawExpr;\nexport type AnyParamRef = ParamRef | PreparedParamRef;\nexport type AnyInsertOnConflictAction = DoNothingConflictAction | DoUpdateSetConflictAction;\nexport type AnyInsertValue = ColumnRef | ParamRef | PreparedParamRef | DefaultValueExpr | RawExpr;\nexport type AnyOperationArg = AnyExpression | ParamRef | PreparedParamRef | LiteralExpr;\n\nexport const queryAstKinds: ReadonlySet<string> = new Set<AnyQueryAst['kind']>([\n 'select',\n 'insert',\n 'update',\n 'delete',\n 'raw-sql',\n]);\nexport const whereExprKinds: ReadonlySet<string> = new Set<AnyExpression['kind']>([\n 'binary',\n 'and',\n 'or',\n 'exists',\n 'null-check',\n 'not',\n]);\n\nexport function isQueryAst(value: unknown): value is AnyQueryAst {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n queryAstKinds.has((value as { kind: string }).kind)\n );\n}\n\nexport function isWhereExpr(value: unknown): value is AnyExpression {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n whereExprKinds.has((value as { kind: string }).kind)\n );\n}\n\nexport interface ToWhereExpr {\n toWhereExpr(): AnyExpression;\n}\n\n/**\n * One positional slot of a lowered SQL statement.\n *\n * - `literal` — a value baked into the AST; passes through to the driver.\n * - `bind` — a `PreparedParamRef` placeholder; the runtime resolves the\n * value from the per-execute `userParams[name]` before calling the driver.\n *\n * The same `name` may legitimately appear in multiple `bind` slots when a\n * renderer does not dedupe `PreparedParamRef` occurrences (e.g. SQLite's\n * positional `?` walker calls `ast.collectParamRefs()` directly rather than\n * `collectOrderedParamRefs`); resolution-by-name handles that case\n * correctly. See `collectOrderedParamRefs` in `./util` for the dedupe\n * contract used by Postgres' `$N` renderer.\n */\nexport type LoweredParam =\n | { readonly kind: 'literal'; readonly value: unknown }\n | { readonly kind: 'bind'; readonly name: string };\n\nexport interface LoweredStatement {\n readonly sql: string;\n readonly params: readonly LoweredParam[];\n readonly annotations?: Record<string, unknown>;\n}\n"],"mappings":"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"}