@prisma-next/sql-relational-core 0.14.0-dev.4 → 0.14.0-dev.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ddl-types-BVO002FS.d.mts → ddl-types-Cd4p4EbE.d.mts} +21 -3
- package/dist/{ddl-types-BVO002FS.d.mts.map → ddl-types-Cd4p4EbE.d.mts.map} +1 -1
- package/dist/{ddl-types-DAox2c8w.mjs → ddl-types-DFKQr_qQ.mjs} +21 -2
- package/dist/{ddl-types-DAox2c8w.mjs.map → ddl-types-DFKQr_qQ.mjs.map} +1 -1
- package/dist/exports/ast.d.mts +2 -2
- package/dist/exports/ast.mjs +3 -3
- package/dist/exports/codec-descriptor-registry.d.mts.map +1 -1
- package/dist/exports/codec-descriptor-registry.mjs +15 -4
- package/dist/exports/codec-descriptor-registry.mjs.map +1 -1
- package/dist/exports/contract-free.d.mts +3 -2
- package/dist/exports/contract-free.d.mts.map +1 -1
- package/dist/exports/contract-free.mjs +9 -3
- package/dist/exports/contract-free.mjs.map +1 -1
- package/dist/exports/expression.d.mts +27 -1
- package/dist/exports/expression.d.mts.map +1 -1
- package/dist/exports/expression.mjs +1 -1
- package/dist/exports/expression.mjs.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +3 -3
- package/dist/{types-lJUc6cY-.mjs → types-CaGVAsoT.mjs} +7 -3
- package/dist/types-CaGVAsoT.mjs.map +1 -0
- package/package.json +11 -11
- package/src/ast/ddl-types.ts +26 -1
- package/src/ast/types.ts +3 -3
- package/src/codec-ref-for-column.ts +11 -2
- package/src/contract-free/column.ts +5 -0
- package/src/exports/contract-free.ts +1 -0
- package/src/expression.ts +29 -1
- package/dist/types-lJUc6cY-.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression.mjs","names":[],"sources":["../../src/expression.ts"],"sourcesContent":["import { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { ParamSpec } from '@prisma-next/operations';\nimport type { QueryOperationReturn } from '@prisma-next/sql-contract/types';\nimport type { SqlLoweringSpec } from '@prisma-next/sql-operations';\nimport type { CodecRef } from './ast/codec-types';\nimport type { AnyExpression as AstExpression, RawSqlLiteral } from './ast/types';\nimport { OperationExpr, ParamRef, RawExpr } from './ast/types';\n\nexport type ScopeField = {\n codecId: string;\n nullable: boolean;\n /**\n * Optional {@link CodecRef} derived from contract storage at scope construction time. Builder paths that mint column-bound `ParamRef` / `ProjectionItem` nodes stamp this slot onto the AST so encode/decode dispatch resolves through `contractCodecs.forCodecRef`. Leave `undefined` when the scope was built without contract storage (rare — tests, ad-hoc scopes).\n */\n codec?: CodecRef;\n};\n\nexport type CodecTypesBase = Record<string, { readonly input: unknown; readonly output: unknown }>;\n\n/**\n * A typed SQL expression. Identity is carried by the `returnType` descriptor (inherited from `QueryOperationReturn` and narrowed to `T`) — distinct `T` makes distinct Expression types structurally. `buildAst()` materialises the underlying AST node.\n */\nexport type Expression<T extends ScopeField> = QueryOperationReturn & {\n readonly returnType: T;\n buildAst(): AstExpression;\n};\n\ntype CodecIdsWithTrait<\n CT extends Record<string, { readonly input: unknown }>,\n RequiredTraits extends readonly string[],\n> = {\n [K in keyof CT & string]: CT[K] extends { readonly traits: infer T }\n ? [RequiredTraits[number]] extends [T]\n ? K\n : never\n : never;\n}[keyof CT & string];\n\ntype NullSuffix<N> = N extends true ? null : never;\n\n/**\n * Runtime value type for a slot bound to `CodecId` with the given\n * nullability — `CT[CodecId]['input']`, plus `null` when `Nullable` is true.\n */\nexport type CodecValue<\n CodecId extends string,\n Nullable extends boolean,\n CT extends Record<string, { readonly input: unknown }>,\n> = (CodecId extends keyof CT ? CT[CodecId]['input'] : never) | NullSuffix<Nullable>;\n\n/**\n * An expression or literal value targeting a specific codec.\n *\n * Accepts any of:\n * - An `Expression` whose codec matches exactly\n * - A raw JS value of the codec's `input` type\n * - `null` when `Nullable` is true\n */\nexport type CodecExpression<\n CodecId extends string,\n Nullable extends boolean,\n CT extends Record<string, { readonly input: unknown }>,\n> = Expression<{ codecId: CodecId; nullable: Nullable }> | CodecValue<CodecId, Nullable, CT>;\n\n/**\n * An expression or literal value targeting any codec whose trait set contains all the required traits.\n *\n * Resolves the trait set to the union of matching codec identities via `CodecIdsWithTrait`, then reuses `CodecExpression` for the codec-id form.\n */\nexport type TraitExpression<\n Traits extends readonly string[],\n Nullable extends boolean,\n CT extends Record<string, { readonly input: unknown }>,\n> = CodecExpression<CodecIdsWithTrait<CT, Traits>, Nullable, CT>;\n\n/**\n * Resolve a raw value or an Expression into an AST expression node.\n *\n * When `value` is an Expression (duck-typed by its `buildAst` method), the AST it wraps is returned. Otherwise the value is embedded as a ParamRef tagged with the caller-supplied {@link CodecRef} (when known). The runtime resolves the ref via `contractCodecs.forCodecRef(codec)`; content-keyed memoisation collapses repeated lookups for the same logical column onto one shared codec.\n *\n * Operation implementations that compare a column-bound expression to a user value derive the column's {@link CodecRef} from the column-bound side (via {@link codecOf}) and forward it here so encode-side dispatch resolves to the per-instance codec for parameterized codec ids (`vector(1024)` vs. `vector(1536)`).\n */\nexport function toExpr(value: unknown, codec?: CodecRef): AstExpression {\n if (isExpressionLike(value)) {\n return value.buildAst();\n }\n if (codec === undefined) {\n throw runtimeError(\n 'RUNTIME.PARAM_REF_CODEC_REQUIRED',\n `Cannot construct a ParamRef for a ${value === null ? 'null' : typeof value} value without an explicit codec. ` +\n 'Provide a CodecRef at the call site or use a column-bound builder path.',\n );\n }\n return ParamRef.of(value, { codec });\n}\n\n/**\n * Construct a `ParamRef` for a value whose codec identity is known at call time. Use this when interpolating a value into a raw SQL expression and the codec cannot be inferred from context — e.g. `param(myDate, { codecId: 'pg/timestamptz@1' })`.\n */\nexport function param<T>(value: T, opts: { codecId: string }): ParamRef {\n return ParamRef.of(value, { codec: { codecId: opts.codecId } });\n}\n\n/**\n * Derive the {@link CodecRef} carried by an expression-like value.\n *\n * Resolution order:\n * 1. `wrapper.codec` — explicit column-bound {@link CodecRef} stamped at field-proxy time.\n * 2. `wrapper.returnType.codec` — scope-level codec when the scope was built from contract storage.\n * 3. `{ codecId: wrapper.returnType.codecId }` — minimal ref derived from the expression's declared codec id (covers synthetic expressions like `count()` whose returnType has a known codec id but no explicit column binding).\n *\n * Returns `undefined` for raw scalar values (non-expression-like).\n */\nexport function codecOf(value: unknown): CodecRef | undefined {\n if (!isExpressionLike(value)) return undefined;\n const wrapper = value as {\n codec?: CodecRef;\n returnType?: { codec?: CodecRef; codecId?: string };\n };\n if (wrapper.codec) return wrapper.codec;\n if (wrapper.returnType?.codec) return wrapper.returnType.codec;\n if (wrapper.returnType?.codecId) return { codecId: wrapper.returnType.codecId };\n return undefined;\n}\n\nfunction isExpressionLike(value: unknown): value is Expression<ScopeField> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'buildAst' in value &&\n typeof (value as { buildAst: unknown }).buildAst === 'function'\n );\n}\n\nexport interface BuildOperationSpec<R extends ScopeField> {\n readonly method: string;\n /**\n * The operation's arguments. The first element is the self argument (the value the operation is being applied to); the rest are the remaining user-supplied arguments.\n */\n readonly args: readonly [AstExpression, ...AstExpression[]];\n readonly returns: R & ParamSpec;\n readonly lowering: SqlLoweringSpec;\n}\n\n/**\n * Construct an OperationExpr AST node and wrap it as a typed Expression. Operation implementations use this to turn their user-facing arguments into the AST node the compilation pipeline eventually lowers to SQL.\n */\nexport function buildOperation<R extends ScopeField>(spec: BuildOperationSpec<R>): Expression<R> {\n const [self, ...rest] = spec.args;\n const op = new OperationExpr({\n method: spec.method,\n self,\n args: rest.length > 0 ? rest : undefined,\n returns: spec.returns,\n lowering: spec.lowering,\n });\n return {\n returnType: spec.returns,\n buildAst: () => op,\n };\n}\n\n/**\n * Resolves a codec id for a bare JavaScript value interpolated into a raw-SQL\n * template — e.g. `` rawSql`SELECT ${42}` `` calls `inferCodec(42)` to pick\n * the codec id (`pg/int4`, `sqlite/integer@1`, etc.) that will encode the\n * value as a bound parameter.\n *\n * Targets implement this once per dialect: examine the JS value's runtime\n * shape (number, bigint, string, boolean, `Uint8Array`) and return a codec\n * id known to the target's codec registry. Throw when the value falls\n * outside the supported set — callers should wrap such values with\n * `param(value, { codecId })` to declare the codec explicitly.\n */\nexport interface RawCodecInferer {\n inferCodec(value: RawSqlLiteral): string;\n}\n\n/** The one-method builder returned by a `RawSqlTag` template call before `.returns()` is called. */\nexport interface RawSqlBuilder {\n returns<S extends string>(spec: S): Expression<{ codecId: S; nullable: false }>;\n returns<S extends string, N extends boolean = false>(spec: {\n readonly codecId: S;\n readonly nullable?: N;\n }): Expression<{ codecId: S; nullable: N }>;\n}\n\n/** Tagged-template function returned by {@link createRawSql}. */\nexport type RawSqlTag = (\n strings: TemplateStringsArray,\n ...values: RawSqlInterpolation[]\n) => RawSqlBuilder;\n\ntype RawSqlInterpolation = Expression<ScopeField> | ParamRef | RawSqlLiteral;\n\nfunction resolveInterpolation(\n adapter: RawCodecInferer,\n value: RawSqlInterpolation,\n): AstExpression | ParamRef {\n if (isExpressionLike(value)) {\n return value.buildAst();\n }\n if (value instanceof ParamRef) {\n return value;\n }\n if (\n typeof value === 'number' ||\n typeof value === 'bigint' ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n value instanceof Uint8Array\n ) {\n return ParamRef.of(value, { codec: { codecId: adapter.inferCodec(value) } });\n }\n\n value satisfies never;\n throw runtimeError(\n 'RUNTIME.RAW_SQL_UNSUPPORTED_INTERPOLATION',\n 'unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec',\n );\n}\n\n/**\n * Create a tagged-template builder for raw SQL expressions. The returned tag accepts SQL string fragments interleaved with typed {@link Expression}, {@link ParamRef}, or bare {@link RawSqlLiteral} interpolations. Call `.returns(spec)` on the result to obtain a typed {@link Expression} whose AST is a {@link RawExpr}.\n *\n * Bare {@link RawSqlLiteral} interpolations are wrapped as `ParamRef` nodes with the codec resolved via `adapter.inferCodec(value)`. Use {@link param} when the codec cannot be inferred from the value alone (e.g. `Date`).\n */\nexport function createRawSql(adapter: RawCodecInferer): RawSqlTag {\n return (strings, ...values) => {\n const parts: (string | AstExpression | ParamRef)[] = [];\n parts.push(strings[0] ?? '');\n values.forEach((value, i) => {\n parts.push(resolveInterpolation(adapter, value));\n parts.push(strings[i + 1] ?? '');\n });\n return new RawSqlBuilderImpl(parts);\n };\n}\n\nclass RawSqlBuilderImpl implements RawSqlBuilder {\n constructor(private readonly parts: readonly (string | AstExpression | ParamRef)[]) {}\n\n returns<S extends string>(spec: S): Expression<{ codecId: S; nullable: false }>;\n returns<S extends string, N extends boolean = false>(spec: {\n readonly codecId: S;\n readonly nullable?: N;\n }): Expression<{ codecId: S; nullable: N }>;\n returns(\n spec: string | { readonly codecId: string; readonly nullable?: boolean },\n ): Expression<{ codecId: string; nullable: boolean }> {\n const codecId = typeof spec === 'string' ? spec : spec.codecId;\n const nullable = typeof spec === 'string' ? false : (spec.nullable ?? false);\n const paramSpec: ParamSpec = { codecId, nullable };\n const node = new RawExpr({ parts: this.parts, returns: paramSpec });\n return {\n returnType: { codecId, nullable },\n buildAst: () => node,\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAkFA,SAAgB,OAAO,OAAgB,OAAiC;CACtE,IAAI,iBAAiB,KAAK,GACxB,OAAO,MAAM,SAAS;CAExB,IAAI,UAAU,KAAA,GACZ,MAAM,aACJ,oCACA,qCAAqC,UAAU,OAAO,SAAS,OAAO,MAAM,0GAE9E;CAEF,OAAO,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC;AACrC;;;;AAKA,SAAgB,MAAS,OAAU,MAAqC;CACtE,OAAO,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAChE;;;;;;;;;;;AAYA,SAAgB,QAAQ,OAAsC;CAC5D,IAAI,CAAC,iBAAiB,KAAK,GAAG,OAAO,KAAA;CACrC,MAAM,UAAU;CAIhB,IAAI,QAAQ,OAAO,OAAO,QAAQ;CAClC,IAAI,QAAQ,YAAY,OAAO,OAAO,QAAQ,WAAW;CACzD,IAAI,QAAQ,YAAY,SAAS,OAAO,EAAE,SAAS,QAAQ,WAAW,QAAQ;AAEhF;AAEA,SAAS,iBAAiB,OAAiD;CACzE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,cAAc,SACd,OAAQ,MAAgC,aAAa;AAEzD;;;;AAeA,SAAgB,eAAqC,MAA4C;CAC/F,MAAM,CAAC,MAAM,GAAG,QAAQ,KAAK;CAC7B,MAAM,KAAK,IAAI,cAAc;EAC3B,QAAQ,KAAK;EACb;EACA,MAAM,KAAK,SAAS,IAAI,OAAO,KAAA;EAC/B,SAAS,KAAK;EACd,UAAU,KAAK;CACjB,CAAC;CACD,OAAO;EACL,YAAY,KAAK;EACjB,gBAAgB;CAClB;AACF;AAmCA,SAAS,qBACP,SACA,OAC0B;CAC1B,IAAI,iBAAiB,KAAK,GACxB,OAAO,MAAM,SAAS;CAExB,IAAI,iBAAiB,UACnB,OAAO;CAET,IACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,iBAAiB,YAEjB,OAAO,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,SAAS,QAAQ,WAAW,KAAK,EAAE,EAAE,CAAC;CAI7E,MAAM,aACJ,6CACA,6GACF;AACF;;;;;;AAOA,SAAgB,aAAa,SAAqC;CAChE,QAAQ,SAAS,GAAG,WAAW;EAC7B,MAAM,QAA+C,CAAC;EACtD,MAAM,KAAK,QAAQ,MAAM,EAAE;EAC3B,OAAO,SAAS,OAAO,MAAM;GAC3B,MAAM,KAAK,qBAAqB,SAAS,KAAK,CAAC;GAC/C,MAAM,KAAK,QAAQ,IAAI,MAAM,EAAE;EACjC,CAAC;EACD,OAAO,IAAI,kBAAkB,KAAK;CACpC;AACF;AAEA,IAAM,oBAAN,MAAiD;CAClB;CAA7B,YAAY,OAAwE;EAAvD,KAAA,QAAA;CAAwD;CAOrF,QACE,MACoD;EACpD,MAAM,UAAU,OAAO,SAAS,WAAW,OAAO,KAAK;EACvD,MAAM,WAAW,OAAO,SAAS,WAAW,QAAS,KAAK,YAAY;EACtE,MAAM,YAAuB;GAAE;GAAS;EAAS;EACjD,MAAM,OAAO,IAAI,QAAQ;GAAE,OAAO,KAAK;GAAO,SAAS;EAAU,CAAC;EAClE,OAAO;GACL,YAAY;IAAE;IAAS;GAAS;GAChC,gBAAgB;EAClB;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"expression.mjs","names":[],"sources":["../../src/expression.ts"],"sourcesContent":["import { runtimeError } from '@prisma-next/framework-components/runtime';\nimport type { ParamSpec } from '@prisma-next/operations';\nimport type { QueryOperationReturn } from '@prisma-next/sql-contract/types';\nimport type { SqlLoweringSpec } from '@prisma-next/sql-operations';\nimport type { CodecRef } from './ast/codec-types';\nimport type { AnyExpression as AstExpression, RawSqlLiteral } from './ast/types';\nimport { OperationExpr, ParamRef, RawExpr } from './ast/types';\n\nexport type ScopeField = {\n codecId: string;\n nullable: boolean;\n /**\n * Marks a list-typed (scalar-array) field. When `true`, the field is an\n * array of `codecId`-typed elements; list operations target it and the\n * element type is `codecId`. Absent/`false` for scalar fields. Carried so\n * `X` and `X[]` stay distinct at the type level (a list expression is not\n * assignable to a scalar `CodecExpression` slot).\n */\n many?: boolean;\n /**\n * Optional {@link CodecRef} derived from contract storage at scope construction time. Builder paths that mint column-bound `ParamRef` / `ProjectionItem` nodes stamp this slot onto the AST so encode/decode dispatch resolves through `contractCodecs.forCodecRef`. Leave `undefined` when the scope was built without contract storage (rare — tests, ad-hoc scopes).\n */\n codec?: CodecRef;\n};\n\nexport type CodecTypesBase = Record<string, { readonly input: unknown; readonly output: unknown }>;\n\n/**\n * A typed SQL expression. Identity is carried by the `returnType` descriptor (inherited from `QueryOperationReturn` and narrowed to `T`) — distinct `T` makes distinct Expression types structurally. `buildAst()` materialises the underlying AST node.\n */\nexport type Expression<T extends ScopeField> = QueryOperationReturn & {\n readonly returnType: T;\n buildAst(): AstExpression;\n};\n\ntype CodecIdsWithTrait<\n CT extends Record<string, { readonly input: unknown }>,\n RequiredTraits extends readonly string[],\n> = {\n [K in keyof CT & string]: CT[K] extends { readonly traits: infer T }\n ? [RequiredTraits[number]] extends [T]\n ? K\n : never\n : never;\n}[keyof CT & string];\n\ntype NullSuffix<N> = N extends true ? null : never;\n\n/**\n * Runtime value type for a slot bound to `CodecId` with the given\n * nullability — `CT[CodecId]['input']`, plus `null` when `Nullable` is true.\n */\nexport type CodecValue<\n CodecId extends string,\n Nullable extends boolean,\n CT extends Record<string, { readonly input: unknown }>,\n> = (CodecId extends keyof CT ? CT[CodecId]['input'] : never) | NullSuffix<Nullable>;\n\n/**\n * An expression or literal value targeting a specific codec.\n *\n * Accepts any of:\n * - An `Expression` whose codec matches exactly\n * - A raw JS value of the codec's `input` type\n * - `null` when `Nullable` is true\n *\n * `many?: never` makes this a *scalar* slot: a list expression (whose\n * `returnType` carries `many: true`) is rejected here, while scalar\n * expressions — which carry no `many` key at all — pass unchanged. The\n * discriminant lives on this operand slot, so scalar expression and scope\n * types never have to spell out `many: false`.\n */\nexport type CodecExpression<\n CodecId extends string,\n Nullable extends boolean,\n CT extends Record<string, { readonly input: unknown }>,\n> =\n | Expression<{ codecId: CodecId; nullable: Nullable; many?: never }>\n | CodecValue<CodecId, Nullable, CT>;\n\n/**\n * A list-typed expression: an {@link Expression} whose element codec is\n * `CodecId` and whose `returnType` carries `many: true`. The element identity\n * is the codec id, so list operations stay generic over the element type while\n * tying any element argument back to this list's `CodecId`.\n */\nexport type ScalarListExpression<CodecId extends string, Nullable extends boolean> = Expression<{\n codecId: CodecId;\n nullable: Nullable;\n many: true;\n}>;\n\n/**\n * An expression or literal value targeting any codec whose trait set contains all the required traits.\n *\n * Resolves the trait set to the union of matching codec identities via `CodecIdsWithTrait`, then reuses `CodecExpression` for the codec-id form.\n */\nexport type TraitExpression<\n Traits extends readonly string[],\n Nullable extends boolean,\n CT extends Record<string, { readonly input: unknown }>,\n> = CodecExpression<CodecIdsWithTrait<CT, Traits>, Nullable, CT>;\n\n/**\n * Resolve a raw value or an Expression into an AST expression node.\n *\n * When `value` is an Expression (duck-typed by its `buildAst` method), the AST it wraps is returned. Otherwise the value is embedded as a ParamRef tagged with the caller-supplied {@link CodecRef} (when known). The runtime resolves the ref via `contractCodecs.forCodecRef(codec)`; content-keyed memoisation collapses repeated lookups for the same logical column onto one shared codec.\n *\n * Operation implementations that compare a column-bound expression to a user value derive the column's {@link CodecRef} from the column-bound side (via {@link codecOf}) and forward it here so encode-side dispatch resolves to the per-instance codec for parameterized codec ids (`vector(1024)` vs. `vector(1536)`).\n */\nexport function toExpr(value: unknown, codec?: CodecRef): AstExpression {\n if (isExpressionLike(value)) {\n return value.buildAst();\n }\n if (codec === undefined) {\n throw runtimeError(\n 'RUNTIME.PARAM_REF_CODEC_REQUIRED',\n `Cannot construct a ParamRef for a ${value === null ? 'null' : typeof value} value without an explicit codec. ` +\n 'Provide a CodecRef at the call site or use a column-bound builder path.',\n );\n }\n return ParamRef.of(value, { codec });\n}\n\n/**\n * Construct a `ParamRef` for a value whose codec identity is known at call time. Use this when interpolating a value into a raw SQL expression and the codec cannot be inferred from context — e.g. `param(myDate, { codecId: 'pg/timestamptz@1' })`.\n */\nexport function param<T>(value: T, opts: { codecId: string }): ParamRef {\n return ParamRef.of(value, { codec: { codecId: opts.codecId } });\n}\n\n/**\n * Derive the {@link CodecRef} carried by an expression-like value.\n *\n * Resolution order:\n * 1. `wrapper.codec` — explicit column-bound {@link CodecRef} stamped at field-proxy time.\n * 2. `wrapper.returnType.codec` — scope-level codec when the scope was built from contract storage.\n * 3. `{ codecId: wrapper.returnType.codecId }` — minimal ref derived from the expression's declared codec id (covers synthetic expressions like `count()` whose returnType has a known codec id but no explicit column binding).\n *\n * Returns `undefined` for raw scalar values (non-expression-like).\n */\nexport function codecOf(value: unknown): CodecRef | undefined {\n if (!isExpressionLike(value)) return undefined;\n const wrapper = value as {\n codec?: CodecRef;\n returnType?: { codec?: CodecRef; codecId?: string };\n };\n if (wrapper.codec) return wrapper.codec;\n if (wrapper.returnType?.codec) return wrapper.returnType.codec;\n if (wrapper.returnType?.codecId) return { codecId: wrapper.returnType.codecId };\n return undefined;\n}\n\nfunction isExpressionLike(value: unknown): value is Expression<ScopeField> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'buildAst' in value &&\n typeof (value as { buildAst: unknown }).buildAst === 'function'\n );\n}\n\nexport interface BuildOperationSpec<R extends ScopeField> {\n readonly method: string;\n /**\n * The operation's arguments. The first element is the self argument (the value the operation is being applied to); the rest are the remaining user-supplied arguments.\n */\n readonly args: readonly [AstExpression, ...AstExpression[]];\n readonly returns: R & ParamSpec;\n readonly lowering: SqlLoweringSpec;\n}\n\n/**\n * Construct an OperationExpr AST node and wrap it as a typed Expression. Operation implementations use this to turn their user-facing arguments into the AST node the compilation pipeline eventually lowers to SQL.\n */\nexport function buildOperation<R extends ScopeField>(spec: BuildOperationSpec<R>): Expression<R> {\n const [self, ...rest] = spec.args;\n const op = new OperationExpr({\n method: spec.method,\n self,\n args: rest.length > 0 ? rest : undefined,\n returns: spec.returns,\n lowering: spec.lowering,\n });\n return {\n returnType: spec.returns,\n buildAst: () => op,\n };\n}\n\n/**\n * Resolves a codec id for a bare JavaScript value interpolated into a raw-SQL\n * template — e.g. `` rawSql`SELECT ${42}` `` calls `inferCodec(42)` to pick\n * the codec id (`pg/int4`, `sqlite/integer@1`, etc.) that will encode the\n * value as a bound parameter.\n *\n * Targets implement this once per dialect: examine the JS value's runtime\n * shape (number, bigint, string, boolean, `Uint8Array`) and return a codec\n * id known to the target's codec registry. Throw when the value falls\n * outside the supported set — callers should wrap such values with\n * `param(value, { codecId })` to declare the codec explicitly.\n */\nexport interface RawCodecInferer {\n inferCodec(value: RawSqlLiteral): string;\n}\n\n/** The one-method builder returned by a `RawSqlTag` template call before `.returns()` is called. */\nexport interface RawSqlBuilder {\n returns<S extends string>(spec: S): Expression<{ codecId: S; nullable: false }>;\n returns<S extends string, N extends boolean = false>(spec: {\n readonly codecId: S;\n readonly nullable?: N;\n }): Expression<{ codecId: S; nullable: N }>;\n}\n\n/** Tagged-template function returned by {@link createRawSql}. */\nexport type RawSqlTag = (\n strings: TemplateStringsArray,\n ...values: RawSqlInterpolation[]\n) => RawSqlBuilder;\n\ntype RawSqlInterpolation = Expression<ScopeField> | ParamRef | RawSqlLiteral;\n\nfunction resolveInterpolation(\n adapter: RawCodecInferer,\n value: RawSqlInterpolation,\n): AstExpression | ParamRef {\n if (isExpressionLike(value)) {\n return value.buildAst();\n }\n if (value instanceof ParamRef) {\n return value;\n }\n if (\n typeof value === 'number' ||\n typeof value === 'bigint' ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n value instanceof Uint8Array\n ) {\n return ParamRef.of(value, { codec: { codecId: adapter.inferCodec(value) } });\n }\n\n value satisfies never;\n throw runtimeError(\n 'RUNTIME.RAW_SQL_UNSUPPORTED_INTERPOLATION',\n 'unsupported JS value type for raw-SQL interpolation: wrap this value in `param(...)` with an explicit codec',\n );\n}\n\n/**\n * Create a tagged-template builder for raw SQL expressions. The returned tag accepts SQL string fragments interleaved with typed {@link Expression}, {@link ParamRef}, or bare {@link RawSqlLiteral} interpolations. Call `.returns(spec)` on the result to obtain a typed {@link Expression} whose AST is a {@link RawExpr}.\n *\n * Bare {@link RawSqlLiteral} interpolations are wrapped as `ParamRef` nodes with the codec resolved via `adapter.inferCodec(value)`. Use {@link param} when the codec cannot be inferred from the value alone (e.g. `Date`).\n */\nexport function createRawSql(adapter: RawCodecInferer): RawSqlTag {\n return (strings, ...values) => {\n const parts: (string | AstExpression | ParamRef)[] = [];\n parts.push(strings[0] ?? '');\n values.forEach((value, i) => {\n parts.push(resolveInterpolation(adapter, value));\n parts.push(strings[i + 1] ?? '');\n });\n return new RawSqlBuilderImpl(parts);\n };\n}\n\nclass RawSqlBuilderImpl implements RawSqlBuilder {\n constructor(private readonly parts: readonly (string | AstExpression | ParamRef)[]) {}\n\n returns<S extends string>(spec: S): Expression<{ codecId: S; nullable: false }>;\n returns<S extends string, N extends boolean = false>(spec: {\n readonly codecId: S;\n readonly nullable?: N;\n }): Expression<{ codecId: S; nullable: N }>;\n returns(\n spec: string | { readonly codecId: string; readonly nullable?: boolean },\n ): Expression<{ codecId: string; nullable: boolean }> {\n const codecId = typeof spec === 'string' ? spec : spec.codecId;\n const nullable = typeof spec === 'string' ? false : (spec.nullable ?? false);\n const paramSpec: ParamSpec = { codecId, nullable };\n const node = new RawExpr({ parts: this.parts, returns: paramSpec });\n return {\n returnType: { codecId, nullable },\n buildAst: () => node,\n };\n }\n}\n"],"mappings":";;;;;;;;;;AA8GA,SAAgB,OAAO,OAAgB,OAAiC;CACtE,IAAI,iBAAiB,KAAK,GACxB,OAAO,MAAM,SAAS;CAExB,IAAI,UAAU,KAAA,GACZ,MAAM,aACJ,oCACA,qCAAqC,UAAU,OAAO,SAAS,OAAO,MAAM,0GAE9E;CAEF,OAAO,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC;AACrC;;;;AAKA,SAAgB,MAAS,OAAU,MAAqC;CACtE,OAAO,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AAChE;;;;;;;;;;;AAYA,SAAgB,QAAQ,OAAsC;CAC5D,IAAI,CAAC,iBAAiB,KAAK,GAAG,OAAO,KAAA;CACrC,MAAM,UAAU;CAIhB,IAAI,QAAQ,OAAO,OAAO,QAAQ;CAClC,IAAI,QAAQ,YAAY,OAAO,OAAO,QAAQ,WAAW;CACzD,IAAI,QAAQ,YAAY,SAAS,OAAO,EAAE,SAAS,QAAQ,WAAW,QAAQ;AAEhF;AAEA,SAAS,iBAAiB,OAAiD;CACzE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,cAAc,SACd,OAAQ,MAAgC,aAAa;AAEzD;;;;AAeA,SAAgB,eAAqC,MAA4C;CAC/F,MAAM,CAAC,MAAM,GAAG,QAAQ,KAAK;CAC7B,MAAM,KAAK,IAAI,cAAc;EAC3B,QAAQ,KAAK;EACb;EACA,MAAM,KAAK,SAAS,IAAI,OAAO,KAAA;EAC/B,SAAS,KAAK;EACd,UAAU,KAAK;CACjB,CAAC;CACD,OAAO;EACL,YAAY,KAAK;EACjB,gBAAgB;CAClB;AACF;AAmCA,SAAS,qBACP,SACA,OAC0B;CAC1B,IAAI,iBAAiB,KAAK,GACxB,OAAO,MAAM,SAAS;CAExB,IAAI,iBAAiB,UACnB,OAAO;CAET,IACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,aACjB,iBAAiB,YAEjB,OAAO,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,SAAS,QAAQ,WAAW,KAAK,EAAE,EAAE,CAAC;CAI7E,MAAM,aACJ,6CACA,6GACF;AACF;;;;;;AAOA,SAAgB,aAAa,SAAqC;CAChE,QAAQ,SAAS,GAAG,WAAW;EAC7B,MAAM,QAA+C,CAAC;EACtD,MAAM,KAAK,QAAQ,MAAM,EAAE;EAC3B,OAAO,SAAS,OAAO,MAAM;GAC3B,MAAM,KAAK,qBAAqB,SAAS,KAAK,CAAC;GAC/C,MAAM,KAAK,QAAQ,IAAI,MAAM,EAAE;EACjC,CAAC;EACD,OAAO,IAAI,kBAAkB,KAAK;CACpC;AACF;AAEA,IAAM,oBAAN,MAAiD;CAClB;CAA7B,YAAY,OAAwE;EAAvD,KAAA,QAAA;CAAwD;CAOrF,QACE,MACoD;EACpD,MAAM,UAAU,OAAO,SAAS,WAAW,OAAO,KAAK;EACvD,MAAM,WAAW,OAAO,SAAS,WAAW,QAAS,KAAK,YAAY;EACtE,MAAM,YAAuB;GAAE;GAAS;EAAS;EACjD,MAAM,OAAO,IAAI,QAAQ;GAAE,OAAO,KAAK;GAAO,SAAS;EAAU,CAAC;EAClE,OAAO;GACL,YAAY;IAAE;IAAS;GAAS;GAChC,gBAAgB;EAClB;CACF;AACF"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { a as CodecMeta, c as ContractCodecRegistry, d as DescriptorCodecTraits, f as ExtractCodecTypes, h as SqlColumnRef, i as CodecDescriptor, l as DescriptorCodecId, m as SqlCodecInstanceContext, n as Codec, o as CodecRef, p as SqlCodecCallContext, r as CodecCallContext, s as CodecTrait, t as AnyCodecDescriptor, u as DescriptorCodecInput } from "./codec-types-DFLA6Hmj.mjs";
|
|
2
2
|
import { $ as RawExpr, A as IdentifierRef, B as ListExpression, C as EqColJoinOn, D as ExpressionRewriter, E as ExpressionFolder, F as JoinOnExpr, G as NullCheckExpr, H as LoweredParam, I as JsonArrayAggExpr, J as OrderByItem, K as OperationExpr, L as JsonObjectEntry, M as InsertOnConflict, N as InsertValue, O as ExpressionSource, P as JoinAst, Q as ProjectionItem, R as JsonObjectExpr, S as DoUpdateSetConflictAction, T as ExprVisitor, U as LoweredStatement, V as LiteralExpr, W as NotExpr, X as PreparedParamRef, Y as ParamRef, Z as ProjectionExpr, _ as DefaultValueExpr, a as AndExpr, at as TableRef, b as Direction, c as AnyInsertOnConflictAction, ct as UpdateAst, d as AnyParamRef, dt as WindowFuncExpr, et as RawSqlExpr, f as AnyQueryAst, ft as isQueryAst, g as ColumnRef, h as BinaryOp, ht as whereExprKinds, i as AggregateOpFn, it as SubqueryExpr, j as InsertAst, k as FunctionSource, l as AnyInsertValue, lt as WhereArg, m as BinaryExpr, mt as queryAstKinds, n as AggregateExpr, nt as SelectAst, o as AnyExpression, ot as TableSource, p as AstRewriter, pt as isWhereExpr, q as OrExpr, r as AggregateFn, rt as SelectAstOptions, s as AnyFromSource, st as ToWhereExpr, t as AggregateCountFn, tt as RawSqlLiteral, u as AnyOperationArg, ut as WindowFn, v as DeleteAst, w as ExistsExpr, x as DoNothingConflictAction, y as DerivedTableSource, z as LimitOffsetValue } from "./types-DQrmgP8Y.mjs";
|
|
3
|
-
import { a as
|
|
3
|
+
import { a as DdlColumnDefaultVisitor, c as DdlTableConstraint, d as LiteralColumnDefault, f as PrimaryKeyConstraint, i as DdlColumnDefault, l as ForeignKeyConstraint, m as isDdlNode, n as CheckExpressionConstraint, o as DdlColumnRenderContext, p as UniqueConstraint, r as DdlColumn, s as DdlNode, t as AnyDdlColumnDefault, u as FunctionColumnDefault } from "./ddl-types-Cd4p4EbE.mjs";
|
|
4
4
|
import { Adapter, AdapterProfile, AdapterTarget, Lowerer, LowererContext, MarkerReadResult, PreparedExecuteRequest, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID, SqlCharCodec, SqlCharDescriptor, SqlConnection, SqlDriver, SqlDriverState, SqlExecuteRequest, SqlExplainResult, SqlFloatCodec, SqlFloatDescriptor, SqlIntCodec, SqlIntDescriptor, SqlQueryResult, SqlQueryable, SqlTextCodec, SqlTextDescriptor, SqlTimestampCodec, SqlTimestampDescriptor, SqlTransaction, SqlVarcharCodec, SqlVarcharDescriptor, collectOrderedParamRefs, compact, sqlCharColumn, sqlCharDecode, sqlCharDescriptor, sqlCharEncode, sqlCharRenderOutputType, sqlFloatColumn, sqlFloatDecode, sqlFloatDescriptor, sqlFloatEncode, sqlIntColumn, sqlIntDecode, sqlIntDescriptor, sqlIntEncode, sqlTextColumn, sqlTextDecode, sqlTextDescriptor, sqlTextEncode, sqlTimestampColumn, sqlTimestampDecode, sqlTimestampDecodeJson, sqlTimestampDescriptor, sqlTimestampEncode, sqlTimestampEncodeJson, sqlTimestampRenderOutputType, sqlVarcharColumn, sqlVarcharDecode, sqlVarcharDescriptor, sqlVarcharEncode, sqlVarcharRenderOutputType } from "./exports/ast.mjs";
|
|
5
5
|
import { a as MutationDefaultsOptions, i as MutationDefaultsOp, n as CodecDescriptorRegistry, o as TypeHelperRegistry, r as ExecutionContext, t as AppliedMutationDefault } from "./query-lane-context-DFnJVqUH.mjs";
|
|
6
6
|
import { t as SqlExecutionPlan } from "./sql-execution-plan-DjMEAjKK.mjs";
|
|
7
7
|
import { C as TableKey, S as TableDef, T as TablesOf, _ as RawTemplateFactory, a as ColumnsOf, b as SqlBuilderOptions, c as META, d as ModelMetadata, f as OperationTypeSignature, g as RawFunctionOptions, h as RawFactory, i as ColumnResolutionContract, l as Meta, m as OperationsForTypeId, n as BuildParamsMap, o as ComputeColumnJsType, p as OperationTypes, r as CodecTypes, s as Expr, t as BuildOptions, u as ModelDef, v as RawTemplateOptions, w as TableMetadata, x as SqlPlan, y as RuntimeError } from "./types-lWs6p0ny.mjs";
|
|
8
8
|
import { n as planUnsupported, t as planInvalid } from "./errors-COyZClzw.mjs";
|
|
9
|
-
import { BuildOperationSpec, CodecExpression, CodecTypesBase, CodecValue, Expression, RawCodecInferer, RawSqlBuilder, RawSqlTag, ScopeField, TraitExpression, buildOperation, codecOf, createRawSql, param, toExpr } from "./exports/expression.mjs";
|
|
9
|
+
import { BuildOperationSpec, CodecExpression, CodecTypesBase, CodecValue, Expression, RawCodecInferer, RawSqlBuilder, RawSqlTag, ScalarListExpression, ScopeField, TraitExpression, buildOperation, codecOf, createRawSql, param, toExpr } from "./exports/expression.mjs";
|
|
10
10
|
import { a as SqlParamRefMutatorInternal, i as SqlParamRefMutator, n as ParamRefEntryUnion, o as createSqlParamRefMutator, r as ParamRefHandle, t as ParamRefEntry } from "./middleware-Dyyo4IP1.mjs";
|
|
11
11
|
import { n as planFromAst, t as SqlQueryPlan } from "./plan-DUjdGLY3.mjs";
|
|
12
12
|
import { n as SqlOrmPlan, t as RuntimeScope } from "./types-CUHnDsdV.mjs";
|
|
13
|
-
export { Adapter, AdapterProfile, AdapterTarget, AggregateCountFn, AggregateExpr, AggregateFn, AggregateOpFn, AndExpr, AnyCodecDescriptor, AnyDdlColumnDefault, AnyExpression, AnyFromSource, AnyInsertOnConflictAction, AnyInsertValue, AnyOperationArg, AnyParamRef, AnyQueryAst, AppliedMutationDefault, AstRewriter, BinaryExpr, BinaryOp, BuildOperationSpec, BuildOptions, BuildParamsMap, Codec, type CodecCallContext, type CodecDescriptor, CodecDescriptorRegistry, CodecExpression, CodecMeta, type CodecRef, type CodecTrait, CodecTypes, CodecTypesBase, CodecValue, ColumnRef, ColumnResolutionContract, ColumnsOf, ComputeColumnJsType, ContractCodecRegistry, DdlColumn, DdlColumnDefault, DdlColumnDefaultVisitor, DdlColumnRenderContext, DdlNode, DdlTableConstraint, DefaultValueExpr, DeleteAst, DerivedTableSource, DescriptorCodecId, DescriptorCodecInput, DescriptorCodecTraits, Direction, DoNothingConflictAction, DoUpdateSetConflictAction, EqColJoinOn, ExecutionContext, ExistsExpr, Expr, ExprVisitor, Expression, ExpressionFolder, ExpressionRewriter, ExpressionSource, ExtractCodecTypes, ForeignKeyConstraint, FunctionColumnDefault, FunctionSource, IdentifierRef, InsertAst, InsertOnConflict, InsertValue, JoinAst, JoinOnExpr, JsonArrayAggExpr, JsonObjectEntry, JsonObjectExpr, LimitOffsetValue, ListExpression, LiteralColumnDefault, LiteralExpr, LoweredParam, LoweredStatement, Lowerer, LowererContext, META, MarkerReadResult, Meta, ModelDef, ModelMetadata, MutationDefaultsOp, MutationDefaultsOptions, NotExpr, NullCheckExpr, OperationExpr, OperationTypeSignature, OperationTypes, OperationsForTypeId, OrExpr, OrderByItem, ParamRef, type ParamRefEntry, type ParamRefEntryUnion, type ParamRefHandle, PreparedExecuteRequest, PreparedParamRef, PrimaryKeyConstraint, ProjectionExpr, ProjectionItem, RawCodecInferer, RawExpr, RawFactory, RawFunctionOptions, RawSqlBuilder, RawSqlExpr, RawSqlLiteral, RawSqlTag, RawTemplateFactory, RawTemplateOptions, RuntimeError, type RuntimeScope, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID, ScopeField, SelectAst, SelectAstOptions, SqlBuilderOptions, SqlCharCodec, SqlCharDescriptor, SqlCodecCallContext, SqlCodecInstanceContext, SqlColumnRef, SqlConnection, SqlDriver, SqlDriverState, SqlExecuteRequest, type SqlExecutionPlan, SqlExplainResult, SqlFloatCodec, SqlFloatDescriptor, SqlIntCodec, SqlIntDescriptor, type SqlOrmPlan, type SqlParamRefMutator, type SqlParamRefMutatorInternal, SqlPlan, SqlQueryPlan, SqlQueryResult, SqlQueryable, SqlTextCodec, SqlTextDescriptor, SqlTimestampCodec, SqlTimestampDescriptor, SqlTransaction, SqlVarcharCodec, SqlVarcharDescriptor, SubqueryExpr, TableDef, TableKey, TableMetadata, TableRef, TableSource, TablesOf, ToWhereExpr, TraitExpression, TypeHelperRegistry, UniqueConstraint, UpdateAst, WhereArg, WindowFn, WindowFuncExpr, buildOperation, codecOf, collectOrderedParamRefs, compact, createRawSql, createSqlParamRefMutator, isDdlNode, isQueryAst, isWhereExpr, param, planFromAst, planInvalid, planUnsupported, queryAstKinds, sqlCharColumn, sqlCharDecode, sqlCharDescriptor, sqlCharEncode, sqlCharRenderOutputType, sqlFloatColumn, sqlFloatDecode, sqlFloatDescriptor, sqlFloatEncode, sqlIntColumn, sqlIntDecode, sqlIntDescriptor, sqlIntEncode, sqlTextColumn, sqlTextDecode, sqlTextDescriptor, sqlTextEncode, sqlTimestampColumn, sqlTimestampDecode, sqlTimestampDecodeJson, sqlTimestampDescriptor, sqlTimestampEncode, sqlTimestampEncodeJson, sqlTimestampRenderOutputType, sqlVarcharColumn, sqlVarcharDecode, sqlVarcharDescriptor, sqlVarcharEncode, sqlVarcharRenderOutputType, toExpr, whereExprKinds };
|
|
13
|
+
export { Adapter, AdapterProfile, AdapterTarget, AggregateCountFn, AggregateExpr, AggregateFn, AggregateOpFn, AndExpr, AnyCodecDescriptor, AnyDdlColumnDefault, AnyExpression, AnyFromSource, AnyInsertOnConflictAction, AnyInsertValue, AnyOperationArg, AnyParamRef, AnyQueryAst, AppliedMutationDefault, AstRewriter, BinaryExpr, BinaryOp, BuildOperationSpec, BuildOptions, BuildParamsMap, CheckExpressionConstraint, Codec, type CodecCallContext, type CodecDescriptor, CodecDescriptorRegistry, CodecExpression, CodecMeta, type CodecRef, type CodecTrait, CodecTypes, CodecTypesBase, CodecValue, ColumnRef, ColumnResolutionContract, ColumnsOf, ComputeColumnJsType, ContractCodecRegistry, DdlColumn, DdlColumnDefault, DdlColumnDefaultVisitor, DdlColumnRenderContext, DdlNode, DdlTableConstraint, DefaultValueExpr, DeleteAst, DerivedTableSource, DescriptorCodecId, DescriptorCodecInput, DescriptorCodecTraits, Direction, DoNothingConflictAction, DoUpdateSetConflictAction, EqColJoinOn, ExecutionContext, ExistsExpr, Expr, ExprVisitor, Expression, ExpressionFolder, ExpressionRewriter, ExpressionSource, ExtractCodecTypes, ForeignKeyConstraint, FunctionColumnDefault, FunctionSource, IdentifierRef, InsertAst, InsertOnConflict, InsertValue, JoinAst, JoinOnExpr, JsonArrayAggExpr, JsonObjectEntry, JsonObjectExpr, LimitOffsetValue, ListExpression, LiteralColumnDefault, LiteralExpr, LoweredParam, LoweredStatement, Lowerer, LowererContext, META, MarkerReadResult, Meta, ModelDef, ModelMetadata, MutationDefaultsOp, MutationDefaultsOptions, NotExpr, NullCheckExpr, OperationExpr, OperationTypeSignature, OperationTypes, OperationsForTypeId, OrExpr, OrderByItem, ParamRef, type ParamRefEntry, type ParamRefEntryUnion, type ParamRefHandle, PreparedExecuteRequest, PreparedParamRef, PrimaryKeyConstraint, ProjectionExpr, ProjectionItem, RawCodecInferer, RawExpr, RawFactory, RawFunctionOptions, RawSqlBuilder, RawSqlExpr, RawSqlLiteral, RawSqlTag, RawTemplateFactory, RawTemplateOptions, RuntimeError, type RuntimeScope, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID, ScalarListExpression, ScopeField, SelectAst, SelectAstOptions, SqlBuilderOptions, SqlCharCodec, SqlCharDescriptor, SqlCodecCallContext, SqlCodecInstanceContext, SqlColumnRef, SqlConnection, SqlDriver, SqlDriverState, SqlExecuteRequest, type SqlExecutionPlan, SqlExplainResult, SqlFloatCodec, SqlFloatDescriptor, SqlIntCodec, SqlIntDescriptor, type SqlOrmPlan, type SqlParamRefMutator, type SqlParamRefMutatorInternal, SqlPlan, SqlQueryPlan, SqlQueryResult, SqlQueryable, SqlTextCodec, SqlTextDescriptor, SqlTimestampCodec, SqlTimestampDescriptor, SqlTransaction, SqlVarcharCodec, SqlVarcharDescriptor, SubqueryExpr, TableDef, TableKey, TableMetadata, TableRef, TableSource, TablesOf, ToWhereExpr, TraitExpression, TypeHelperRegistry, UniqueConstraint, UpdateAst, WhereArg, WindowFn, WindowFuncExpr, buildOperation, codecOf, collectOrderedParamRefs, compact, createRawSql, createSqlParamRefMutator, isDdlNode, isQueryAst, isWhereExpr, param, planFromAst, planInvalid, planUnsupported, queryAstKinds, sqlCharColumn, sqlCharDecode, sqlCharDescriptor, sqlCharEncode, sqlCharRenderOutputType, sqlFloatColumn, sqlFloatDecode, sqlFloatDescriptor, sqlFloatEncode, sqlIntColumn, sqlIntDecode, sqlIntDescriptor, sqlIntEncode, sqlTextColumn, sqlTextDecode, sqlTextDescriptor, sqlTextEncode, sqlTimestampColumn, sqlTimestampDecode, sqlTimestampDecodeJson, sqlTimestampDescriptor, sqlTimestampEncode, sqlTimestampEncodeJson, sqlTimestampRenderOutputType, sqlVarcharColumn, sqlVarcharDecode, sqlVarcharDescriptor, sqlVarcharEncode, sqlVarcharRenderOutputType, toExpr, whereExprKinds };
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
import { A as RawSqlExpr, C as OperationExpr, D as PreparedParamRef, E as ParamRef, F as WindowFuncExpr, I as isQueryAst, L as isWhereExpr, M as SubqueryExpr, N as TableSource, O as ProjectionItem, P as UpdateAst, R as queryAstKinds, S as NullCheckExpr, T as OrderByItem, _ as JsonArrayAggExpr, a as DefaultValueExpr, b as LiteralExpr, c as DoNothingConflictAction, d as ExistsExpr, f as FunctionSource, g as JoinAst, h as InsertOnConflict, i as ColumnRef, j as SelectAst, k as RawExpr, l as DoUpdateSetConflictAction, m as InsertAst, n as AndExpr, o as DeleteAst, p as IdentifierRef, r as BinaryExpr, s as DerivedTableSource, t as AggregateExpr, u as EqColJoinOn, v as JsonObjectExpr, w as OrExpr, x as NotExpr, y as ListExpression, z as whereExprKinds } from "./types-
|
|
1
|
+
import { a as ForeignKeyConstraint, c as PrimaryKeyConstraint, i as DdlNode, l as UniqueConstraint, n as DdlColumn, o as FunctionColumnDefault, r as DdlColumnDefault, s as LiteralColumnDefault, t as CheckExpressionConstraint, u as isDdlNode } from "./ddl-types-DFKQr_qQ.mjs";
|
|
2
|
+
import { A as RawSqlExpr, C as OperationExpr, D as PreparedParamRef, E as ParamRef, F as WindowFuncExpr, I as isQueryAst, L as isWhereExpr, M as SubqueryExpr, N as TableSource, O as ProjectionItem, P as UpdateAst, R as queryAstKinds, S as NullCheckExpr, T as OrderByItem, _ as JsonArrayAggExpr, a as DefaultValueExpr, b as LiteralExpr, c as DoNothingConflictAction, d as ExistsExpr, f as FunctionSource, g as JoinAst, h as InsertOnConflict, i as ColumnRef, j as SelectAst, k as RawExpr, l as DoUpdateSetConflictAction, m as InsertAst, n as AndExpr, o as DeleteAst, p as IdentifierRef, r as BinaryExpr, s as DerivedTableSource, t as AggregateExpr, u as EqColJoinOn, v as JsonObjectExpr, w as OrExpr, x as NotExpr, y as ListExpression, z as whereExprKinds } from "./types-CaGVAsoT.mjs";
|
|
3
3
|
import { n as compact, t as collectOrderedParamRefs } from "./util-DQQgv2j1.mjs";
|
|
4
4
|
import { SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID, SqlCharCodec, SqlCharDescriptor, SqlFloatCodec, SqlFloatDescriptor, SqlIntCodec, SqlIntDescriptor, SqlTextCodec, SqlTextDescriptor, SqlTimestampCodec, SqlTimestampDescriptor, SqlVarcharCodec, SqlVarcharDescriptor, sqlCharColumn, sqlCharDecode, sqlCharDescriptor, sqlCharEncode, sqlCharRenderOutputType, sqlFloatColumn, sqlFloatDecode, sqlFloatDescriptor, sqlFloatEncode, sqlIntColumn, sqlIntDecode, sqlIntDescriptor, sqlIntEncode, sqlTextColumn, sqlTextDecode, sqlTextDescriptor, sqlTextEncode, sqlTimestampColumn, sqlTimestampDecode, sqlTimestampDecodeJson, sqlTimestampDescriptor, sqlTimestampEncode, sqlTimestampEncodeJson, sqlTimestampRenderOutputType, sqlVarcharColumn, sqlVarcharDecode, sqlVarcharDescriptor, sqlVarcharEncode, sqlVarcharRenderOutputType } from "./exports/ast.mjs";
|
|
5
5
|
import { n as planUnsupported, t as planInvalid } from "./errors-BwyJxXME.mjs";
|
|
@@ -8,4 +8,4 @@ import { t as createSqlParamRefMutator } from "./middleware-CMr4CHNz.mjs";
|
|
|
8
8
|
import { planFromAst } from "./exports/plan.mjs";
|
|
9
9
|
import "./exports/query-lane-context.mjs";
|
|
10
10
|
import "./exports/types.mjs";
|
|
11
|
-
export { AggregateExpr, AndExpr, BinaryExpr, ColumnRef, DdlColumn, DdlColumnDefault, DdlNode, DefaultValueExpr, DeleteAst, DerivedTableSource, DoNothingConflictAction, DoUpdateSetConflictAction, EqColJoinOn, ExistsExpr, ForeignKeyConstraint, FunctionColumnDefault, FunctionSource, IdentifierRef, InsertAst, InsertOnConflict, JoinAst, JsonArrayAggExpr, JsonObjectExpr, ListExpression, LiteralColumnDefault, LiteralExpr, NotExpr, NullCheckExpr, OperationExpr, OrExpr, OrderByItem, ParamRef, PreparedParamRef, PrimaryKeyConstraint, ProjectionItem, RawExpr, RawSqlExpr, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID, SelectAst, SqlCharCodec, SqlCharDescriptor, SqlFloatCodec, SqlFloatDescriptor, SqlIntCodec, SqlIntDescriptor, SqlTextCodec, SqlTextDescriptor, SqlTimestampCodec, SqlTimestampDescriptor, SqlVarcharCodec, SqlVarcharDescriptor, SubqueryExpr, TableSource, UniqueConstraint, UpdateAst, WindowFuncExpr, buildOperation, codecOf, collectOrderedParamRefs, compact, createRawSql, createSqlParamRefMutator, isDdlNode, isQueryAst, isWhereExpr, param, planFromAst, planInvalid, planUnsupported, queryAstKinds, sqlCharColumn, sqlCharDecode, sqlCharDescriptor, sqlCharEncode, sqlCharRenderOutputType, sqlFloatColumn, sqlFloatDecode, sqlFloatDescriptor, sqlFloatEncode, sqlIntColumn, sqlIntDecode, sqlIntDescriptor, sqlIntEncode, sqlTextColumn, sqlTextDecode, sqlTextDescriptor, sqlTextEncode, sqlTimestampColumn, sqlTimestampDecode, sqlTimestampDecodeJson, sqlTimestampDescriptor, sqlTimestampEncode, sqlTimestampEncodeJson, sqlTimestampRenderOutputType, sqlVarcharColumn, sqlVarcharDecode, sqlVarcharDescriptor, sqlVarcharEncode, sqlVarcharRenderOutputType, toExpr, whereExprKinds };
|
|
11
|
+
export { AggregateExpr, AndExpr, BinaryExpr, CheckExpressionConstraint, ColumnRef, DdlColumn, DdlColumnDefault, DdlNode, DefaultValueExpr, DeleteAst, DerivedTableSource, DoNothingConflictAction, DoUpdateSetConflictAction, EqColJoinOn, ExistsExpr, ForeignKeyConstraint, FunctionColumnDefault, FunctionSource, IdentifierRef, InsertAst, InsertOnConflict, JoinAst, JsonArrayAggExpr, JsonObjectExpr, ListExpression, LiteralColumnDefault, LiteralExpr, NotExpr, NullCheckExpr, OperationExpr, OrExpr, OrderByItem, ParamRef, PreparedParamRef, PrimaryKeyConstraint, ProjectionItem, RawExpr, RawSqlExpr, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID, SelectAst, SqlCharCodec, SqlCharDescriptor, SqlFloatCodec, SqlFloatDescriptor, SqlIntCodec, SqlIntDescriptor, SqlTextCodec, SqlTextDescriptor, SqlTimestampCodec, SqlTimestampDescriptor, SqlVarcharCodec, SqlVarcharDescriptor, SubqueryExpr, TableSource, UniqueConstraint, UpdateAst, WindowFuncExpr, buildOperation, codecOf, collectOrderedParamRefs, compact, createRawSql, createSqlParamRefMutator, isDdlNode, isQueryAst, isWhereExpr, param, planFromAst, planInvalid, planUnsupported, queryAstKinds, sqlCharColumn, sqlCharDecode, sqlCharDescriptor, sqlCharEncode, sqlCharRenderOutputType, sqlFloatColumn, sqlFloatDecode, sqlFloatDescriptor, sqlFloatEncode, sqlIntColumn, sqlIntDecode, sqlIntDescriptor, sqlIntEncode, sqlTextColumn, sqlTextDecode, sqlTextDescriptor, sqlTextEncode, sqlTimestampColumn, sqlTimestampDecode, sqlTimestampDecodeJson, sqlTimestampDescriptor, sqlTimestampEncode, sqlTimestampEncodeJson, sqlTimestampRenderOutputType, sqlVarcharColumn, sqlVarcharDecode, sqlVarcharDescriptor, sqlVarcharEncode, sqlVarcharRenderOutputType, toExpr, whereExprKinds };
|
|
@@ -11,10 +11,14 @@ function frozenRecordCopy(record) {
|
|
|
11
11
|
}
|
|
12
12
|
function frozenCodecRef(codec) {
|
|
13
13
|
const typeParams = codec.typeParams === void 0 ? void 0 : structuredClone(codec.typeParams);
|
|
14
|
-
|
|
14
|
+
const base = typeParams === void 0 ? { codecId: codec.codecId } : {
|
|
15
15
|
codecId: codec.codecId,
|
|
16
16
|
typeParams
|
|
17
|
-
}
|
|
17
|
+
};
|
|
18
|
+
return Object.freeze(codec.many ? {
|
|
19
|
+
...base,
|
|
20
|
+
many: true
|
|
21
|
+
} : base);
|
|
18
22
|
}
|
|
19
23
|
function freezeRows(rows) {
|
|
20
24
|
return Object.freeze(rows.map((row) => Object.freeze({ ...row })));
|
|
@@ -1301,4 +1305,4 @@ function isWhereExpr(value) {
|
|
|
1301
1305
|
//#endregion
|
|
1302
1306
|
export { RawSqlExpr as A, OperationExpr as C, PreparedParamRef as D, ParamRef as E, WindowFuncExpr as F, isQueryAst as I, isWhereExpr as L, SubqueryExpr as M, TableSource as N, ProjectionItem as O, UpdateAst as P, queryAstKinds as R, NullCheckExpr as S, OrderByItem as T, JsonArrayAggExpr as _, DefaultValueExpr as a, LiteralExpr as b, DoNothingConflictAction as c, ExistsExpr as d, FunctionSource as f, JoinAst as g, InsertOnConflict as h, ColumnRef as i, SelectAst as j, RawExpr as k, DoUpdateSetConflictAction as l, InsertAst as m, AndExpr as n, DeleteAst as o, IdentifierRef as p, BinaryExpr as r, DerivedTableSource as s, AggregateExpr as t, EqColJoinOn as u, JsonObjectExpr as v, OrExpr as w, NotExpr as x, ListExpression as y, whereExprKinds as z };
|
|
1303
1307
|
|
|
1304
|
-
//# sourceMappingURL=types-
|
|
1308
|
+
//# sourceMappingURL=types-CaGVAsoT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-CaGVAsoT.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 const base =\n typeParams === undefined ? { codecId: codec.codecId } : { codecId: codec.codecId, typeParams };\n return Object.freeze(codec.many ? { ...base, many: true } : base);\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 FunctionSource extends FromSource {\n readonly kind = 'function-source' as const;\n readonly fn: string;\n readonly args: ReadonlyArray<AnyExpression>;\n readonly alias: string | undefined;\n\n protected constructor(fn: string, args: ReadonlyArray<AnyExpression>, alias?: string) {\n super();\n this.fn = fn;\n this.args = frozenArrayCopy(args);\n this.alias = alias;\n this.freeze();\n }\n\n static of(fn: string, args: ReadonlyArray<AnyExpression>, alias?: string): FunctionSource {\n return new FunctionSource(fn, args, alias);\n }\n\n override rewrite(rewriter: AstRewriter): AnyFromSource {\n const rewrittenArgs = this.args.map((arg) => rewriteComparable(arg, rewriter));\n if (rewrittenArgs.every((arg, i) => arg === this.args[i])) return this;\n return new FunctionSource(this.fn, rewrittenArgs, this.alias);\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 | undefined;\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 static noFrom(): SelectAst {\n return new SelectAst({\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 private toOptions(): SelectAstOptions {\n return {\n ...(this.from !== undefined ? { from: this.from } : {}),\n joins: this.joins,\n projection: this.projection,\n where: this.where,\n orderBy: this.orderBy,\n distinct: this.distinct,\n distinctOn: this.distinctOn,\n groupBy: this.groupBy,\n having: this.having,\n limit: this.limit,\n offset: this.offset,\n selectAllIntent: this.selectAllIntent,\n };\n }\n\n withFrom(from: AnyFromSource): SelectAst {\n return new SelectAst({ ...this.toOptions(), from });\n }\n\n withJoins(joins: ReadonlyArray<JoinAst>): SelectAst {\n return new SelectAst({\n ...this.toOptions(),\n joins: joins.length > 0 ? joins : undefined,\n });\n }\n\n withProjection(projection: ReadonlyArray<ProjectionItem>): SelectAst {\n return new SelectAst({ ...this.toOptions(), projection });\n }\n\n addProjection(alias: string, expr: ProjectionExpr): SelectAst {\n return new SelectAst({\n ...this.toOptions(),\n projection: [...this.projection, new ProjectionItem(alias, expr)],\n });\n }\n\n withWhere(where: AnyExpression | undefined): SelectAst {\n return new SelectAst({ ...this.toOptions(), where });\n }\n\n withOrderBy(orderBy: ReadonlyArray<OrderByItem>): SelectAst {\n return new SelectAst({\n ...this.toOptions(),\n orderBy: orderBy.length > 0 ? orderBy : undefined,\n });\n }\n\n withDistinct(enabled = true): SelectAst {\n return new SelectAst({\n ...this.toOptions(),\n distinct: enabled ? true : undefined,\n });\n }\n\n withDistinctOn(distinctOn: ReadonlyArray<AnyExpression>): SelectAst {\n return new SelectAst({\n ...this.toOptions(),\n distinctOn: distinctOn.length > 0 ? distinctOn : undefined,\n });\n }\n\n withGroupBy(groupBy: ReadonlyArray<AnyExpression>): SelectAst {\n return new SelectAst({\n ...this.toOptions(),\n groupBy: groupBy.length > 0 ? groupBy : undefined,\n });\n }\n\n withHaving(having: AnyExpression | undefined): SelectAst {\n return new SelectAst({ ...this.toOptions(), having });\n }\n\n withLimit(limit: LimitOffsetValue | undefined): SelectAst {\n return new SelectAst({ ...this.toOptions(), limit });\n }\n\n withOffset(offset: LimitOffsetValue | undefined): SelectAst {\n return new SelectAst({ ...this.toOptions(), offset });\n }\n\n withSelectAllIntent(selectAllIntent: { readonly table?: string } | undefined): SelectAst {\n return new SelectAst({ ...this.toOptions(), selectAllIntent });\n }\n\n rewrite(rewriter: AstRewriter): SelectAst {\n const rewrittenFrom = this.from?.rewrite(rewriter);\n const rewritten = new SelectAst({\n ...(rewrittenFrom !== undefined ? { from: rewrittenFrom } : {}),\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 } else if (this.from?.kind === 'function-source') {\n for (const arg of this.from.args) {\n pushRefs(arg.collectColumnRefs());\n }\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 } else if (join.source.kind === 'function-source') {\n for (const arg of join.source.args) {\n pushRefs(arg.collectColumnRefs());\n }\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 } else if (this.from?.kind === 'function-source') {\n for (const arg of this.from.args) {\n pushRefs(arg.collectParamRefs());\n }\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 } else if (join.source.kind === 'function-source') {\n for (const arg of join.source.args) {\n pushRefs(arg.collectParamRefs());\n }\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 | FunctionSource;\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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"}
|
package/package.json
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma-next/sql-relational-core",
|
|
3
|
-
"version": "0.14.0-dev.
|
|
3
|
+
"version": "0.14.0-dev.41",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"description": "AST types, query lane context, and type utilities for Prisma Next SQL lanes",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@prisma-next/contract": "0.14.0-dev.
|
|
10
|
-
"@prisma-next/framework-components": "0.14.0-dev.
|
|
11
|
-
"@prisma-next/operations": "0.14.0-dev.
|
|
12
|
-
"@prisma-next/sql-contract": "0.14.0-dev.
|
|
13
|
-
"@prisma-next/sql-operations": "0.14.0-dev.
|
|
14
|
-
"@prisma-next/utils": "0.14.0-dev.
|
|
9
|
+
"@prisma-next/contract": "0.14.0-dev.41",
|
|
10
|
+
"@prisma-next/framework-components": "0.14.0-dev.41",
|
|
11
|
+
"@prisma-next/operations": "0.14.0-dev.41",
|
|
12
|
+
"@prisma-next/sql-contract": "0.14.0-dev.41",
|
|
13
|
+
"@prisma-next/sql-operations": "0.14.0-dev.41",
|
|
14
|
+
"@prisma-next/utils": "0.14.0-dev.41",
|
|
15
15
|
"@standard-schema/spec": "^1.1.0",
|
|
16
16
|
"arktype": "^2.2.0",
|
|
17
17
|
"ts-toolbelt": "^9.6.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@prisma-next/sql-contract-ts": "0.14.0-dev.
|
|
21
|
-
"@prisma-next/test-utils": "0.14.0-dev.
|
|
22
|
-
"@prisma-next/tsconfig": "0.14.0-dev.
|
|
23
|
-
"@prisma-next/tsdown": "0.14.0-dev.
|
|
20
|
+
"@prisma-next/sql-contract-ts": "0.14.0-dev.41",
|
|
21
|
+
"@prisma-next/test-utils": "0.14.0-dev.41",
|
|
22
|
+
"@prisma-next/tsconfig": "0.14.0-dev.41",
|
|
23
|
+
"@prisma-next/tsdown": "0.14.0-dev.41",
|
|
24
24
|
"tsdown": "0.22.1",
|
|
25
25
|
"typescript": "5.9.3",
|
|
26
26
|
"vitest": "4.1.8"
|
package/src/ast/ddl-types.ts
CHANGED
|
@@ -200,4 +200,29 @@ export class UniqueConstraint {
|
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
/**
|
|
204
|
+
* A table-level CHECK constraint carrying a raw SQL predicate expression. Used
|
|
205
|
+
* for checks that are not enum value-set restrictions — e.g. the element-non-null
|
|
206
|
+
* constraint on a scalar-array column (`array_position(col, NULL) IS NULL`).
|
|
207
|
+
* The `expression` is emitted verbatim, so callers must supply safe,
|
|
208
|
+
* pre-validated SQL.
|
|
209
|
+
*
|
|
210
|
+
* Frozen on construction — immutable after creation.
|
|
211
|
+
*/
|
|
212
|
+
export class CheckExpressionConstraint {
|
|
213
|
+
readonly kind = 'check-expression' as const;
|
|
214
|
+
readonly name: string;
|
|
215
|
+
readonly expression: string;
|
|
216
|
+
|
|
217
|
+
constructor(options: { readonly name: string; readonly expression: string }) {
|
|
218
|
+
this.name = options.name;
|
|
219
|
+
this.expression = options.expression;
|
|
220
|
+
Object.freeze(this);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export type DdlTableConstraint =
|
|
225
|
+
| PrimaryKeyConstraint
|
|
226
|
+
| ForeignKeyConstraint
|
|
227
|
+
| UniqueConstraint
|
|
228
|
+
| CheckExpressionConstraint;
|
package/src/ast/types.ts
CHANGED
|
@@ -107,9 +107,9 @@ function frozenCodecRef(codec: CodecRef): CodecRef {
|
|
|
107
107
|
codec.typeParams === undefined
|
|
108
108
|
? undefined
|
|
109
109
|
: (structuredClone(codec.typeParams) as CodecRef['typeParams']);
|
|
110
|
-
|
|
111
|
-
typeParams === undefined ? { codecId: codec.codecId } : { codecId: codec.codecId, typeParams }
|
|
112
|
-
);
|
|
110
|
+
const base =
|
|
111
|
+
typeParams === undefined ? { codecId: codec.codecId } : { codecId: codec.codecId, typeParams };
|
|
112
|
+
return Object.freeze(codec.many ? { ...base, many: true } : base);
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
function freezeRows(
|
|
@@ -2,6 +2,7 @@ import type { JsonValue } from '@prisma-next/contract/types';
|
|
|
2
2
|
import type { CodecRef } from '@prisma-next/framework-components/codec';
|
|
3
3
|
import { resolveStorageTable } from '@prisma-next/sql-contract/resolve-storage-table';
|
|
4
4
|
import { isStorageTypeInstance, type SqlStorage } from '@prisma-next/sql-contract/types';
|
|
5
|
+
import { blindCast } from '@prisma-next/utils/casts';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Derive the canonical {@link CodecRef} for a `(table, column)` pair against a {@link SqlStorage}. This is the build-time path every column-bound `ParamRef` / `ProjectionItem` uses to stamp its `codec` slot before the AST is handed to the runtime — the runtime resolver then materialises a memoised {@link import('@prisma-next/sql-relational-core/ast').Codec} for the same `CodecRef` via `forCodecRef`.
|
|
@@ -42,7 +43,15 @@ export function codecRefForStorageColumn(
|
|
|
42
43
|
return undefined;
|
|
43
44
|
}
|
|
44
45
|
if (columnDef.typeParams !== undefined && Object.keys(columnDef.typeParams).length > 0) {
|
|
45
|
-
|
|
46
|
+
const typeParams = blindCast<
|
|
47
|
+
JsonValue,
|
|
48
|
+
'column typeParams is a validated contract record; its values are JSON-serialisable'
|
|
49
|
+
>(columnDef.typeParams);
|
|
50
|
+
return columnDef.many
|
|
51
|
+
? { codecId: columnDef.codecId, typeParams, many: true }
|
|
52
|
+
: { codecId: columnDef.codecId, typeParams };
|
|
46
53
|
}
|
|
47
|
-
return
|
|
54
|
+
return columnDef.many
|
|
55
|
+
? { codecId: columnDef.codecId, many: true }
|
|
56
|
+
: { codecId: columnDef.codecId };
|
|
48
57
|
}
|
|
@@ -3,6 +3,7 @@ import type { ReferentialAction } from '@prisma-next/sql-contract/types';
|
|
|
3
3
|
import type { CodecRef } from '../ast/codec-types';
|
|
4
4
|
import type { AnyDdlColumnDefault } from '../ast/ddl-types';
|
|
5
5
|
import {
|
|
6
|
+
CheckExpressionConstraint,
|
|
6
7
|
DdlColumn,
|
|
7
8
|
ForeignKeyConstraint,
|
|
8
9
|
FunctionColumnDefault,
|
|
@@ -56,3 +57,7 @@ export function unique(
|
|
|
56
57
|
): UniqueConstraint {
|
|
57
58
|
return new UniqueConstraint({ columns, ...options });
|
|
58
59
|
}
|
|
60
|
+
|
|
61
|
+
export function checkExpression(name: string, expression: string): CheckExpressionConstraint {
|
|
62
|
+
return new CheckExpressionConstraint({ name, expression });
|
|
63
|
+
}
|
package/src/expression.ts
CHANGED
|
@@ -9,6 +9,14 @@ import { OperationExpr, ParamRef, RawExpr } from './ast/types';
|
|
|
9
9
|
export type ScopeField = {
|
|
10
10
|
codecId: string;
|
|
11
11
|
nullable: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Marks a list-typed (scalar-array) field. When `true`, the field is an
|
|
14
|
+
* array of `codecId`-typed elements; list operations target it and the
|
|
15
|
+
* element type is `codecId`. Absent/`false` for scalar fields. Carried so
|
|
16
|
+
* `X` and `X[]` stay distinct at the type level (a list expression is not
|
|
17
|
+
* assignable to a scalar `CodecExpression` slot).
|
|
18
|
+
*/
|
|
19
|
+
many?: boolean;
|
|
12
20
|
/**
|
|
13
21
|
* Optional {@link CodecRef} derived from contract storage at scope construction time. Builder paths that mint column-bound `ParamRef` / `ProjectionItem` nodes stamp this slot onto the AST so encode/decode dispatch resolves through `contractCodecs.forCodecRef`. Leave `undefined` when the scope was built without contract storage (rare — tests, ad-hoc scopes).
|
|
14
22
|
*/
|
|
@@ -55,12 +63,32 @@ export type CodecValue<
|
|
|
55
63
|
* - An `Expression` whose codec matches exactly
|
|
56
64
|
* - A raw JS value of the codec's `input` type
|
|
57
65
|
* - `null` when `Nullable` is true
|
|
66
|
+
*
|
|
67
|
+
* `many?: never` makes this a *scalar* slot: a list expression (whose
|
|
68
|
+
* `returnType` carries `many: true`) is rejected here, while scalar
|
|
69
|
+
* expressions — which carry no `many` key at all — pass unchanged. The
|
|
70
|
+
* discriminant lives on this operand slot, so scalar expression and scope
|
|
71
|
+
* types never have to spell out `many: false`.
|
|
58
72
|
*/
|
|
59
73
|
export type CodecExpression<
|
|
60
74
|
CodecId extends string,
|
|
61
75
|
Nullable extends boolean,
|
|
62
76
|
CT extends Record<string, { readonly input: unknown }>,
|
|
63
|
-
> =
|
|
77
|
+
> =
|
|
78
|
+
| Expression<{ codecId: CodecId; nullable: Nullable; many?: never }>
|
|
79
|
+
| CodecValue<CodecId, Nullable, CT>;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* A list-typed expression: an {@link Expression} whose element codec is
|
|
83
|
+
* `CodecId` and whose `returnType` carries `many: true`. The element identity
|
|
84
|
+
* is the codec id, so list operations stay generic over the element type while
|
|
85
|
+
* tying any element argument back to this list's `CodecId`.
|
|
86
|
+
*/
|
|
87
|
+
export type ScalarListExpression<CodecId extends string, Nullable extends boolean> = Expression<{
|
|
88
|
+
codecId: CodecId;
|
|
89
|
+
nullable: Nullable;
|
|
90
|
+
many: true;
|
|
91
|
+
}>;
|
|
64
92
|
|
|
65
93
|
/**
|
|
66
94
|
* An expression or literal value targeting any codec whose trait set contains all the required traits.
|