tempest-db-js 0.7.0 → 0.8.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/conditions.ts","../src/query.ts","../src/serialize.ts","../src/mutations.ts","../src/url.ts","../src/expressions.ts","../src/dialect.ts","../src/join.ts","../src/repository.ts","../src/active-record.ts","../src/relations.ts","../src/engine.ts","../src/index.ts"],"names":["fn","column","col","decode","update","sql","primaryKeyOf","createRequire","b"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * tempest-db-js — logical combinators for `where` (and/or/not).\n *\n * A `where` value is either the object form (an implicit AND of its fields) or a\n * `Condition` built with `and`/`or`/`not`. Both normalize to a `CondNode` tree\n * that every builder stores and the dialect compiles recursively — so select,\n * update, delete and join all share one condition language.\n */\n\nimport type { Operator, WhereInput } from \"./query.js\";\n\n/** Field-map condition (implicit AND of its entries). */\nexport interface CondFields {\n readonly kind: \"fields\";\n readonly fields: Record<string, unknown>;\n}\n\n/**\n * One side of a comparison: a column reference, a bound value, or a SQL function\n * applied to other expressions.\n *\n * A column reference carries the **property** name, not the database column —\n * the dialect resolves it through the node's name map, so `col()` cannot become a\n * back door around an explicit `.name()` mapping.\n */\nexport type ExprNode =\n | { readonly kind: \"column\"; readonly name: string }\n | { readonly kind: \"value\"; readonly value: unknown }\n | { readonly kind: \"fn\"; readonly name: string; readonly args: readonly ExprNode[] };\n\n/** Logical condition nodes. */\nexport type CondNode =\n | CondFields\n | { readonly kind: \"and\"; readonly parts: readonly CondNode[] }\n | { readonly kind: \"or\"; readonly parts: readonly CondNode[] }\n | { readonly kind: \"not\"; readonly part: CondNode }\n | {\n readonly kind: \"compare\";\n readonly left: ExprNode;\n readonly op: Operator;\n readonly right: ExprNode;\n };\n\nconst CONDITION = Symbol.for(\"tempest-db-js.condition\");\n\n/** A composed condition produced by `and`/`or`/`not`. */\nexport interface Condition {\n readonly [CONDITION]: true;\n readonly node: CondNode;\n}\n\n/** Runtime guard: is this value a composed `Condition`? */\nexport function isCondition(value: unknown): value is Condition {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as Record<PropertyKey, unknown>)[CONDITION] === true\n );\n}\n\n/** Normalize a where argument (object form or `Condition`) to a `CondNode`. */\nexport function toCondNode(input: Condition | Record<string, unknown>): CondNode {\n return isCondition(input) ? input.node : { kind: \"fields\", fields: input };\n}\n\nfunction wrap(node: CondNode): Condition {\n return { [CONDITION]: true, node };\n}\n\n/**\n * A `where` argument: the object form (keys typed against `Row`) or a `Condition`.\n *\n * @typeParam Row - the row type whose columns the field keys are checked against.\n * Defaults to a permissive shape; pass it explicitly (e.g. `or<UserRow>(...)`)\n * for full key + operator checking inside combinators.\n */\nexport type WhereArg<Row = Record<string, unknown>> = WhereInput<Row> | Condition;\n\n/** Normalize a comparison operand: an {@link Expression}, or a bound value. */\nfunction toExprNode(operand: unknown): ExprNode {\n return isExpression(operand) ? operand.node : { kind: \"value\", value: operand };\n}\n\n/**\n * Reject an {@link Expression} among operands that are bound as values.\n *\n * `IN` and `BETWEEN` bind their operands, so an expression slipped into the list\n * would be serialized by the driver instead of rendered as SQL — the same silent\n * corruption that `set()` guards against.\n *\n * @param op The operator name, for the message.\n * @param operands The operands to check.\n * @throws Error When any operand is an expression.\n */\nfunction assertValueOperands(op: string, operands: readonly unknown[]): void {\n if (operands.some(isExpression)) {\n throw new Error(\n `The \"${op}\" operator binds its operands, so it takes values, not expressions.`,\n );\n }\n}\n\n/** Runtime guard: is this operand a built {@link Expression}? */\nexport function isExpression(value: unknown): value is Expression {\n return value instanceof Expression;\n}\n\n/**\n * One side of a comparison, built with {@link col}, {@link val} or {@link fn}.\n *\n * The comparison methods mirror the `where` operators, but both sides are\n * expressions — which is what makes `col(\"total\").gt(col(\"paid\"))` and a\n * functional-index lookup like `fn.lower(\"email\").eq(fn.lower(val(probe)))`\n * expressible at all. An operand that is not an `Expression` is bound as a\n * parameter, so `.eq(probe)` stays safe by default.\n */\nexport class Expression {\n constructor(\n /** The expression AST the dialect renders. */\n readonly node: ExprNode,\n ) {}\n\n /** Compare this expression against another expression or a bound value. */\n private compare(op: Operator, operand: unknown): Condition {\n return wrap({ kind: \"compare\", left: this.node, op, right: toExprNode(operand) });\n }\n\n /** `=` (or `IS NULL` for a null value). */\n eq(operand: unknown): Condition {\n return this.compare(\"eq\", operand);\n }\n /** `<>` (or `IS NOT NULL` for a null value). */\n ne(operand: unknown): Condition {\n return this.compare(\"ne\", operand);\n }\n /** `>`. */\n gt(operand: unknown): Condition {\n return this.compare(\"gt\", operand);\n }\n /** `>=`. */\n gte(operand: unknown): Condition {\n return this.compare(\"gte\", operand);\n }\n /** `<`. */\n lt(operand: unknown): Condition {\n return this.compare(\"lt\", operand);\n }\n /** `<=`. */\n lte(operand: unknown): Condition {\n return this.compare(\"lte\", operand);\n }\n /** `LIKE` — `%` and `_` in the operand are wildcards. */\n like(pattern: string | Expression): Condition {\n return this.compare(\"like\", pattern);\n }\n /** `ILIKE` — case-insensitive **pattern** matching, wildcards included. */\n ilike(pattern: string | Expression): Condition {\n return this.compare(\"ilike\", pattern);\n }\n /** Case-insensitive equality (`lower(a) = lower(b)`), with no wildcards. */\n ieq(operand: unknown): Condition {\n return this.compare(\"ieq\", operand);\n }\n /**\n * `IN (...)` over a list of values.\n *\n * @param values The values to test against.\n * @returns The condition.\n * @throws Error When an entry is an {@link Expression} — a list operand is\n * bound, so an expression there would be serialized as a parameter instead of\n * rendered as SQL.\n */\n in(values: readonly unknown[]): Condition {\n assertValueOperands(\"in\", values);\n return this.compare(\"in\", values);\n }\n /**\n * `NOT IN (...)` over a list of values.\n *\n * @param values The values to exclude.\n * @returns The condition.\n * @throws Error When an entry is an {@link Expression} (see {@link Expression.in}).\n */\n notIn(values: readonly unknown[]): Condition {\n assertValueOperands(\"notIn\", values);\n return this.compare(\"notIn\", values);\n }\n /**\n * `BETWEEN lo AND hi` (inclusive).\n *\n * @param lo The lower bound.\n * @param hi The upper bound.\n * @returns The condition.\n * @throws Error When a bound is an {@link Expression} (see {@link Expression.in}).\n */\n between(lo: unknown, hi: unknown): Condition {\n assertValueOperands(\"between\", [lo, hi]);\n return this.compare(\"between\", [lo, hi]);\n }\n /** `IS NULL` (true) / `IS NOT NULL` (false). */\n isNull(value = true): Condition {\n return this.compare(\"isNull\", value);\n }\n}\n\n/**\n * A column reference, by **property** name.\n *\n * Pass the row type for key-safety: `col<UserRow>(\"total\")` rejects a name that\n * is not a column. The name is resolved through the model's column-name map at\n * compile time, exactly like the object form of `where`.\n *\n * @param name The model property name.\n * @returns An expression referencing that column.\n *\n * @example\n * ```ts\n * select(Order).where(col<OrderRow>(\"total\").gt(col<OrderRow>(\"paid\")));\n * // SELECT * FROM \"orders\" WHERE \"total\" > \"paid\"\n * ```\n */\nexport function col<Row = Record<string, unknown>>(name: keyof Row & string): Expression {\n return new Expression({ kind: \"column\", name });\n}\n\n/**\n * A bound value, for the places that take an expression and would otherwise read\n * a bare string as a column name (the arguments of {@link fn}).\n *\n * @param value The value to bind as a parameter.\n * @returns An expression that renders as a placeholder.\n */\nexport function val(value: unknown): Expression {\n return new Expression({ kind: \"value\", value });\n}\n\n/** Function names are interpolated verbatim, so they must be plain identifiers. */\nconst FUNCTION_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** Coerce a function argument: a bare string is a column, everything else a value. */\nfunction toArg(arg: Expression | string): ExprNode {\n return typeof arg === \"string\" ? { kind: \"column\", name: arg } : arg.node;\n}\n\n/**\n * Build a call to a SQL function.\n *\n * A bare string argument is a **column name** — that is the useful default here\n * (`fn.lower(\"username\")`), and it is why a literal has to be wrapped in\n * {@link val}. The function name is interpolated into the statement, so it is\n * validated as a plain identifier and must never come from user input; the\n * arguments are always rendered through the expression compiler.\n *\n * @param name The SQL function name.\n * @param args Column names or expressions.\n * @returns An expression for the call.\n * @throws Error When `name` is not a plain SQL identifier.\n */\nfunction call(name: string, ...args: (Expression | string)[]): Expression {\n if (!FUNCTION_NAME.test(name)) {\n throw new Error(\n `fn.call() takes a plain SQL function name; got ${JSON.stringify(name)}.`,\n );\n }\n return new Expression({ kind: \"fn\", name, args: args.map(toArg) });\n}\n\n/**\n * SQL functions usable on either side of a comparison.\n *\n * The named entries are the ones every supported dialect implements. Anything\n * else — `date_trunc`, `strftime`, a custom function — goes through\n * {@link fn.call}, which does not pretend to be portable.\n *\n * @example\n * ```ts\n * select(AdminUser).where(fn.lower(\"username\").eq(fn.lower(val(probe))));\n * // WHERE lower(\"username\") = lower($1)\n * ```\n */\nexport const fn = {\n /** `lower(x)`. */\n lower: (arg: Expression | string): Expression => call(\"lower\", arg),\n /** `upper(x)`. */\n upper: (arg: Expression | string): Expression => call(\"upper\", arg),\n /** `trim(x)`. */\n trim: (arg: Expression | string): Expression => call(\"trim\", arg),\n /** `length(x)`. */\n length: (arg: Expression | string): Expression => call(\"length\", arg),\n /** `abs(x)`. */\n abs: (arg: Expression | string): Expression => call(\"abs\", arg),\n /** `coalesce(a, b, ...)`. */\n coalesce: (...args: (Expression | string)[]): Expression => call(\"coalesce\", ...args),\n /**\n * Any other SQL function, by name. Portability is the caller's problem —\n * `date_trunc` is PostgreSQL, `strftime` is SQLite.\n */\n call,\n} as const;\n\n/** Combine conditions with `AND`. */\nexport function and<Row = Record<string, unknown>>(\n ...inputs: WhereArg<NoInfer<Row>>[]\n): Condition {\n return wrap({\n kind: \"and\",\n parts: inputs.map((i) => toCondNode(i as Record<string, unknown>)),\n });\n}\n\n/** Combine conditions with `OR`. */\nexport function or<Row = Record<string, unknown>>(\n ...inputs: WhereArg<NoInfer<Row>>[]\n): Condition {\n return wrap({\n kind: \"or\",\n parts: inputs.map((i) => toCondNode(i as Record<string, unknown>)),\n });\n}\n\n/** Negate a condition with `NOT`. */\nexport function not<Row = Record<string, unknown>>(\n input: WhereArg<NoInfer<Row>>,\n): Condition {\n return wrap({ kind: \"not\", part: toCondNode(input as Record<string, unknown>) });\n}\n","/**\n * tempest-db-js — Phase 2 feasibility spike: the typed query builder.\n *\n * The builder is PURE AST + phantom types. It does not touch a database — that is\n * Phase 4 (`session.execute`). This file proves that:\n * - `select(User)` infers the full row type,\n * - `select(User, [\"id\", \"name\"])` infers a `Pick` projection,\n * - `.where(...)` / `.orderBy(...)` reject keys that are not columns,\n * all at compile time.\n *\n * This is a SPIKE, not the final API.\n */\n\nimport { type CondNode, type Condition, toCondNode } from \"./conditions.js\";\nimport {\n type InferModel,\n type ModelClass,\n type NameMap,\n columnNamesOf,\n} from \"./index.js\";\n\n// --------------------------------------------------------------------------\n// AST\n// --------------------------------------------------------------------------\n\n/** Sort direction for ORDER BY. */\nexport type SortDirection = \"asc\" | \"desc\";\n\n/** One ORDER BY term. */\nexport interface OrderTerm {\n readonly column: string;\n readonly direction: SortDirection;\n}\n\n/** One aggregate expression in a grouped SELECT (`COUNT(*) AS \"n\"`). */\nexport interface AggregateTerm {\n readonly fn: \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\n /** The column to aggregate, or `\"*\"` (only valid for `count`). */\n readonly column: string | \"*\";\n /** The result alias. */\n readonly alias: string;\n}\n\n/**\n * A row-level locking clause (`SELECT ... FOR UPDATE`).\n *\n * `wait` decides what happens when another transaction already holds the lock:\n * `\"block\"` waits, `\"skipLocked\"` skips those rows (the job-queue claim), and\n * `\"noWait\"` fails immediately.\n */\nexport interface LockClause {\n readonly strength: \"update\" | \"share\";\n readonly wait: \"block\" | \"skipLocked\" | \"noWait\";\n /** Tables to lock (`FOR UPDATE OF t`); empty locks every table in the query. */\n readonly of: readonly string[];\n}\n\n/** Options accepted by {@link SelectBuilder.forUpdate} / {@link SelectBuilder.forShare}. */\nexport interface LockOptions {\n /** Skip rows another transaction has locked instead of waiting for them. */\n readonly skipLocked?: boolean;\n /** Fail immediately instead of waiting for a locked row. */\n readonly noWait?: boolean;\n /** Restrict the lock to these tables (`FOR UPDATE OF ...`). */\n readonly of?: readonly string[];\n}\n\n/** Serializable AST for a SELECT. Dialects (Phase 4) compile this to SQL. */\nexport interface SelectNode {\n readonly kind: \"select\";\n readonly table: string;\n /** Projected columns, or \"*\" for the whole row. */\n readonly columns: readonly string[] | \"*\";\n /** Emit `SELECT DISTINCT` when true. */\n readonly distinct: boolean;\n /** Aggregate expressions; when non-empty, this is a grouped/aggregate query. */\n readonly aggregates: readonly AggregateTerm[];\n /** `GROUP BY` columns. */\n readonly groupBy: readonly string[];\n readonly where: CondNode | undefined;\n /** `HAVING` condition, keyed by aggregate alias or grouped column. */\n readonly having?: CondNode | undefined;\n readonly orderBy: readonly OrderTerm[];\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n /** Row-level locking clause, or `undefined` for none. */\n readonly lock?: LockClause | undefined;\n /** Property → column map, or `undefined` when every name is the identity. */\n readonly names?: NameMap | undefined;\n}\n\n// --------------------------------------------------------------------------\n// where input typing (Phase 3 — operators typed per column type)\n// --------------------------------------------------------------------------\n\n/**\n * A SELECT projecting exactly one column of type `T`, usable as the operand of\n * `in` / `notIn`.\n *\n * Build it with {@link SelectBuilder.asSubquery}, which both narrows the\n * projection to one column and gives the operand its element type.\n */\nexport interface Subquery<T> {\n /** Phantom: the element type the subquery yields, read only by the type system. */\n readonly __element?: T;\n /** The AST the outer statement embeds. */\n readonly node: SelectNode;\n}\n\n/** Runtime guard: is this `in`/`notIn` operand a subquery rather than a list? */\nexport function isSubquery(value: unknown): value is Subquery<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { node?: { kind?: unknown } }).node?.kind === \"select\"\n );\n}\n\n/** Operators valid on every column type. */\ninterface BaseOperators<T> {\n /** Equal to. */\n eq?: T;\n /** Not equal to. */\n ne?: T;\n /**\n * One of the given values (`IN`) — a list, or a single-column\n * {@link Subquery} built with `.asSubquery(column)`.\n */\n in?: readonly T[] | Subquery<T>;\n /** None of the given values (`NOT IN`), as a list or a {@link Subquery}. */\n notIn?: readonly T[] | Subquery<T>;\n /** `IS NULL` (true) / `IS NOT NULL` (false). */\n isNull?: boolean;\n}\n\n/** Extra operators for ordered types (numbers, bigint, dates). */\ninterface OrderedOperators<T> extends BaseOperators<T> {\n /** Greater than. */\n gt?: T;\n /** Greater than or equal. */\n gte?: T;\n /** Less than. */\n lt?: T;\n /** Less than or equal. */\n lte?: T;\n /** Inclusive range `BETWEEN lo AND hi`. */\n between?: readonly [T, T];\n}\n\n/** Extra operators for string-like types. */\ninterface StringOperators<T> extends BaseOperators<T> {\n /** `LIKE` pattern (case-sensitive). `%` and `_` are wildcards. */\n like?: string;\n /**\n * `ILIKE` **pattern** (case-insensitive). This is pattern matching, not\n * equality: `%` and `_` in the operand are wildcards, so `{ ilike: \"%\" }`\n * matches every row. Never feed it unescaped user input — for a\n * case-insensitive *equality* test use {@link StringOperators.ieq}, and to\n * match a literal that may contain wildcards, wrap it in `escapeLike`.\n */\n ilike?: string;\n /**\n * Case-insensitive equality — compiles to `lower(col) = lower($1)`, with no\n * wildcards. The safe operator for a case-insensitive lookup (login, email),\n * and the one that matches a `lower(col)` functional index.\n */\n ieq?: T;\n}\n\n/** Extra operators for array columns (PostgreSQL). */\ninterface ArrayOperators<T> extends BaseOperators<T> {\n /** `@>` — the column contains every element of the operand. */\n contains?: T;\n /** `<@` — every element of the column is in the operand. */\n containedBy?: T;\n /** `&&` — the column and the operand share at least one element. */\n overlaps?: T;\n}\n\n/**\n * The operator object allowed for a column of (non-null) type `T`:\n * - `T[]` → equality, `in`, `contains`/`containedBy`/`overlaps` (PostgreSQL)\n * - `string` → equality, `in`, `like`/`ilike`/`ieq`\n * - `number` / `bigint` / `Date` → equality, `in`, ordered comparisons, `between`\n * - `boolean` → equality, `isNull`\n * - anything else (json/blob) → equality and `in` only\n */\nexport type OperatorsFor<T> = [T] extends [readonly unknown[]]\n ? ArrayOperators<T>\n : [T] extends [string]\n ? StringOperators<T>\n : [T] extends [number]\n ? OrderedOperators<T>\n : [T] extends [bigint]\n ? OrderedOperators<T>\n : [T] extends [Date]\n ? OrderedOperators<T>\n : [T] extends [boolean]\n ? BaseOperators<T>\n : BaseOperators<T>;\n\n/**\n * `where` shape: each key must be a real column; each value accepts either a\n * bare value (shorthand for `eq`) or an operator object restricted to operators\n * valid for that column's type. A `like` on a `number` column, or `gt` on a\n * `string`, is a compile error.\n */\nexport type WhereInput<Row = Record<string, unknown>> = {\n [K in keyof Row]?: Row[K] | OperatorsFor<NonNullable<Row[K]>>;\n};\n\n/** The full set of operator keys, for the dialect compiler to recognize. */\nexport const OPERATORS = [\n \"eq\",\n \"ne\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"like\",\n \"ilike\",\n \"ieq\",\n \"in\",\n \"notIn\",\n \"between\",\n \"isNull\",\n \"contains\",\n \"containedBy\",\n \"overlaps\",\n] as const;\n\n/** One supported operator name. */\nexport type Operator = (typeof OPERATORS)[number];\n\n// --------------------------------------------------------------------------\n// aggregate expressions\n// --------------------------------------------------------------------------\n\n/** An aggregate expression carrying its result type `T` as a phantom. */\nexport class Agg<T> {\n declare readonly __t: T;\n constructor(\n readonly fn: AggregateTerm[\"fn\"],\n readonly column: string | \"*\",\n ) {}\n}\n\n/** `COUNT(*)` — the number of rows in the group (never null). */\nexport function count(): Agg<number> {\n return new Agg<number>(\"count\", \"*\");\n}\n/** `SUM(column)` — null when the group has no non-null values. */\nexport function sum(column: string): Agg<number | null> {\n return new Agg<number | null>(\"sum\", column);\n}\n/** `AVG(column)` — null when the group has no non-null values. */\nexport function avg(column: string): Agg<number | null> {\n return new Agg<number | null>(\"avg\", column);\n}\n/** `MIN(column)` — numeric columns; null on an empty group. */\nexport function min(column: string): Agg<number | null> {\n return new Agg<number | null>(\"min\", column);\n}\n/** `MAX(column)` — numeric columns; null on an empty group. */\nexport function max(column: string): Agg<number | null> {\n return new Agg<number | null>(\"max\", column);\n}\n\n/** Extract the phantom result type of an aggregate expression. */\ntype AggResult<A> = A extends Agg<infer T> ? T : never;\n\n/** Flatten an intersection into a single object literal. */\ntype SimplifyProj<T> = { [K in keyof T]: T[K] } & {};\n\n// --------------------------------------------------------------------------\n// builder\n// --------------------------------------------------------------------------\n\n/**\n * Immutable, chainable SELECT builder.\n *\n * @typeParam Full - the complete row type (constrains where/orderBy keys).\n * @typeParam Proj - the projected result type returned on execution.\n */\nexport class SelectBuilder<Full, Proj = Full, Grouped extends boolean = false> {\n /** Phantom: the result element type, read only by the type system. */\n declare readonly __row: Proj;\n /** Phantom: `true` once `aggregate()` has made `having()` meaningful. */\n declare readonly __grouped: Grouped;\n\n constructor(\n readonly node: SelectNode,\n /** The source model, used to coerce rows on execution. */\n readonly source: ModelClass,\n ) {}\n\n private with(patch: Partial<SelectNode>): SelectBuilder<Full, Proj, Grouped> {\n return new SelectBuilder<Full, Proj, Grouped>(\n { ...this.node, ...patch },\n this.source,\n );\n }\n\n /** Add a WHERE filter: the object form (keys typed) or an `and`/`or`/`not`. */\n where(input: WhereInput<Full> | Condition): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ where: toCondNode(input as Record<string, unknown>) });\n }\n\n /**\n * Filter by the result of the aggregation (`HAVING`).\n *\n * Only available on a grouped builder — `.having()` before `.aggregate()` is a\n * compile error, not invalid SQL at runtime. Keys are the aggregate aliases you\n * named plus the grouped columns; `WHERE` still filters rows *before* grouping,\n * which is a different question.\n *\n * @param input The condition, keyed by alias or grouped column.\n * @returns A builder carrying the `HAVING` clause.\n *\n * @example\n * ```ts\n * select(Outbound)\n * .where({ status: \"queued\" })\n * .aggregate([\"consumer\"], { n: count() })\n * .having({ n: { gt: 100 } });\n * // ... GROUP BY \"consumer\" HAVING COUNT(*) > $2\n * ```\n */\n having(\n this: SelectBuilder<Full, Proj, true>,\n input: WhereInput<Proj> | Condition,\n ): SelectBuilder<Full, Proj, true> {\n return new SelectBuilder<Full, Proj, true>(\n { ...this.node, having: toCondNode(input as Record<string, unknown>) },\n this.source,\n );\n }\n\n /** Emit `SELECT DISTINCT` — drop duplicate rows. */\n distinct(): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ distinct: true });\n }\n\n /**\n * Group by columns and compute aggregates. The result row is the grouped\n * columns (typed from the model) plus one field per aggregate alias.\n *\n * @param groupBy The columns to group by (checked against the model). Pass `[]`\n * for a whole-table aggregate.\n * @param spec A map of result alias → aggregate expression ({@link count},\n * {@link sum}, {@link avg}, {@link min}, {@link max}).\n * @returns A builder whose row is `Pick<Full, K> & { [alias]: aggResult }`.\n *\n * @example\n * ```ts\n * select(Order).aggregate([\"status\"], { n: count(), total: sum(\"amount\") });\n * // rows: { status: string; n: number; total: number | null }[]\n * ```\n */\n aggregate<K extends keyof Full & string, S extends Record<string, Agg<unknown>>>(\n groupBy: readonly K[],\n spec: S,\n ): SelectBuilder<\n Full,\n SimplifyProj<Pick<Full, K> & { [A in keyof S]: AggResult<S[A]> }>,\n true\n > {\n const aggregates: AggregateTerm[] = Object.entries(spec).map(([alias, agg]) => ({\n fn: agg.fn,\n column: agg.column,\n alias,\n }));\n return new SelectBuilder(\n { ...this.node, aggregates, groupBy },\n this.source,\n ) as unknown as SelectBuilder<\n Full,\n SimplifyProj<Pick<Full, K> & { [A in keyof S]: AggResult<S[A]> }>,\n true\n >;\n }\n\n /**\n * Order by a column of the model, or — on a grouped query — by an aggregate\n * alias. Unlike `HAVING`, every dialect accepts the output alias in `ORDER BY`,\n * so the alias is emitted as written.\n *\n * @param column A model column, or a projected alias.\n * @param direction `\"asc\"` (default) or `\"desc\"`.\n * @returns A builder carrying the ordering term.\n */\n orderBy(\n column: (keyof Full & string) | (keyof Proj & string),\n direction: SortDirection = \"asc\",\n ): SelectBuilder<Full, Proj, Grouped> {\n return this.with({\n orderBy: [...this.node.orderBy, { column, direction }],\n });\n }\n\n /** Limit the number of rows. */\n limit(n: number): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ limit: n });\n }\n\n /** Skip the first `n` rows. */\n offset(n: number): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ offset: n });\n }\n\n /**\n * Narrow this SELECT to a single column and mark it as a subquery, so it can be\n * the operand of `in` / `notIn`.\n *\n * The whole query — `where`, `orderBy`, `limit`, and a locking clause — is\n * embedded in the outer statement, which is what collapses the claim-a-batch\n * pattern into one round trip instead of selecting ids and sending them back.\n *\n * @param column The single column to project (checked against the model).\n * @returns A subquery carrying that column's type.\n *\n * @example\n * ```ts\n * update(Outbound)\n * .set({ status: \"sending\", attempts: sql.raw(\"attempts + 1\") })\n * .where({\n * id: {\n * in: select(Outbound)\n * .where({ status: \"queued\" })\n * .orderBy(\"nextAttemptAt\")\n * .limit(10)\n * .forUpdate({ skipLocked: true })\n * .asSubquery(\"id\"),\n * },\n * })\n * .returning();\n * ```\n */\n asSubquery<K extends keyof Full & string>(column: K): Subquery<Full[K]> {\n return { node: { ...this.node, columns: [column] } } as Subquery<Full[K]>;\n }\n\n /**\n * Lock the selected rows for update (`SELECT ... FOR UPDATE`), à la\n * SQLAlchemy's `with_for_update()`.\n *\n * `{ skipLocked: true }` is the job-queue claim: competing workers each take a\n * disjoint batch instead of blocking on — or worse, double-processing — the\n * same rows.\n *\n * PostgreSQL and MySQL 8.0+ only. SQLite has no row-level locking, and its\n * dialect throws rather than emitting a `SELECT` that silently locks nothing —\n * a lock that does not exist only fails under production concurrency.\n *\n * @param options `skipLocked` / `noWait` wait behavior, and `of` to restrict\n * the lock to specific tables.\n * @returns A builder carrying the locking clause.\n * @throws Error When both `skipLocked` and `noWait` are set.\n *\n * @example\n * ```ts\n * const batch = await session.execute(\n * select(Outbound)\n * .where({ status: \"queued\" })\n * .orderBy(\"nextAttemptAt\")\n * .limit(10)\n * .forUpdate({ skipLocked: true }),\n * ).all();\n * ```\n */\n forUpdate(options?: LockOptions): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ lock: buildLock(\"update\", options) });\n }\n\n /**\n * Take a shared read lock on the selected rows (`SELECT ... FOR SHARE`), the\n * weaker counterpart of {@link SelectBuilder.forUpdate}.\n *\n * @param options `skipLocked` / `noWait` wait behavior, and `of` tables.\n * @returns A builder carrying the locking clause.\n * @throws Error When both `skipLocked` and `noWait` are set.\n */\n forShare(options?: LockOptions): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ lock: buildLock(\"share\", options) });\n }\n}\n\n/** Normalize {@link LockOptions} into the AST's {@link LockClause}. */\nfunction buildLock(\n strength: LockClause[\"strength\"],\n options: LockOptions | undefined,\n): LockClause {\n if (options?.skipLocked && options?.noWait) {\n throw new Error(\"forUpdate/forShare accept skipLocked or noWait, not both.\");\n }\n const wait: LockClause[\"wait\"] = options?.skipLocked\n ? \"skipLocked\"\n : options?.noWait\n ? \"noWait\"\n : \"block\";\n return { strength, wait, of: options?.of ?? [] };\n}\n\n// --------------------------------------------------------------------------\n// entrypoint\n// --------------------------------------------------------------------------\n\n/** Build a SELECT over every column of the model. */\nexport function select<C extends ModelClass>(\n model: C,\n): SelectBuilder<InferModel<C>, InferModel<C>>;\n\n/** Build a SELECT projecting only the given columns. */\nexport function select<C extends ModelClass, K extends keyof InferModel<C> & string>(\n model: C,\n columns: readonly K[],\n): SelectBuilder<InferModel<C>, Pick<InferModel<C>, K>>;\n\nexport function select(\n model: ModelClass,\n columns?: readonly string[],\n): SelectBuilder<unknown, unknown> {\n return new SelectBuilder(\n {\n kind: \"select\",\n table: model.tablename,\n columns: columns ?? \"*\",\n distinct: false,\n aggregates: [],\n groupBy: [],\n where: undefined,\n orderBy: [],\n limit: undefined,\n offset: undefined,\n names: columnNamesOf(model) ?? undefined,\n },\n model,\n );\n}\n","/**\n * tempest-db-js — row (de)serialization, à la Python's `model_dump` / `model_validate`.\n *\n * Rows in tempest-db-js are plain inferred objects. This module converts between three\n * representations, coercing each field by its column type:\n *\n * - **Row** — native JS values (`Date`, `bigint`, `Uint8Array`, parsed JSON).\n * - **Dict** — a plain object of native values, restricted to known columns.\n * - **JSON** — a JSON-safe object (`Date` → ISO string, `bigint` → string,\n * `Uint8Array` → base64), ready for `JSON.stringify`.\n *\n * `fromDict` rebuilds a validated Row from arbitrary input (e.g. an API payload),\n * coercing strings back to `Date`/`bigint`/`Uint8Array` and validating that\n * required columns are present.\n */\n\nimport {\n type Column,\n type ColumnType,\n type InferModel,\n type ModelClass,\n type NameMap,\n columnPropsOf,\n columnsOf,\n} from \"./index.js\";\n\n/** Raised when `fromDict` input fails validation against the model. */\nexport class ValidationError extends Error {\n constructor(\n readonly table: string,\n readonly issues: readonly string[],\n ) {\n super(`Validation failed for ${table}:\\n - ${issues.join(\"\\n - \")}`);\n this.name = \"ValidationError\";\n }\n}\n\n/** Base64-encode bytes (Node `Buffer`, falling back to a manual encoder). */\nfunction toBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") return Buffer.from(bytes).toString(\"base64\");\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\n/** Base64-decode to bytes. */\nfunction fromBase64(value: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") return new Uint8Array(Buffer.from(value, \"base64\"));\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Encode one native row value to its JSON-safe form, by column kind. */\nfunction encodeValue(column: Column<unknown>, value: unknown): unknown {\n if (value === null || value === undefined) return null;\n switch (column.type.kind) {\n case \"bigint\":\n return typeof value === \"bigint\" ? value.toString() : value;\n case \"date\":\n case \"datetime\":\n case \"timestamp\":\n return value instanceof Date ? value.toISOString() : value;\n case \"blob\":\n return value instanceof Uint8Array ? toBase64(value) : value;\n default:\n return value;\n }\n}\n\n/** Decode one dict value to its native row form, by column kind. */\nfunction decodeValue(column: Column<unknown>, value: unknown): unknown {\n if (value === null || value === undefined) return null;\n switch (column.type.kind) {\n case \"bigint\":\n return typeof value === \"bigint\" ? value : BigInt(value as string | number);\n case \"date\":\n case \"datetime\":\n case \"timestamp\":\n return value instanceof Date ? value : new Date(value as string | number);\n case \"blob\":\n return value instanceof Uint8Array ? value : fromBase64(value as string);\n case \"json\":\n return typeof value === \"string\" ? JSON.parse(value) : value;\n case \"array\": {\n const element = column.type.meta.element;\n const items = typeof value === \"string\" ? JSON.parse(value) : value;\n if (!Array.isArray(items)) return items;\n if (!element) return items;\n return items.map((item) => decodeValue({ type: element } as Column<unknown>, item));\n }\n case \"numeric\":\n return typeof value === \"string\" ? value : String(value);\n case \"boolean\":\n return typeof value === \"boolean\" ? value : value === 1 || value === \"true\";\n case \"smallint\":\n case \"integer\":\n case \"real\":\n case \"double\":\n return typeof value === \"number\" ? value : Number(value);\n default:\n return value; // varchar/text/char/uuid/enum/time → string passthrough\n }\n}\n\n/**\n * Convert a row to a plain dict of native values, restricted to known columns.\n * Strips any non-column properties; keeps `Date`/`bigint`/`Uint8Array` as-is.\n *\n * @param model The model class.\n * @param row The row object.\n * @returns A plain object with one entry per column.\n */\nexport function toDict<C extends ModelClass>(\n model: C,\n row: InferModel<C>,\n): Record<string, unknown> {\n const columns = columnsOf(model);\n const out: Record<string, unknown> = {};\n for (const name of Object.keys(columns)) {\n out[name] = (row as Record<string, unknown>)[name] ?? null;\n }\n return out;\n}\n\n/**\n * Convert a row to a JSON-safe object: `Date` → ISO string, `bigint` → string,\n * `Uint8Array` → base64. Ready to hand to `JSON.stringify`.\n *\n * @param model The model class.\n * @param row The row object.\n * @returns A JSON-safe object with one entry per column.\n */\nexport function toJSON<C extends ModelClass>(\n model: C,\n row: InferModel<C>,\n): Record<string, unknown> {\n const columns = columnsOf(model);\n const out: Record<string, unknown> = {};\n for (const [name, col] of Object.entries(columns)) {\n out[name] = encodeValue(col, (row as Record<string, unknown>)[name] ?? null);\n }\n return out;\n}\n\n/** Convenience: `toJSON` then `JSON.stringify`. */\nexport function stringify<C extends ModelClass>(model: C, row: InferModel<C>): string {\n return JSON.stringify(toJSON(model, row));\n}\n\n/**\n * Build a validated row from an arbitrary dict/JSON object (e.g. an API body).\n *\n * Each known column is coerced from the input to its native type (strings back\n * to `Date`/`bigint`/`Uint8Array`, JSON strings parsed). A column that is\n * `notNull`, has no default, and is missing/null in the input is a validation\n * error. Unknown keys in the input are ignored.\n *\n * @param model The model class.\n * @param data The input object (parsed JSON or a plain dict).\n * @returns A typed row.\n * @throws ValidationError When a required column is absent.\n */\nexport function fromDict<C extends ModelClass>(\n model: C,\n data: Record<string, unknown>,\n): InferModel<C> {\n const columns = columnsOf(model);\n const out: Record<string, unknown> = {};\n const issues: string[] = [];\n\n for (const [name, col] of Object.entries(columns)) {\n const present = name in data && data[name] !== undefined && data[name] !== null;\n if (!present) {\n const required = col.flags.notNull && !col.flags.hasDefault;\n if (required) {\n issues.push(`missing required column \"${name}\"`);\n continue;\n }\n out[name] = null;\n continue;\n }\n try {\n out[name] = decodeValue(col, data[name]);\n } catch (error) {\n issues.push(`column \"${name}\": ${(error as Error).message}`);\n }\n }\n\n if (issues.length > 0) {\n throw new ValidationError(model.tablename, issues);\n }\n return out as InferModel<C>;\n}\n\n/** Parse a JSON string then build a validated row. */\nexport function parse<C extends ModelClass>(model: C, json: string): InferModel<C> {\n return fromDict(model, JSON.parse(json) as Record<string, unknown>);\n}\n\n/** A per-column value decoder for the hot read path. */\ntype Decoder = (value: unknown) => unknown;\n\n/**\n * Build the specialized decoder for a column type, or `null` when the type needs\n * no coercion (varchar/text/char/uuid/enum/time — plain string passthrough).\n * Dispatching on the kind once here (at build time) keeps the per-row path a\n * single indirect call instead of a switch.\n */\nfunction decoderFor(type: ColumnType): Decoder | null {\n switch (type.kind) {\n case \"bigint\":\n return (v) => (v == null ? null : typeof v === \"bigint\" ? v : BigInt(v as string));\n case \"date\":\n case \"datetime\":\n case \"timestamp\":\n return (v) => (v == null ? null : v instanceof Date ? v : new Date(v as string));\n case \"blob\":\n return (v) =>\n v == null ? null : v instanceof Uint8Array ? v : fromBase64(v as string);\n case \"json\":\n return (v) => (v == null ? null : typeof v === \"string\" ? JSON.parse(v) : v);\n case \"array\": {\n const element = type.meta.element;\n const inner = element ? decoderFor(element) : null;\n if (!inner) return null;\n return (v) => (v == null ? null : Array.isArray(v) ? v.map(inner) : v);\n }\n case \"numeric\":\n return (v) => (v == null ? null : typeof v === \"string\" ? v : String(v));\n case \"boolean\":\n return (v) =>\n v == null ? null : typeof v === \"boolean\" ? v : v === 1 || v === \"true\";\n case \"smallint\":\n case \"integer\":\n case \"real\":\n case \"double\":\n return (v) => (v == null ? null : typeof v === \"number\" ? v : Number(v));\n default:\n return null; // varchar/text/char/uuid/enum/time → passthrough\n }\n}\n\n/**\n * Everything needed to turn a raw driver row into a model row: how to rename the\n * keys back into property space, and how to coerce the values.\n */\ninterface RowMapper {\n /** Database column → property name, or `null` when every name is the identity. */\n readonly props: NameMap | null;\n /** Database column → decoder, for the columns that need coercion. */\n readonly decoders: Map<string, Decoder>;\n}\n\n/** Memoized per-model row mappers. */\nconst mapperCache = new WeakMap<ModelClass, RowMapper>();\n\n/**\n * The (memoized) row mapper for a model. Keyed by **database** column name,\n * because that is what the driver hands back — a model that renames its columns\n * still lands in property space after one lookup.\n */\nfunction mapperFor(model: ModelClass): RowMapper {\n const cached = mapperCache.get(model);\n if (cached) return cached;\n const props = columnPropsOf(model);\n const names = props\n ? Object.fromEntries(Object.entries(props).map(([db, prop]) => [prop, db]))\n : null;\n const decoders = new Map<string, Decoder>();\n for (const [prop, col] of Object.entries(columnsOf(model))) {\n const decoder = decoderFor(col.type);\n if (decoder) decoders.set(names?.[prop] ?? prop, decoder);\n }\n const mapper: RowMapper = { props, decoders };\n mapperCache.set(model, mapper);\n return mapper;\n}\n\n/**\n * Coerce a raw driver row into native row values, by column type, renaming the\n * keys back to model property names when the model maps columns explicitly. Unlike\n * `fromDict`, it does NOT validate required columns — a row read from the\n * database (or a projection) is taken as-is, only its values are normalized\n * (e.g. `0/1` → boolean, ISO string → `Date`, JSON string → object). Keys that\n * are not columns of the model (or columns needing no coercion) pass through\n * untouched.\n *\n * Uses a memoized per-model decoder map so a large result set does not\n * re-reflect the model or re-dispatch the type switch on every row.\n *\n * @param model The model class.\n * @param raw The raw row returned by the driver.\n * @returns The row with native-typed values.\n */\nexport function coerceRow<C extends ModelClass>(\n model: C,\n raw: Record<string, unknown>,\n): InferModel<C> {\n const { props, decoders } = mapperFor(model);\n const out: Record<string, unknown> = {};\n for (const name of Object.keys(raw)) {\n const decode = decoders.get(name);\n out[props?.[name] ?? name] = decode ? decode(raw[name]) : raw[name];\n }\n return out as InferModel<C>;\n}\n","/**\n * tempest-db-js — Phase 2: typed INSERT / UPDATE / DELETE builders.\n *\n * Like `select`, these are PURE AST + phantom types — no database access. They\n * are executed in Phase 4 via `session.execute`.\n *\n * Safety rule: UPDATE and DELETE start in an *unguarded* type state. A builder\n * only becomes executable once it has a `.where(...)` clause or an explicit\n * `.unguarded()` opt-in. Phase 4's `session.execute` will accept only guarded\n * builders, making an accidental full-table write a compile error.\n */\n\nimport { type CondNode, type Condition, toCondNode } from \"./conditions.js\";\nimport {\n type InferInsert,\n type InferModel,\n type ModelClass,\n type NameMap,\n type SqlExpression,\n columnNamesOf,\n columnsOf,\n isSqlExpression,\n} from \"./index.js\";\nimport type { WhereInput } from \"./query.js\";\nimport { ValidationError } from \"./serialize.js\";\n\n// --------------------------------------------------------------------------\n// shared\n// --------------------------------------------------------------------------\n\n/** Columns to return from a mutation, or \"*\" for the whole row. */\nexport type Returning = readonly string[] | \"*\" | null;\n\n/**\n * A write shape over `Row`: every column accepts its own value **or** a\n * {@link SqlExpression}, which the dialect renders inline instead of binding.\n * Optionality is preserved from `Row`, so an insert shape keeps its defaults\n * optional.\n */\nexport type WriteValues<Row> = { [K in keyof Row]: Row[K] | SqlExpression };\n\n/** A partial write shape — the `SET` clause of an UPDATE or a `DO UPDATE`. */\nexport type WritePatch<Row> = { [K in keyof Row]?: Row[K] | SqlExpression };\n\n/**\n * Column kinds whose stored value is legitimately an object or an array. Every\n * other kind takes a scalar, so an object reaching it is a mistake.\n */\nconst STRUCTURED_KINDS: ReadonlySet<string> = new Set([\"json\", \"array\", \"blob\"]);\n\n/** True when a value is a scalar SQL can bind as-is. */\nfunction isBindableScalar(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n const type = typeof value;\n if (type === \"string\" || type === \"number\" || type === \"bigint\" || type === \"boolean\") {\n return true;\n }\n return value instanceof Date || value instanceof Uint8Array;\n}\n\n/**\n * Reject write values that SQL cannot bind meaningfully, before they reach the\n * driver.\n *\n * Without this, a stray object is bound as a parameter and the driver stringifies\n * it (or stores null), so a typo like `{ attempts: { raw: \"attempts + 1\" } }`\n * silently corrupts the column instead of failing. TypeScript already rejects it,\n * but JavaScript callers, an `as` cast, or data crossing a network boundary do\n * not go through the type-checker. To write an expression, use the branded\n * `sql.raw()` / `sql.expr` values.\n *\n * @param model The model the statement writes to.\n * @param values The column → value map from `set()` / `values()`.\n * @param clause The clause name, for the error message.\n * @throws ValidationError When a value is not bindable, or a key is not a column.\n */\nfunction assertWritableValues(\n model: ModelClass,\n values: Record<string, unknown>,\n clause: \"set\" | \"values\",\n): void {\n const columns = columnsOf(model);\n const issues: string[] = [];\n for (const [key, value] of Object.entries(values)) {\n const col = columns[key];\n if (!col) {\n issues.push(`${clause}: \"${key}\" is not a column of ${model.tablename}`);\n continue;\n }\n if (isSqlExpression(value) || isBindableScalar(value)) continue;\n if (typeof value === \"object\" && STRUCTURED_KINDS.has(col.type.kind)) continue;\n issues.push(\n `${clause}: \"${key}\" got ${describeValue(value)}, which cannot be bound to a ` +\n `${col.type.kind} column — use sql.raw()/sql.expr\\`...\\` for a SQL expression`,\n );\n }\n if (issues.length > 0) throw new ValidationError(model.tablename, issues);\n}\n\n/**\n * Reject a multi-row insert whose rows disagree about a **defaulted** column.\n *\n * Every row of one INSERT shares one column list, so a key present in some rows\n * and absent in others is bound as `NULL` for the rows that omit it. For a plain\n * nullable column that is exactly what omitting it meant anyway; for a column\n * with a `DEFAULT` (a primary key included) it is not — the row would be written\n * as NULL instead of taking its default. SQLite has no `DEFAULT` keyword inside\n * `VALUES`, so there is no portable per-row escape; failing loudly is the honest\n * option.\n *\n * @param model The model being inserted into.\n * @param rows The rows of this insert.\n * @throws ValidationError When rows disagree about a column that has a default.\n */\nfunction assertConsistentRows(\n model: ModelClass,\n rows: readonly Record<string, unknown>[],\n): void {\n if (rows.length < 2) return;\n const union = new Set<string>();\n for (const row of rows) for (const key of Object.keys(row)) union.add(key);\n const inconsistent = [...union].filter((key) => rows.some((row) => !(key in row)));\n if (inconsistent.length === 0) return;\n const columns = columnsOf(model);\n const defaulted = inconsistent.filter((key) => columns[key]?.flags.hasDefault);\n if (defaulted.length === 0) return;\n const named = defaulted.map((c) => `\"${c}\"`).join(\", \");\n const verb = defaulted.length === 1 ? \"has\" : \"have\";\n throw new ValidationError(model.tablename, [\n `values: ${named} ${verb} a default but is missing from some rows of this multi-row insert — every row shares one column list, so the omitting rows would be written as NULL instead of taking the default. Give the column in every row, or insert the rows separately.`,\n ]);\n}\n\n/** A short description of a rejected value, for the validation message. */\nfunction describeValue(value: unknown): string {\n if (typeof value === \"function\") return \"a function\";\n if (Array.isArray(value)) return \"an array\";\n if (typeof value === \"symbol\") return \"a symbol\";\n return \"an object\";\n}\n\n// --------------------------------------------------------------------------\n// INSERT\n// --------------------------------------------------------------------------\n\n/**\n * Conflict-resolution clause for an INSERT (`ON CONFLICT`). `target` is the\n * conflicting column(s) (a unique/PK constraint); `update` is `\"nothing\"` for\n * `DO NOTHING`, or the columns to overwrite for `DO UPDATE SET`.\n */\nexport interface OnConflict {\n readonly target: readonly string[];\n readonly update: Record<string, unknown> | \"nothing\";\n /**\n * The predicate of a **partial** unique index. PostgreSQL only matches a\n * partial index as a conflict target when `ON CONFLICT` repeats its predicate,\n * so without this an insert against `... WHERE key IS NOT NULL` is rejected\n * with \"there is no unique or exclusion constraint matching the ON CONFLICT\n * specification\".\n */\n readonly targetWhere?: CondNode | undefined;\n /** Extra condition restricting which conflicting rows `DO UPDATE` rewrites. */\n readonly updateWhere?: CondNode | undefined;\n}\n\n/** Options for the `ON CONFLICT` clause of {@link InsertBuilder.onConflictDoNothing}. */\nexport interface OnConflictOptions<Full> {\n /** The predicate of the partial unique index used as the conflict target. */\n readonly where?: WhereInput<Full> | Condition;\n}\n\n/** Options for {@link InsertBuilder.onConflictDoUpdate}. */\nexport interface OnConflictUpdateOptions<Full> {\n /** The predicate of the partial unique index used as the conflict target. */\n readonly indexWhere?: WhereInput<Full> | Condition;\n /** Extra condition deciding which conflicting rows are actually rewritten. */\n readonly updateWhere?: WhereInput<Full> | Condition;\n}\n\n/** Serializable AST for an INSERT. */\nexport interface InsertNode {\n readonly kind: \"insert\";\n readonly table: string;\n readonly values: readonly Record<string, unknown>[];\n readonly returning: Returning;\n /** Conflict handling (`ON CONFLICT ...`), or `undefined` for none. */\n readonly onConflict?: OnConflict;\n /** Property → column map, or `undefined` when every name is the identity. */\n readonly names?: NameMap | undefined;\n}\n\n/**\n * INSERT builder.\n *\n * @typeParam Full - the complete row type (for `returning`).\n * @typeParam Ins - the insert shape (defaults/PK optional).\n * @typeParam Ret - execution result: `number` (rows affected) until `returning`.\n */\nexport class InsertBuilder<Full, Ins, Ret = number> {\n declare readonly __row: Ret;\n\n constructor(\n readonly node: InsertNode,\n /** The source model, used to coerce returned rows on execution. */\n readonly source: ModelClass,\n ) {}\n\n private with<R>(patch: Partial<InsertNode>): InsertBuilder<Full, Ins, R> {\n return new InsertBuilder<Full, Ins, R>({ ...this.node, ...patch }, this.source);\n }\n\n /**\n * Provide one row or many rows to insert, typed by the insert shape.\n *\n * @param rows One row, or an array of rows.\n * @returns A builder carrying the rows.\n * @throws ValidationError When a value is not a column value the dialect can\n * bind (see the `sql` helpers for writing an expression instead), or when the\n * rows of a multi-row insert disagree about a column that has a default.\n */\n values(\n rows: WriteValues<Ins> | readonly WriteValues<Ins>[],\n ): InsertBuilder<Full, Ins, Ret> {\n const list = (Array.isArray(rows) ? rows : [rows]) as readonly Record<\n string,\n unknown\n >[];\n for (const row of list) assertWritableValues(this.source, row, \"values\");\n assertConsistentRows(this.source, list);\n return this.with<Ret>({ values: list });\n }\n\n /**\n * On a unique/PK conflict on `target`, do nothing (skip the row).\n *\n * @param target The conflicting column(s) — a unique or primary key.\n * @param options Pass `where` to name the predicate of a **partial** unique\n * index, which PostgreSQL requires in order to match it as a conflict target.\n * @returns A builder carrying the conflict clause.\n *\n * @example\n * ```ts\n * insert(Outbound)\n * .values(data)\n * .onConflictDoNothing([\"consumer\", \"idempotencyKey\"], {\n * where: { idempotencyKey: { isNull: false } },\n * })\n * .returning();\n * ```\n */\n onConflictDoNothing(\n target: readonly (keyof Full & string)[],\n options?: OnConflictOptions<Full>,\n ): InsertBuilder<Full, Ins, Ret> {\n return this.with<Ret>({\n onConflict: {\n target,\n update: \"nothing\",\n targetWhere: options?.where ? toCondNode(options.where as never) : undefined,\n },\n });\n }\n\n /**\n * On a unique/PK conflict on `target`, overwrite the given columns (upsert).\n *\n * @param target The conflicting column(s) — a unique or primary key.\n * @param set The columns to update with new values.\n * @param options `indexWhere` names the predicate of a partial unique index\n * (the conflict target); `updateWhere` further restricts which conflicting\n * rows are rewritten.\n * @returns A builder carrying the conflict clause.\n * @throws ValidationError When a `set` value cannot be bound.\n */\n onConflictDoUpdate(\n target: readonly (keyof Full & string)[],\n set: WritePatch<Full>,\n options?: OnConflictUpdateOptions<Full>,\n ): InsertBuilder<Full, Ins, Ret> {\n assertWritableValues(this.source, set as Record<string, unknown>, \"set\");\n return this.with<Ret>({\n onConflict: {\n target,\n update: set as Record<string, unknown>,\n targetWhere: options?.indexWhere\n ? toCondNode(options.indexWhere as never)\n : undefined,\n updateWhere: options?.updateWhere\n ? toCondNode(options.updateWhere as never)\n : undefined,\n },\n });\n }\n\n /** Return the full inserted row(s). */\n returning(): InsertBuilder<Full, Ins, Full>;\n /** Return only the given columns of the inserted row(s). */\n returning<K extends keyof Full & string>(\n columns: readonly K[],\n ): InsertBuilder<Full, Ins, Pick<Full, K>>;\n returning(columns?: readonly string[]): InsertBuilder<Full, Ins, unknown> {\n return this.with<unknown>({ returning: columns ?? \"*\" });\n }\n}\n\n/** Build an INSERT into the model's table. */\nexport function insert<C extends ModelClass>(\n model: C,\n): InsertBuilder<InferModel<C>, InferInsert<C>> {\n return new InsertBuilder(\n {\n kind: \"insert\",\n table: model.tablename,\n values: [],\n returning: null,\n names: columnNamesOf(model) ?? undefined,\n },\n model,\n );\n}\n\n// --------------------------------------------------------------------------\n// UPDATE\n// --------------------------------------------------------------------------\n\n/** Serializable AST for an UPDATE. */\nexport interface UpdateNode {\n readonly kind: \"update\";\n readonly table: string;\n readonly set: Record<string, unknown>;\n readonly where: CondNode | undefined;\n /** True once a where-clause or explicit opt-in makes the write safe. */\n readonly guarded: boolean;\n readonly returning: Returning;\n /** Property → column map, or `undefined` when every name is the identity. */\n readonly names?: NameMap | undefined;\n}\n\n/**\n * UPDATE builder.\n *\n * @typeParam Full - the complete row type.\n * @typeParam Guarded - `true` once safe to execute (has where or opted out).\n * @typeParam Ret - execution result type.\n */\nexport class UpdateBuilder<Full, Guarded extends boolean, Ret = number> {\n declare readonly __row: Ret;\n declare readonly __guarded: Guarded;\n\n constructor(\n readonly node: UpdateNode,\n /** The source model, used to coerce returned rows on execution. */\n readonly source: ModelClass,\n ) {}\n\n private with<G extends boolean, R>(\n patch: Partial<UpdateNode>,\n ): UpdateBuilder<Full, G, R> {\n return new UpdateBuilder<Full, G, R>({ ...this.node, ...patch }, this.source);\n }\n\n /**\n * The columns to write. Partial — only the given columns change.\n *\n * A value is bound as a parameter unless it is a {@link sql} expression, which\n * is rendered inline instead — that is how a counter is written without a\n * read-modify-write race.\n *\n * @param values The column → value map.\n * @returns A builder carrying the assignments.\n * @throws ValidationError When a value is not a column value the dialect can\n * bind (a bare object, an array on a scalar column, a function).\n *\n * @example\n * ```ts\n * update(Outbound)\n * .set({ attempts: sql.raw(\"attempts + 1\"), updatedAt: sql.now() })\n * .where({ id });\n * ```\n */\n set(values: WritePatch<Full>): UpdateBuilder<Full, Guarded, Ret> {\n assertWritableValues(this.source, values as Record<string, unknown>, \"set\");\n return this.with<Guarded, Ret>({ set: values as Record<string, unknown> });\n }\n\n /** Restrict the rows to update. Marks the builder safe to execute. */\n where(input: WhereInput<Full> | Condition): UpdateBuilder<Full, true, Ret> {\n return this.with<true, Ret>({\n where: toCondNode(input as Record<string, unknown>),\n guarded: true,\n });\n }\n\n /** Explicit opt-in to update EVERY row. Use deliberately. */\n unguarded(): UpdateBuilder<Full, true, Ret> {\n return this.with<true, Ret>({ guarded: true });\n }\n\n /** Return the full updated row(s). */\n returning(): UpdateBuilder<Full, Guarded, Full>;\n /** Return only the given columns of the updated row(s). */\n returning<K extends keyof Full & string>(\n columns: readonly K[],\n ): UpdateBuilder<Full, Guarded, Pick<Full, K>>;\n returning(columns?: readonly string[]): UpdateBuilder<Full, Guarded, unknown> {\n return this.with<Guarded, unknown>({ returning: columns ?? \"*\" });\n }\n}\n\n/** Build an UPDATE on the model's table. Starts unguarded. */\nexport function update<C extends ModelClass>(\n model: C,\n): UpdateBuilder<InferModel<C>, false> {\n return new UpdateBuilder(\n {\n kind: \"update\",\n table: model.tablename,\n set: {},\n where: undefined,\n guarded: false,\n returning: null,\n names: columnNamesOf(model) ?? undefined,\n },\n model,\n );\n}\n\n// --------------------------------------------------------------------------\n// DELETE\n// --------------------------------------------------------------------------\n\n/** Serializable AST for a DELETE. */\nexport interface DeleteNode {\n readonly kind: \"delete\";\n readonly table: string;\n readonly where: CondNode | undefined;\n readonly guarded: boolean;\n readonly returning: Returning;\n /** Property → column map, or `undefined` when every name is the identity. */\n readonly names?: NameMap | undefined;\n}\n\n/**\n * DELETE builder. Starts unguarded — same safety rule as UPDATE.\n *\n * @typeParam Full - the complete row type.\n * @typeParam Guarded - `true` once safe to execute.\n * @typeParam Ret - execution result type.\n */\nexport class DeleteBuilder<Full, Guarded extends boolean, Ret = number> {\n declare readonly __row: Ret;\n declare readonly __guarded: Guarded;\n\n constructor(\n readonly node: DeleteNode,\n /** The source model, used to coerce returned rows on execution. */\n readonly source: ModelClass,\n ) {}\n\n private with<G extends boolean, R>(\n patch: Partial<DeleteNode>,\n ): DeleteBuilder<Full, G, R> {\n return new DeleteBuilder<Full, G, R>({ ...this.node, ...patch }, this.source);\n }\n\n /** Restrict the rows to delete. Marks the builder safe to execute. */\n where(input: WhereInput<Full> | Condition): DeleteBuilder<Full, true, Ret> {\n return this.with<true, Ret>({\n where: toCondNode(input as Record<string, unknown>),\n guarded: true,\n });\n }\n\n /** Explicit opt-in to delete EVERY row. Use deliberately. */\n unguarded(): DeleteBuilder<Full, true, Ret> {\n return this.with<true, Ret>({ guarded: true });\n }\n\n /** Return the full deleted row(s). */\n returning(): DeleteBuilder<Full, Guarded, Full>;\n /** Return only the given columns of the deleted row(s). */\n returning<K extends keyof Full & string>(\n columns: readonly K[],\n ): DeleteBuilder<Full, Guarded, Pick<Full, K>>;\n returning(columns?: readonly string[]): DeleteBuilder<Full, Guarded, unknown> {\n return this.with<Guarded, unknown>({ returning: columns ?? \"*\" });\n }\n}\n\n/** Build a DELETE on the model's table. Starts unguarded. */\nexport function del<C extends ModelClass>(model: C): DeleteBuilder<InferModel<C>, false> {\n return new DeleteBuilder(\n {\n kind: \"delete\",\n table: model.tablename,\n where: undefined,\n guarded: false,\n returning: null,\n names: columnNamesOf(model) ?? undefined,\n },\n model,\n );\n}\n","/**\n * tempest-db-js — database URL parsing & dialect detection.\n *\n * Mirrors SQLAlchemy's `make_url`: a single connection string identifies the\n * dialect (and optional driver), so switching databases is just swapping the\n * URL — `sqlite://./app.db` ↔ `postgresql://user:pass@host/db`.\n *\n * The driver suffix (`postgresql+pg`, `sqlite+better-sqlite3`, or SQLAlchemy's\n * async flavors like `postgresql+asyncpg`) is parsed out and ignored for dialect\n * detection, so URLs copied from a Python service still work here.\n */\n\n/** A database dialect tempest-db-js can target. */\nexport type Dialect = \"sqlite\" | \"postgresql\" | \"mysql\";\n\n/** A parsed database URL, dialect-neutral. */\nexport interface ParsedDatabaseUrl {\n /** The detected dialect. */\n readonly dialect: Dialect;\n /** Driver after the `+` in the scheme (e.g. `better-sqlite3`), or `null`. */\n readonly driver: string | null;\n /** Host (PostgreSQL/MySQL), or `null` for SQLite. */\n readonly host: string | null;\n /** Port, or `null`. */\n readonly port: number | null;\n /** Username, or `null`. */\n readonly user: string | null;\n /** Password, or `null`. */\n readonly password: string | null;\n /** Database name (PostgreSQL) or file path (SQLite). `:memory:` for in-memory. */\n readonly database: string | null;\n /** Extra query-string options (`?sslmode=require`). */\n readonly options: Readonly<Record<string, string>>;\n /** The original URL, untouched. */\n readonly raw: string;\n}\n\n/** Raised when a URL cannot be parsed or its dialect is unsupported. */\nexport class InvalidDatabaseUrl extends Error {\n constructor(url: string, reason: string) {\n super(`Invalid database URL ${JSON.stringify(url)}: ${reason}`);\n this.name = \"InvalidDatabaseUrl\";\n }\n}\n\n/** Map a scheme's base name to a tempest-db-js dialect. */\nconst DIALECT_ALIASES: Readonly<Record<string, Dialect>> = {\n sqlite: \"sqlite\",\n sqlite3: \"sqlite\",\n postgresql: \"postgresql\",\n postgres: \"postgresql\",\n pg: \"postgresql\",\n mysql: \"mysql\",\n mariadb: \"mysql\",\n};\n\n/** Split `\"postgresql+asyncpg\"` into `[\"postgresql\", \"asyncpg\"]`. */\nfunction splitScheme(scheme: string): { base: string; driver: string | null } {\n const plus = scheme.indexOf(\"+\");\n if (plus === -1) return { base: scheme.toLowerCase(), driver: null };\n return {\n base: scheme.slice(0, plus).toLowerCase(),\n driver: scheme.slice(plus + 1) || null,\n };\n}\n\n/** Decode a URL component, leaving it untouched if it is not encoded. */\nfunction decode(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\n/**\n * Parse a SQLite URL. Forms supported (SQLAlchemy-compatible):\n * - `sqlite://:memory:` / `sqlite::memory:` → in-memory\n * - `sqlite:///relative/path.db` → relative path\n * - `sqlite:////absolute/path.db` → absolute path\n * - `sqlite://./app.db` / `sqlite:app.db` → relative path (convenience)\n */\nfunction parseSqlite(\n raw: string,\n driver: string | null,\n rest: string,\n): ParsedDatabaseUrl {\n let database: string;\n if (rest.endsWith(\":memory:\")) {\n database = \":memory:\";\n } else if (rest.startsWith(\"///\")) {\n // sqlite:///rel → \"rel\" ; sqlite:////abs → \"/abs\"\n database = rest.slice(3) || \":memory:\";\n } else if (rest.startsWith(\"//\")) {\n database = rest.slice(2) || \":memory:\";\n } else {\n database = rest || \":memory:\";\n }\n return {\n dialect: \"sqlite\",\n driver,\n host: null,\n port: null,\n user: null,\n password: null,\n database: decode(database),\n options: {},\n raw,\n };\n}\n\n/**\n * Parse a network-style URL (PostgreSQL or MySQL) via the WHATWG URL parser.\n * Both share the `scheme://user:pass@host:port/db?opts` shape, so one parser\n * serves both — only the resulting `dialect` differs.\n */\nfunction parseNetworkUrl(\n raw: string,\n driver: string | null,\n rest: string,\n dialect: \"postgresql\" | \"mysql\",\n): ParsedDatabaseUrl {\n // Rebuild with a clean scheme so the WHATWG URL parser accepts it.\n let parsed: URL;\n try {\n parsed = new URL(`${dialect}:${rest}`);\n } catch {\n throw new InvalidDatabaseUrl(raw, \"could not parse host/credentials\");\n }\n const database = decode(parsed.pathname.replace(/^\\//, \"\")) || null;\n const options: Record<string, string> = {};\n for (const [key, value] of parsed.searchParams) options[key] = value;\n return {\n dialect,\n driver,\n host: parsed.hostname || null,\n port: parsed.port ? Number(parsed.port) : null,\n user: parsed.username ? decode(parsed.username) : null,\n password: parsed.password ? decode(parsed.password) : null,\n database,\n options,\n raw,\n };\n}\n\n/**\n * Parse a database URL into its dialect and connection parts.\n *\n * @param url A connection string, e.g. `\"postgresql://app:app@localhost/app\"`\n * or `\"sqlite:///app.db\"`. An async driver suffix (`+asyncpg`, `+aiosqlite`)\n * is accepted and ignored for dialect detection.\n * @returns The parsed, dialect-neutral connection descriptor.\n * @throws InvalidDatabaseUrl When the URL has no scheme or an unknown dialect.\n */\nexport function parseDatabaseUrl(url: string): ParsedDatabaseUrl {\n const schemeEnd = url.indexOf(\":\");\n if (schemeEnd === -1) {\n throw new InvalidDatabaseUrl(\n url,\n \"missing scheme (expected e.g. sqlite:// or postgresql://)\",\n );\n }\n const { base, driver } = splitScheme(url.slice(0, schemeEnd));\n const dialect = DIALECT_ALIASES[base];\n if (!dialect) {\n throw new InvalidDatabaseUrl(url, `unknown dialect ${JSON.stringify(base)}`);\n }\n const rest = url.slice(schemeEnd + 1);\n if (dialect === \"sqlite\") return parseSqlite(url, driver, rest);\n return parseNetworkUrl(url, driver, rest, dialect);\n}\n\n/** Detect just the dialect of a URL, ignoring the rest. */\nexport function detectDialect(url: string): Dialect {\n return parseDatabaseUrl(url).dialect;\n}\n","/**\n * tempest-db-js — portable SQL expression rendering.\n *\n * A `sql.now()` / `sql.uuidv4()` token is dialect-neutral in the AST and in the\n * migration IR; this is the single place it becomes concrete SQL. Kept in its own\n * module (types only, no runtime imports) so both the query dialect and the DDL\n * renderer share one mapping instead of drifting apart.\n */\n\nimport type { Dialect } from \"./url.js\";\n\n/** The dialect-neutral expression tokens (the non-fragment `PortableExpression`s). */\nexport type PortableToken = \"now\" | \"current_date\" | \"current_time\" | \"uuidv4\";\n\n/**\n * Render a portable expression token to SQL for the dialect.\n *\n * @param token The dialect-neutral token.\n * @param dialect The target dialect.\n * @returns The SQL text for that token.\n */\nexport function renderPortableToken(token: PortableToken, dialect: Dialect): string {\n switch (token) {\n case \"now\":\n return dialect === \"postgresql\" ? \"now()\" : \"CURRENT_TIMESTAMP\";\n case \"current_date\":\n return \"CURRENT_DATE\";\n case \"current_time\":\n return \"CURRENT_TIME\";\n case \"uuidv4\":\n if (dialect === \"postgresql\") return \"gen_random_uuid()\";\n if (dialect === \"mysql\") return \"(UUID())\";\n return \"(lower(hex(randomblob(16))))\";\n }\n}\n","/**\n * tempest-db-js — Phase 4a: dialect SQL compilation.\n *\n * Turns the dialect-neutral AST (`SelectNode`, `InsertNode`, `UpdateNode`,\n * `DeleteNode` from Phases 1-2) into `{ sql, params }`. This is the ONLY place\n * SQL is produced — always parameterized (`?` for SQLite, `$1` for PostgreSQL),\n * never string interpolation, so it is injection-safe by construction.\n *\n * It does NOT touch a database — execution is Phase 4b (`session.execute`).\n */\n\nimport type { CondNode, ExprNode } from \"./conditions.js\";\nimport { renderPortableToken } from \"./expressions.js\";\nimport { type NameMap, type SqlExpression, isSqlExpression } from \"./index.js\";\nimport type { JoinNode } from \"./join.js\";\nimport type { DeleteNode, InsertNode, UpdateNode } from \"./mutations.js\";\nimport { type LockClause, OPERATORS, type SelectNode, isSubquery } from \"./query.js\";\nimport type { Dialect } from \"./url.js\";\n\n/** A compiled, parameterized statement ready to hand to a driver. */\nexport interface CompiledQuery {\n readonly sql: string;\n readonly params: readonly unknown[];\n}\n\n/** Any compilable AST node. */\nexport type QueryNode = SelectNode | InsertNode | UpdateNode | DeleteNode | JoinNode;\n\nconst OPERATOR_SET: ReadonlySet<string> = new Set(OPERATORS);\n\n/** True when a where-value is an operator object rather than a bare value. */\nfunction isOperatorObject(value: unknown): value is Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n value instanceof Date ||\n value instanceof Uint8Array\n ) {\n return false;\n }\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((k) => OPERATOR_SET.has(k));\n}\n\n/**\n * Collects bound parameters and renders placeholders in dialect style. Exposed\n * because dialect subclasses receive it when overriding clause rendering.\n */\nexport class Params {\n readonly values: unknown[] = [];\n\n constructor(private readonly placeholder: (index: number) => string) {}\n\n bind(value: unknown): string {\n this.values.push(value);\n return this.placeholder(this.values.length);\n }\n}\n\n/**\n * The column list of an INSERT: the union of every row's keys, in first-seen\n * order.\n *\n * Taking only the first row's keys silently drops a value that a later row\n * supplies — the column is never named, so the value has nowhere to go. That was\n * unreachable while every row had to carry every key, and became reachable the\n * moment nullable columns turned optional on insert.\n *\n * @param rows The rows being inserted.\n * @returns Every column named by at least one row.\n */\nfunction insertColumns(rows: readonly Record<string, unknown>[]): string[] {\n const columns: string[] = [];\n const seen = new Set<string>();\n for (const row of rows) {\n for (const key of Object.keys(row)) {\n if (seen.has(key)) continue;\n seen.add(key);\n columns.push(key);\n }\n }\n return columns;\n}\n\n/** True when any value written by an INSERT is a SQL expression, not a literal. */\nfunction insertHasExpression(node: InsertNode): boolean {\n for (const row of node.values) {\n for (const value of Object.values(row)) {\n if (isSqlExpression(value)) return true;\n }\n }\n const update = node.onConflict?.update;\n if (update && update !== \"nothing\") {\n for (const value of Object.values(update)) {\n if (isSqlExpression(value)) return true;\n }\n }\n return false;\n}\n\n/**\n * Base SQL compiler shared by every dialect. Subclasses customize only what\n * actually differs between databases (placeholder syntax, `ILIKE` support).\n */\nexport abstract class BaseDialect {\n abstract readonly name: Dialect;\n\n /**\n * INSERT SQL templates keyed by structure (dialect|table|columns|rowCount|\n * returning). Shared across dialect instances — the key namespaces by dialect\n * name, and the placeholder text is dialect-specific but structure-determined.\n */\n private static readonly insertTemplates = new Map<string, string>();\n\n /** Quoted-identifier cache (see {@link quoteId}). Shared across dialects. */\n private static readonly quotedIds = new Map<string, string>();\n\n /** Render the n-th (1-based) placeholder. */\n protected abstract placeholder(index: number): string;\n\n /** Render a case-insensitive LIKE for the active dialect. */\n protected abstract ilike(column: string, param: string): string;\n\n /**\n * Validate a subquery operand before it is rendered, for dialects that restrict\n * what an `IN (SELECT ...)` may contain. The default accepts everything.\n *\n * @param _node The subquery's AST.\n * @throws Error When the dialect cannot execute this subquery.\n */\n protected checkSubquery(_node: SelectNode): void {}\n\n /**\n * The SQL operator for an array containment/overlap test.\n *\n * Only PostgreSQL has native arrays; the other dialects throw rather than\n * emitting an operator that means something else there.\n *\n * @param op The array operator name.\n * @returns The SQL operator text.\n * @throws Error On a dialect without native array support.\n */\n protected arrayOperator(op: \"contains\" | \"containedBy\" | \"overlaps\"): string {\n throw new Error(\n `The \"${op}\" operator needs native array support, which ${this.name} does not have.`,\n );\n }\n\n /**\n * Quote an identifier (column/table) for the active dialect.\n *\n * Memoized: identifiers form a small, stable set (column/table names), but this\n * runs for every identifier on every compile. Caching the quoted form removes a\n * regex-replace + string allocation from the hot path. The standard double-quote\n * form is identical across both dialects, so one shared cache is correct.\n */\n protected quoteId(name: string): string {\n const cached = BaseDialect.quotedIds.get(name);\n if (cached !== undefined) return cached;\n const quoted = `\"${name.replace(/\"/g, '\"\"')}\"`;\n BaseDialect.quotedIds.set(name, quoted);\n return quoted;\n }\n\n /** Compile any node to `{ sql, params }`. */\n compile(node: QueryNode): CompiledQuery {\n const params = new Params((i) => this.placeholder(i));\n let sql: string;\n switch (node.kind) {\n case \"select\":\n sql = this.compileSelect(node, params);\n break;\n case \"insert\":\n sql = this.compileInsert(node, params);\n break;\n case \"update\":\n sql = this.compileUpdate(node, params);\n break;\n case \"delete\":\n sql = this.compileDelete(node, params);\n break;\n case \"join_select\":\n sql = this.compileJoin(node, params);\n break;\n }\n return { sql, params: params.values };\n }\n\n /**\n * Render a qualified `alias.column` ref as `\"alias\".\"column\"`, translating the\n * property name to the real column name for that alias's model.\n *\n * @param ref The `alias.property` reference (a bare name is left unqualified).\n * @param names The node's per-alias name maps, if any source renames columns.\n * @returns The quoted, qualified identifier.\n */\n private qualify(\n ref: string,\n names?: Readonly<Record<string, NameMap>> | undefined,\n ): string {\n const dot = ref.indexOf(\".\");\n if (dot === -1) return this.quoteId(ref);\n const alias = ref.slice(0, dot);\n const prop = ref.slice(dot + 1);\n return `${this.quoteId(alias)}.${this.columnId(prop, names?.[alias])}`;\n }\n\n /**\n * Quote a column identifier, translating the model property name to the real\n * database column name first.\n *\n * `names` is `undefined` for a model that renames nothing — the overwhelmingly\n * common case — so this stays a single lookup plus the memoized quote.\n *\n * @param prop The model property name as written in the builder.\n * @param names The node's property → column map, if any.\n * @returns The quoted database identifier.\n */\n protected columnId(prop: string, names: NameMap | undefined): string {\n return this.quoteId(names?.[prop] ?? prop);\n }\n\n /**\n * Render a {@link SqlExpression} inline, binding the parameters it carries.\n *\n * This is what keeps `set({ attempts: sql.raw(\"attempts + 1\") })` an expression\n * instead of a bound object: the fragment goes into the statement text, and\n * only a `sql.expr` template's interpolations become parameters.\n *\n * @param expr The branded expression.\n * @param params The parameter collector for the statement being compiled.\n * @returns The SQL text of the expression.\n */\n protected renderExpression(expr: SqlExpression, params: Params): string {\n const token = expr.expression;\n if (typeof token === \"string\") return renderPortableToken(token, this.name);\n if (\"raw\" in token) return token.raw;\n const parts = token.parts;\n let sql = parts[0] ?? \"\";\n for (let i = 1; i < parts.length; i++) {\n sql += `${params.bind(expr.params[i - 1])}${parts[i]}`;\n }\n return sql;\n }\n\n /** Render one write value: a SQL expression inline, anything else as a parameter. */\n protected renderValue(value: unknown, params: Params): string {\n return isSqlExpression(value)\n ? this.renderExpression(value, params)\n : params.bind(value);\n }\n\n /**\n * Render a row-level locking clause (`FOR UPDATE ...`).\n *\n * Standard on PostgreSQL and MySQL 8.0+; SQLite overrides it to throw.\n *\n * @param lock The locking clause from the node.\n * @returns The SQL text, leading space included.\n */\n protected renderLock(lock: LockClause): string {\n const strength = lock.strength === \"update\" ? \"FOR UPDATE\" : \"FOR SHARE\";\n const of =\n lock.of.length > 0 ? ` OF ${lock.of.map((t) => this.quoteId(t)).join(\", \")}` : \"\";\n const wait =\n lock.wait === \"skipLocked\"\n ? \" SKIP LOCKED\"\n : lock.wait === \"noWait\"\n ? \" NOWAIT\"\n : \"\";\n return ` ${strength}${of}${wait}`;\n }\n\n // ---- statements -------------------------------------------------------\n\n /**\n * Compile a SELECT.\n *\n * Two alias rules differ between clauses and are handled here: PostgreSQL does\n * NOT accept a `SELECT` alias in `HAVING`, so an aggregate key is re-emitted as\n * its expression (`COUNT(*) > $1`), a form every dialect accepts; `ORDER BY`,\n * by contrast, accepts the output alias everywhere, so it is emitted as\n * written.\n *\n * @param node The select AST.\n * @param params The parameter collector.\n * @returns The SQL text.\n */\n private compileSelect(node: SelectNode, params: Params): string {\n const names = node.names;\n let cols: string;\n if (node.aggregates.length > 0) {\n // Grouped/aggregate query: SELECT group cols + `FN(col) AS \"alias\"`.\n const groupSel = node.groupBy.map((c) => this.columnId(c, names));\n const aggSel = node.aggregates.map((a) => {\n const inner = a.column === \"*\" ? \"*\" : this.columnId(a.column, names);\n return `${a.fn.toUpperCase()}(${inner}) AS ${this.quoteId(a.alias)}`;\n });\n cols = [...groupSel, ...aggSel].join(\", \");\n } else {\n cols =\n node.columns === \"*\"\n ? \"*\"\n : node.columns.map((c) => this.columnId(c, names)).join(\", \");\n }\n let sql = `SELECT ${node.distinct ? \"DISTINCT \" : \"\"}${cols} FROM ${this.quoteId(node.table)}`;\n\n const where = this.compileCondition(node.where, params, (k) =>\n this.columnId(k, names),\n );\n if (where) sql += ` WHERE ${where}`;\n\n if (node.groupBy.length > 0) {\n sql += ` GROUP BY ${node.groupBy.map((c) => this.columnId(c, names)).join(\", \")}`;\n }\n\n const aggByAlias = new Map(node.aggregates.map((a) => [a.alias, a]));\n\n if (node.having) {\n const having = this.compileCondition(node.having, params, (key) => {\n const agg = aggByAlias.get(key);\n if (!agg) return this.columnId(key, names);\n const inner = agg.column === \"*\" ? \"*\" : this.columnId(agg.column, names);\n return `${agg.fn.toUpperCase()}(${inner})`;\n });\n if (having) sql += ` HAVING ${having}`;\n }\n\n if (node.orderBy.length > 0) {\n const terms = node.orderBy\n .map((t) => {\n const id = aggByAlias.has(t.column)\n ? this.quoteId(t.column)\n : this.columnId(t.column, names);\n return `${id} ${t.direction === \"desc\" ? \"DESC\" : \"ASC\"}`;\n })\n .join(\", \");\n sql += ` ORDER BY ${terms}`;\n }\n if (node.limit !== undefined) sql += ` LIMIT ${params.bind(node.limit)}`;\n if (node.offset !== undefined) sql += ` OFFSET ${params.bind(node.offset)}`;\n if (node.lock) {\n if (node.distinct || node.groupBy.length > 0 || node.aggregates.length > 0) {\n throw new Error(\n \"FOR UPDATE / FOR SHARE cannot be combined with DISTINCT or an aggregate query — lock the underlying rows in a separate SELECT.\",\n );\n }\n sql += this.renderLock(node.lock);\n }\n return sql;\n }\n\n /**\n * Compile an INSERT.\n *\n * Takes the cached fast path only when the statement text is a pure function of\n * its structure. A SQL expression among the values, or a conflict predicate,\n * makes the text depend on the values themselves — those compile uncached, in\n * SQL order, so placeholder positions stay correct.\n */\n private compileInsert(node: InsertNode, params: Params): string {\n const columns = insertColumns(node.values);\n const conflict = node.onConflict;\n const cacheable =\n conflict?.targetWhere === undefined &&\n conflict?.updateWhere === undefined &&\n !insertHasExpression(node);\n if (!cacheable) return this.compileInsertDirect(node, columns, params);\n\n // Bind every value in row-major, column order. The SQL text is independent of\n // the values (a null becomes a placeholder like any other), so it depends only\n // on the structure — which lets us cache the template below.\n for (const row of node.values) {\n for (const c of columns) params.bind((row as Record<string, unknown>)[c] ?? null);\n }\n // ON CONFLICT DO UPDATE binds its SET values after the row values, in key order.\n const conflictCols =\n conflict && conflict.update !== \"nothing\" ? Object.keys(conflict.update) : [];\n for (const c of conflictCols) {\n params.bind((conflict?.update as Record<string, unknown>)[c]);\n }\n return this.insertTemplate(node, columns, conflictCols, params);\n }\n\n /**\n * Compile an INSERT without the template cache, rendering clauses in statement\n * order so every parameter is bound at the position it appears.\n *\n * @param node The insert node.\n * @param columns The column keys shared by every row.\n * @param params The parameter collector.\n * @returns The SQL text.\n */\n private compileInsertDirect(\n node: InsertNode,\n columns: readonly string[],\n params: Params,\n ): string {\n const names = node.names;\n const colSql = columns.map((c) => this.columnId(c, names)).join(\", \");\n const rowsSql = node.values\n .map((row) => {\n const cells = columns.map((c) =>\n this.renderValue((row as Record<string, unknown>)[c] ?? null, params),\n );\n return `(${cells.join(\", \")})`;\n })\n .join(\", \");\n let sql = `INSERT INTO ${this.quoteId(node.table)} (${colSql}) VALUES ${rowsSql}`;\n if (node.onConflict) {\n const update = node.onConflict.update;\n const conflictCols = update === \"nothing\" ? [] : Object.keys(update);\n let cursor = 0;\n sql += this.renderConflict(\n node.onConflict,\n conflictCols,\n () => {\n const key = conflictCols[cursor++] as string;\n return this.renderValue((update as Record<string, unknown>)[key], params);\n },\n names,\n params,\n );\n }\n sql += this.compileReturning(node.returning, names);\n return sql;\n }\n\n /**\n * The INSERT SQL template for a given structure, cached across calls.\n *\n * The text depends only on (dialect, table, columns, row count, returning,\n * conflict shape) — never on the bound values — and placeholder positions are\n * deterministic from the counts (a fresh statement always starts binding at 1).\n * So a per-row insert loop compiles the string once and reuses it every row.\n */\n private insertTemplate(\n node: InsertNode,\n columns: readonly string[],\n conflictCols: readonly string[],\n params: Params,\n ): string {\n const returningKey =\n node.returning === null\n ? \"\"\n : node.returning === \"*\"\n ? \"*\"\n : node.returning.join(\",\");\n const conflictKey = node.onConflict\n ? `${node.onConflict.target.join(\",\")}>${node.onConflict.update === \"nothing\" ? \"nothing\" : conflictCols.join(\",\")}`\n : \"\";\n const key = `${this.name}|${node.table}|${columns.join(\",\")}|${node.values.length}|${returningKey}|${conflictKey}`;\n const cached = BaseDialect.insertTemplates.get(key);\n if (cached !== undefined) return cached;\n\n const names = node.names;\n const colSql = columns.map((c) => this.columnId(c, names)).join(\", \");\n let position = 0;\n const rowsSql = node.values\n .map(() => `(${columns.map(() => this.placeholder(++position)).join(\", \")})`)\n .join(\", \");\n let sql = `INSERT INTO ${this.quoteId(node.table)} (${colSql}) VALUES ${rowsSql}`;\n if (node.onConflict) {\n sql += this.renderConflict(\n node.onConflict,\n conflictCols,\n () => this.placeholder(++position),\n names,\n params,\n );\n }\n sql += this.compileReturning(node.returning, names);\n BaseDialect.insertTemplates.set(key, sql);\n return sql;\n }\n\n /**\n * Render the conflict-handling clause. Standard SQL (SQLite/PostgreSQL) uses\n * `ON CONFLICT (...) [WHERE predicate] DO NOTHING | DO UPDATE SET ... [WHERE ...]`;\n * MySQL overrides this.\n *\n * The index predicate is rendered before the `DO UPDATE` assignments because\n * that is where it sits in the statement, so its parameters bind first.\n *\n * @param onConflict The conflict clause from the node.\n * @param conflictCols The columns to overwrite on `DO UPDATE` (empty for nothing).\n * @param nextValue Yields the SQL for the next `DO UPDATE` assignment value.\n * @param names The node's property → column map, if any.\n * @param params The parameter collector, for the predicates.\n * @returns The SQL text, leading space included.\n */\n protected renderConflict(\n onConflict: NonNullable<InsertNode[\"onConflict\"]>,\n conflictCols: readonly string[],\n nextValue: () => string,\n names: NameMap | undefined,\n params: Params,\n ): string {\n const idFor = (key: string): string => this.columnId(key, names);\n const target = onConflict.target.map(idFor).join(\", \");\n const indexWhere = this.compileCondition(onConflict.targetWhere, params, idFor);\n const targetSql = indexWhere ? `(${target}) WHERE ${indexWhere}` : `(${target})`;\n if (onConflict.update === \"nothing\") return ` ON CONFLICT ${targetSql} DO NOTHING`;\n const assignments = conflictCols\n .map((c) => `${idFor(c)} = ${nextValue()}`)\n .join(\", \");\n let sql = ` ON CONFLICT ${targetSql} DO UPDATE SET ${assignments}`;\n const updateWhere = this.compileCondition(onConflict.updateWhere, params, idFor);\n if (updateWhere) sql += ` WHERE ${updateWhere}`;\n return sql;\n }\n\n private compileUpdate(node: UpdateNode, params: Params): string {\n const names = node.names;\n const sets = Object.entries(node.set)\n .map(\n ([col, value]) =>\n `${this.columnId(col, names)} = ${this.renderValue(value, params)}`,\n )\n .join(\", \");\n let sql = `UPDATE ${this.quoteId(node.table)} SET ${sets}`;\n const where = this.compileCondition(node.where, params, (k) =>\n this.columnId(k, names),\n );\n if (where) sql += ` WHERE ${where}`;\n sql += this.compileReturning(node.returning, names);\n return sql;\n }\n\n private compileDelete(node: DeleteNode, params: Params): string {\n const names = node.names;\n let sql = `DELETE FROM ${this.quoteId(node.table)}`;\n const where = this.compileCondition(node.where, params, (k) =>\n this.columnId(k, names),\n );\n if (where) sql += ` WHERE ${where}`;\n sql += this.compileReturning(node.returning, names);\n return sql;\n }\n\n private compileJoin(node: JoinNode, params: Params): string {\n const names = node.names;\n const cols = node.selections\n .map((s) => {\n const ref = `${s.alias}.${s.column}`;\n return `${this.qualify(ref, names)} AS ${this.quoteId(ref)}`;\n })\n .join(\", \");\n let sql = `SELECT ${cols} FROM ${this.quoteId(node.base.table)} AS ${this.quoteId(node.base.alias)}`;\n for (const j of node.joins) {\n const kw = j.kind === \"left\" ? \"LEFT JOIN\" : \"INNER JOIN\";\n const on = j.on\n .map(([l, r]) => `${this.qualify(l, names)} = ${this.qualify(r, names)}`)\n .join(\" AND \");\n sql += ` ${kw} ${this.quoteId(j.table)} AS ${this.quoteId(j.alias)} ON ${on}`;\n }\n const where = this.compileCondition(node.where, params, (k) =>\n this.qualify(k, names),\n );\n if (where) sql += ` WHERE ${where}`;\n if (node.orderBy.length > 0) {\n const terms = node.orderBy\n .map(\n (t) =>\n `${this.qualify(t.ref, names)} ${t.direction === \"desc\" ? \"DESC\" : \"ASC\"}`,\n )\n .join(\", \");\n sql += ` ORDER BY ${terms}`;\n }\n if (node.limit !== undefined) sql += ` LIMIT ${params.bind(node.limit)}`;\n if (node.offset !== undefined) sql += ` OFFSET ${params.bind(node.offset)}`;\n return sql;\n }\n\n // ---- clauses ----------------------------------------------------------\n\n protected compileReturning(\n returning: readonly string[] | \"*\" | null,\n names?: NameMap | undefined,\n ): string {\n if (returning === null) return \"\";\n if (returning === \"*\") return \" RETURNING *\";\n return ` RETURNING ${returning.map((c) => this.columnId(c, names)).join(\", \")}`;\n }\n\n /**\n * Compile a condition tree (fields / and / or / not) to SQL. `idFor` renders a\n * key to a quoted identifier — `quoteId` for single-table, `qualify` for joins —\n * so select/update/delete/join all share this one compiler.\n */\n private compileCondition(\n node: CondNode | undefined,\n params: Params,\n idFor: (key: string) => string,\n ): string {\n if (!node) return \"\";\n switch (node.kind) {\n case \"fields\": {\n const conditions: string[] = [];\n for (const [key, value] of Object.entries(node.fields)) {\n const id = idFor(key);\n if (isOperatorObject(value)) {\n for (const [op, operand] of Object.entries(value)) {\n conditions.push(this.compileOperator(id, op, operand, params));\n }\n } else {\n // bare value → equality (null → IS NULL)\n conditions.push(\n value === null ? `${id} IS NULL` : `${id} = ${params.bind(value)}`,\n );\n }\n }\n return conditions.join(\" AND \");\n }\n case \"and\":\n case \"or\": {\n const parts = node.parts\n .map((p) => this.compileCondition(p, params, idFor))\n .filter((s) => s.length > 0);\n if (parts.length === 0) return \"\";\n const sep = node.kind === \"and\" ? \" AND \" : \" OR \";\n return parts.map((p) => `(${p})`).join(sep);\n }\n case \"not\": {\n const inner = this.compileCondition(node.part, params, idFor);\n return inner ? `NOT (${inner})` : \"\";\n }\n case \"compare\": {\n const left = this.renderExpr(node.left, params, idFor);\n if (node.right.kind === \"value\") {\n return this.compileOperator(left, node.op, node.right.value, params);\n }\n return this.compileExprOperator(\n left,\n node.op,\n this.renderExpr(node.right, params, idFor),\n );\n }\n }\n }\n\n /**\n * Render one side of a comparison.\n *\n * A column reference goes through `idFor`, so an explicit `.name()` mapping and\n * join qualification apply here exactly as they do in the object form of\n * `where` — `col()` is not a way around them. Only a `value` node binds.\n *\n * @param node The expression AST.\n * @param params The parameter collector.\n * @param idFor The identifier resolver for the enclosing statement.\n * @returns The SQL text of the expression.\n */\n private renderExpr(\n node: ExprNode,\n params: Params,\n idFor: (key: string) => string,\n ): string {\n switch (node.kind) {\n case \"column\":\n return idFor(node.name);\n case \"value\":\n return params.bind(node.value);\n case \"fn\": {\n const args = node.args.map((a) => this.renderExpr(a, params, idFor)).join(\", \");\n return `${node.name}(${args})`;\n }\n }\n }\n\n /**\n * Compile a comparison whose right-hand side is another expression rather than\n * a bound value (`total > paid`, `lower(a) = lower(b)`).\n *\n * The list and null operators are excluded: `IN`, `BETWEEN` and `IS NULL` take\n * a value operand, and accepting an expression there would silently compile to\n * something else.\n *\n * @param left The rendered left-hand side.\n * @param op The operator name.\n * @param right The rendered right-hand side.\n * @returns The SQL text of the predicate.\n * @throws Error When the operator needs a value operand.\n */\n private compileExprOperator(left: string, op: string, right: string): string {\n switch (op) {\n case \"eq\":\n return `${left} = ${right}`;\n case \"ne\":\n return `${left} <> ${right}`;\n case \"gt\":\n return `${left} > ${right}`;\n case \"gte\":\n return `${left} >= ${right}`;\n case \"lt\":\n return `${left} < ${right}`;\n case \"lte\":\n return `${left} <= ${right}`;\n case \"like\":\n return `${left} LIKE ${right}`;\n case \"ilike\":\n return this.ilike(left, right);\n case \"ieq\":\n return `lower(${left}) = lower(${right})`;\n case \"contains\":\n case \"containedBy\":\n case \"overlaps\":\n return `${left} ${this.arrayOperator(op)} ${right}`;\n default:\n throw new Error(`The \"${op}\" operator takes a value operand, not an expression.`);\n }\n }\n\n private compileOperator(\n id: string,\n op: string,\n operand: unknown,\n params: Params,\n ): string {\n switch (op) {\n case \"eq\":\n return operand === null ? `${id} IS NULL` : `${id} = ${params.bind(operand)}`;\n case \"ne\":\n return operand === null\n ? `${id} IS NOT NULL`\n : `${id} <> ${params.bind(operand)}`;\n case \"gt\":\n return `${id} > ${params.bind(operand)}`;\n case \"gte\":\n return `${id} >= ${params.bind(operand)}`;\n case \"lt\":\n return `${id} < ${params.bind(operand)}`;\n case \"lte\":\n return `${id} <= ${params.bind(operand)}`;\n case \"like\":\n return `${id} LIKE ${params.bind(operand)}`;\n case \"ilike\":\n return this.ilike(id, params.bind(operand));\n case \"ieq\":\n return operand === null\n ? `${id} IS NULL`\n : `lower(${id}) = lower(${params.bind(operand)})`;\n case \"contains\":\n return `${id} ${this.arrayOperator(\"contains\")} ${params.bind(operand)}`;\n case \"containedBy\":\n return `${id} ${this.arrayOperator(\"containedBy\")} ${params.bind(operand)}`;\n case \"overlaps\":\n return `${id} ${this.arrayOperator(\"overlaps\")} ${params.bind(operand)}`;\n case \"in\":\n return this.compileIn(id, operand, params, false);\n case \"notIn\":\n return this.compileIn(id, operand, params, true);\n case \"between\": {\n const [lo, hi] = operand as readonly [unknown, unknown];\n return `${id} BETWEEN ${params.bind(lo)} AND ${params.bind(hi)}`;\n }\n case \"isNull\":\n return operand ? `${id} IS NULL` : `${id} IS NOT NULL`;\n default:\n throw new Error(`Unknown operator ${JSON.stringify(op)}`);\n }\n }\n\n /**\n * Compile `IN` / `NOT IN`, whose operand is either a value list or a\n * single-column subquery.\n *\n * The subquery is rendered at the position it appears in the outer statement\n * and shares the same parameter collector, so its own placeholders land in the\n * right order — and it keeps its own `names` map, since the inner model may use\n * a different naming convention than the outer one.\n *\n * @param id The quoted column identifier being tested.\n * @param operand A list of values, or a {@link Subquery}.\n * @param params The parameter collector for the statement being compiled.\n * @param negate True for `NOT IN`.\n * @returns The SQL text of the predicate.\n */\n private compileIn(\n id: string,\n operand: unknown,\n params: Params,\n negate: boolean,\n ): string {\n const keyword = negate ? \"NOT IN\" : \"IN\";\n if (isSubquery(operand)) {\n this.checkSubquery(operand.node);\n return `${id} ${keyword} (${this.compileSelect(operand.node, params)})`;\n }\n const values = operand as readonly unknown[];\n if (values.length === 0) {\n // empty IN matches nothing; empty NOT IN matches everything\n return negate ? \"1 = 1\" : \"1 = 0\";\n }\n const list = values.map((v) => params.bind(v)).join(\", \");\n return `${id} ${keyword} (${list})`;\n }\n}\n\n/** SQLite dialect: `?` placeholders; `ILIKE` falls back to `LIKE` (ASCII-insensitive). */\nexport class SqliteDialect extends BaseDialect {\n readonly name = \"sqlite\" as const;\n\n protected placeholder(): string {\n return \"?\";\n }\n\n protected ilike(column: string, param: string): string {\n return `${column} LIKE ${param}`;\n }\n\n /**\n * SQLite has no row-level locking, so a lock request is an error rather than a\n * silently unlocked `SELECT` — a lock that does not exist only shows up as\n * duplicated work under production concurrency.\n */\n protected override renderLock(): string {\n throw new Error(\n \"SQLite has no row-level locking — FOR UPDATE / FOR SHARE is unsupported. Serialize the claim inside a transaction instead.\",\n );\n }\n}\n\n/** PostgreSQL dialect: `$1` placeholders; native `ILIKE`; native array operators. */\nexport class PostgresDialect extends BaseDialect {\n readonly name = \"postgresql\" as const;\n\n protected placeholder(index: number): string {\n return `$${index}`;\n }\n\n protected ilike(column: string, param: string): string {\n return `${column} ILIKE ${param}`;\n }\n\n protected override arrayOperator(op: \"contains\" | \"containedBy\" | \"overlaps\"): string {\n if (op === \"contains\") return \"@>\";\n if (op === \"containedBy\") return \"<@\";\n return \"&&\";\n }\n}\n\n/** Backtick-quoted identifier cache for MySQL (its quoting differs from the base). */\nconst mysqlQuotedIds = new Map<string, string>();\n\n/**\n * MySQL dialect: `?` placeholders, backtick identifiers, `ON DUPLICATE KEY\n * UPDATE` for upsert, and case-insensitive `LIKE` (default collation). MySQL has\n * no `RETURNING`, so requesting it throws.\n */\nexport class MysqlDialect extends BaseDialect {\n readonly name = \"mysql\" as const;\n\n protected placeholder(): string {\n return \"?\";\n }\n\n protected ilike(column: string, param: string): string {\n return `${column} LIKE ${param}`; // MySQL LIKE is case-insensitive by default\n }\n\n protected override quoteId(name: string): string {\n const cached = mysqlQuotedIds.get(name);\n if (cached !== undefined) return cached;\n const quoted = `\\`${name.replace(/`/g, \"``\")}\\``;\n mysqlQuotedIds.set(name, quoted);\n return quoted;\n }\n\n /**\n * MySQL rejects `LIMIT` inside an `IN` subquery with\n * `ER_NOT_SUPPORTED_YET: This version of MySQL doesn't yet support\n * 'LIMIT & IN/ALL/ANY/SOME subquery'`. Failing at compile time names the fix\n * instead of surfacing that error from the driver at runtime.\n */\n protected override checkSubquery(node: SelectNode): void {\n if (node.limit !== undefined || node.offset !== undefined) {\n throw new Error(\n \"MySQL does not support LIMIT/OFFSET inside an IN subquery. Select the ids first and pass them as a list, or wrap the subquery in a derived table.\",\n );\n }\n }\n\n protected override renderConflict(\n onConflict: NonNullable<InsertNode[\"onConflict\"]>,\n conflictCols: readonly string[],\n nextValue: () => string,\n names: NameMap | undefined,\n ): string {\n if (onConflict.targetWhere || onConflict.updateWhere) {\n throw new Error(\n \"MySQL's ON DUPLICATE KEY UPDATE has no conflict-target predicate — a partial unique index is PostgreSQL/SQLite only.\",\n );\n }\n if (onConflict.update === \"nothing\") {\n // MySQL has no DO NOTHING; a no-op self-assignment on a target column is\n // the idiomatic equivalent (keeps the existing row untouched).\n const col = this.columnId(onConflict.target[0] ?? \"id\", names);\n return ` ON DUPLICATE KEY UPDATE ${col} = ${col}`;\n }\n const assignments = conflictCols\n .map((c) => `${this.columnId(c, names)} = ${nextValue()}`)\n .join(\", \");\n return ` ON DUPLICATE KEY UPDATE ${assignments}`;\n }\n\n /**\n * MySQL has no `RETURNING`, so it cannot be compiled into a statement.\n *\n * `session.execute()` still honors `.returning()` on a **single-row INSERT** by\n * running the insert and reading the row back by key on the same connection —\n * that is execution, not compilation, so it never reaches here. Compiling a\n * node with `returning` directly is an error, rather than SQL that silently\n * returns nothing.\n */\n protected override compileReturning(returning: readonly string[] | \"*\" | null): string {\n if (returning === null) return \"\";\n throw new Error(\n \"RETURNING cannot be compiled for MySQL. session.execute() reads a single-row INSERT back by key (LAST_INSERT_ID()); UPDATE/DELETE have no equivalent — run a SELECT yourself.\",\n );\n }\n}\n\n/** Get a dialect instance by name. */\nexport function getDialect(name: Dialect): BaseDialect {\n switch (name) {\n case \"sqlite\":\n return new SqliteDialect();\n case \"postgresql\":\n return new PostgresDialect();\n case \"mysql\":\n return new MysqlDialect();\n }\n}\n","/**\n * tempest-db-js — Phase 5: typed joins with composite result types.\n *\n * `join(User, \"user\").innerJoin(Order, \"order\", { \"user.id\": \"order.userId\" })`\n * yields rows shaped `{ user: UserRow; order: OrderRow }`. A `leftJoin` makes the\n * joined side nullable (`OrderRow | null`), matching SQL outer-join semantics.\n *\n * Columns are aliased in SQL (`\"user\".\"id\" AS \"user.id\"`) so a flat driver row is\n * split back into one nested object per source, each coerced by its model.\n */\n\nimport { type CondNode, type Condition, toCondNode } from \"./conditions.js\";\nimport {\n type InferModel,\n type ModelClass,\n type NameMap,\n columnNamesOf,\n columnsOf,\n} from \"./index.js\";\nimport type { OperatorsFor, SortDirection } from \"./query.js\";\n\n// ---------------------------------------------------------------------------\n// AST\n// ---------------------------------------------------------------------------\n\n/** One joined table. */\nexport interface JoinClause {\n readonly kind: \"inner\" | \"left\";\n readonly table: string;\n readonly alias: string;\n /** Equality pairs of qualified columns: `[\"user.id\", \"order.userId\"]`. */\n readonly on: readonly (readonly [string, string])[];\n}\n\n/** A selected column, qualified by source alias. */\nexport interface JoinSelection {\n readonly alias: string;\n readonly column: string;\n}\n\n/** Collapse a union of object types into their intersection. */\ntype UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never;\n\n/**\n * `where` filter for a join. Keys are `alias.column` refs; each value accepts a\n * bare value (shorthand for `eq`) or an operator object restricted to the\n * operators valid for that column's type — exactly like the single-table\n * {@link WhereInput}, but qualified per source. `like` on a numeric join column,\n * or `gt` on a string one, is a compile error.\n */\nexport type JoinWhereInput<S extends Sources> = Partial<\n UnionToIntersection<\n {\n [A in keyof S]: {\n [C in keyof NonNullable<S[A]> & string as `${A & string}.${C}`]:\n | NonNullable<S[A]>[C]\n | OperatorsFor<NonNullable<NonNullable<S[A]>[C]>>;\n };\n }[keyof S]\n >\n>;\n\n/** Serializable AST for a multi-table SELECT. */\nexport interface JoinNode {\n readonly kind: \"join_select\";\n readonly base: { readonly table: string; readonly alias: string };\n readonly joins: readonly JoinClause[];\n readonly selections: readonly JoinSelection[];\n readonly where: CondNode | undefined;\n readonly orderBy: readonly {\n readonly ref: string;\n readonly direction: SortDirection;\n }[];\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n /** Per-alias property → column maps, for the sources that rename columns. */\n readonly names?: Readonly<Record<string, NameMap>> | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// type helpers\n// ---------------------------------------------------------------------------\n\n/** A map of source alias → its (possibly nullable) row type. */\nexport type Sources = Record<string, object | null>;\n\n/** Every `alias.column` reference across the current sources. */\nexport type ColRef<S extends Sources> = {\n [A in keyof S]: `${A & string}.${keyof NonNullable<S[A]> & string}`;\n}[keyof S];\n\n/** Valid `alias.column` references for a newly joined model. */\ntype RightRef<\n A extends string,\n C extends ModelClass,\n> = `${A}.${keyof InferModel<C> & string}`;\n\n/** The `on` condition: map existing-source refs to new-table refs (equality). */\nexport type JoinOn<S extends Sources, A extends string, C extends ModelClass> = Partial<\n Record<ColRef<S>, RightRef<A, C>>\n>;\n\n// ---------------------------------------------------------------------------\n// builder\n// ---------------------------------------------------------------------------\n\n/** Build the qualified selection list for a model under an alias. */\nfunction selectionsFor(alias: string, model: ModelClass): JoinSelection[] {\n return Object.keys(columnsOf(model)).map((column) => ({ alias, column }));\n}\n\n/**\n * Register a source's property → column map under its alias, or keep the node\n * map untouched when the model renames nothing.\n *\n * @param current The node's existing per-alias maps.\n * @param alias The alias the model is joined under.\n * @param model The joined model.\n * @returns The updated map, or `undefined` when no source renames anything.\n */\nfunction withAliasNames(\n current: Readonly<Record<string, NameMap>> | undefined,\n alias: string,\n model: ModelClass,\n): Readonly<Record<string, NameMap>> | undefined {\n const names = columnNamesOf(model);\n if (!names) return current;\n return { ...(current ?? {}), [alias]: names };\n}\n\n/**\n * Immutable, chainable multi-table SELECT builder.\n *\n * @typeParam S - the accumulated sources (alias → row type; nullable for left joins).\n */\nexport class JoinBuilder<S extends Sources> {\n /** Phantom: the composite result row type. */\n declare readonly __row: { [A in keyof S]: S[A] };\n\n constructor(\n readonly node: JoinNode,\n /** Source models keyed by alias, for SQL expansion and row coercion. */\n readonly sources: Readonly<Record<string, ModelClass>>,\n ) {}\n\n private add<S2 extends Sources>(\n clause: JoinClause,\n model: ModelClass,\n ): JoinBuilder<S2> {\n return new JoinBuilder<S2>(\n {\n ...this.node,\n joins: [...this.node.joins, clause],\n selections: [...this.node.selections, ...selectionsFor(clause.alias, model)],\n names: withAliasNames(this.node.names, clause.alias, model),\n },\n { ...this.sources, [clause.alias]: model },\n );\n }\n\n private clause(\n kind: \"inner\" | \"left\",\n model: ModelClass,\n alias: string,\n on: Record<string, string>,\n ): JoinClause {\n return {\n kind,\n table: model.tablename,\n alias,\n on: Object.entries(on) as [string, string][],\n };\n }\n\n /** Inner join another model under `alias`. */\n innerJoin<C extends ModelClass, A extends string>(\n model: C,\n alias: A,\n on: JoinOn<S, A, C>,\n ): JoinBuilder<S & { [K in A]: InferModel<C> }> {\n return this.add(\n this.clause(\"inner\", model, alias, on as Record<string, string>),\n model,\n );\n }\n\n /** Left (outer) join another model under `alias` — its side becomes nullable. */\n leftJoin<C extends ModelClass, A extends string>(\n model: C,\n alias: A,\n on: JoinOn<S, A, C>,\n ): JoinBuilder<S & { [K in A]: InferModel<C> | null }> {\n return this.add(\n this.clause(\"left\", model, alias, on as Record<string, string>),\n model,\n );\n }\n\n /** Filter by `alias.column` references (object form) or an `and`/`or`/`not`. */\n where(input: JoinWhereInput<S> | Condition): JoinBuilder<S> {\n return new JoinBuilder<S>(\n { ...this.node, where: toCondNode(input as Record<string, unknown>) },\n this.sources,\n );\n }\n\n /** Order by an `alias.column` reference. */\n orderBy(ref: ColRef<S>, direction: SortDirection = \"asc\"): JoinBuilder<S> {\n return new JoinBuilder<S>(\n {\n ...this.node,\n orderBy: [...this.node.orderBy, { ref: ref as string, direction }],\n },\n this.sources,\n );\n }\n\n limit(n: number): JoinBuilder<S> {\n return new JoinBuilder<S>({ ...this.node, limit: n }, this.sources);\n }\n\n offset(n: number): JoinBuilder<S> {\n return new JoinBuilder<S>({ ...this.node, offset: n }, this.sources);\n }\n}\n\n// ---------------------------------------------------------------------------\n// entrypoint\n// ---------------------------------------------------------------------------\n\n/**\n * Start a multi-table query from a base model under `alias`.\n *\n * @param model The base model.\n * @param alias The alias to key the base table's rows under in the result.\n * @returns A `JoinBuilder` with the base source registered.\n */\nexport function join<C extends ModelClass, A extends string>(\n model: C,\n alias: A,\n): JoinBuilder<{ [K in A]: InferModel<C> }> {\n return new JoinBuilder(\n {\n kind: \"join_select\",\n base: { table: model.tablename, alias },\n joins: [],\n selections: selectionsFor(alias, model),\n where: undefined,\n orderBy: [],\n limit: undefined,\n offset: undefined,\n names: withAliasNames(undefined, alias, model),\n },\n { [alias]: model },\n );\n}\n","/**\n * tempest-db-js — Phase 7: typed repository + pagination.\n *\n * `BaseRepository<Model>` mirrors the `tempest-fastapi-sdk` repository: a thin,\n * fully-typed CRUD + pagination layer over a model and an async session. The\n * 404-convention is honored — `getById` throws when absent, collection methods\n * return `[]` (never a \"not found\" error for an empty list).\n */\n\nimport type { AsyncSession } from \"./engine.js\";\nimport {\n type InferInsert,\n type InferModel,\n type ModelClass,\n type WhereInput,\n columnsOf,\n del,\n insert,\n select,\n update,\n} from \"./index.js\";\n\n/** Pagination request — 1-indexed page. */\nexport interface PaginationFilter<Row> {\n readonly page?: number;\n readonly pageSize?: number;\n readonly orderBy?: keyof Row & string;\n readonly ascending?: boolean;\n readonly filters?: WhereInput<Row>;\n}\n\n/** A page of results plus metadata (mirrors `BasePaginationSchema`). */\nexport interface PaginationResult<Row> {\n readonly items: Row[];\n readonly total: number;\n readonly page: number;\n readonly pageSize: number;\n readonly pages: number;\n}\n\n/** Raised by single-record lookups (`getById`) when nothing matches (404). */\nexport class RecordNotFound extends Error {\n constructor(table: string, id: unknown) {\n super(`${table} not found for id ${JSON.stringify(id)}`);\n this.name = \"RecordNotFound\";\n }\n}\n\n/** Find the single primary-key column name of a model. */\nfunction primaryKeyOf(model: ModelClass): string {\n for (const [name, col] of Object.entries(columnsOf(model))) {\n if (col.flags.primaryKey) return name;\n }\n throw new Error(`${model.tablename} has no primary key`);\n}\n\n/**\n * A fully-typed CRUD + pagination repository over a model and an async session.\n *\n * @typeParam C - the model class.\n */\nexport class BaseRepository<C extends ModelClass> {\n private readonly pk: string;\n\n constructor(\n protected readonly model: C,\n protected readonly session: AsyncSession,\n ) {\n this.pk = primaryKeyOf(model);\n }\n\n /** All rows matching `filters` (or everything). Empty list when none match. */\n async list(filters?: WhereInput<InferModel<C>>): Promise<InferModel<C>[]> {\n const query = filters ? select(this.model).where(filters) : select(this.model);\n return this.session.execute(query).all();\n }\n\n /** The first row matching `filters`, or `null`. */\n async first(filters?: WhereInput<InferModel<C>>): Promise<InferModel<C> | null> {\n const query = filters ? select(this.model).where(filters) : select(this.model);\n return this.session.execute(query).first();\n }\n\n /** A single row by primary key, or `null`. */\n async getByIdOrNull(id: unknown): Promise<InferModel<C> | null> {\n return this.session\n .execute(select(this.model).where({ [this.pk]: id } as WhereInput<InferModel<C>>))\n .first();\n }\n\n /** A single row by primary key; throws `RecordNotFound` when absent. */\n async getById(id: unknown): Promise<InferModel<C>> {\n const row = await this.getByIdOrNull(id);\n if (row === null) throw new RecordNotFound(this.model.tablename, id);\n return row;\n }\n\n /** Whether any row matches `filters`. */\n async exists(filters: WhereInput<InferModel<C>>): Promise<boolean> {\n return (await this.first(filters)) !== null;\n }\n\n /** How many rows match `filters` (or the whole table). */\n async count(filters?: WhereInput<InferModel<C>>): Promise<number> {\n const query = filters\n ? select(this.model, [this.pk as keyof InferModel<C> & string]).where(filters)\n : select(this.model, [this.pk as keyof InferModel<C> & string]);\n return (await this.session.execute(query).all()).length;\n }\n\n /** Insert one row, returning the created row. */\n async create(data: InferInsert<C>): Promise<InferModel<C>> {\n return this.session.execute(insert(this.model).values(data).returning()).one();\n }\n\n /** Insert many rows, returning the created rows. */\n async createMany(data: readonly InferInsert<C>[]): Promise<InferModel<C>[]> {\n if (data.length === 0) return [];\n return this.session.execute(insert(this.model).values(data).returning()).all();\n }\n\n /** Update rows matching `filters`; returns the number of rows affected. */\n async update(\n filters: WhereInput<InferModel<C>>,\n set: Partial<InferModel<C>>,\n ): Promise<number> {\n return this.session\n .execute(update(this.model).set(set).where(filters))\n .rowsAffected();\n }\n\n /** Delete rows matching `filters`; returns the number of rows affected. */\n async delete(filters: WhereInput<InferModel<C>>): Promise<number> {\n return this.session.execute(del(this.model).where(filters)).rowsAffected();\n }\n\n /**\n * A page of rows plus metadata. `total` counts all matching rows.\n *\n * @param filter Page, size, ordering and filters.\n * @returns The page and pagination metadata.\n */\n async paginate(\n filter: PaginationFilter<InferModel<C>> = {},\n ): Promise<PaginationResult<InferModel<C>>> {\n const page = Math.max(1, filter.page ?? 1);\n const pageSize = Math.max(1, filter.pageSize ?? 20);\n const where = filter.filters;\n\n let query = where ? select(this.model).where(where) : select(this.model);\n if (filter.orderBy) {\n query = query.orderBy(filter.orderBy, filter.ascending === false ? \"desc\" : \"asc\");\n }\n query = query.limit(pageSize).offset((page - 1) * pageSize);\n\n const items = await this.session.execute(query).all();\n const total = await this.count(where);\n return {\n items,\n total,\n page,\n pageSize,\n pages: Math.max(1, Math.ceil(total / pageSize)),\n };\n }\n}\n","/**\n * tempest-db-js — opt-in active-record layer.\n *\n * The library's default return shape is a plain inferred object (a locked design\n * decision — see the roadmap). This module adds an **opt-in** wrapper for code\n * that prefers instance methods: `ActiveRecord` holds the plain row on `.data`\n * and exposes `save` / `update` / `delete` / `reload` over an async session. It\n * never replaces the default plain-object return — you reach for it explicitly.\n */\n\nimport type { AsyncSession } from \"./engine.js\";\nimport {\n type InferInsert,\n type InferModel,\n type ModelClass,\n columnsOf,\n} from \"./index.js\";\nimport { insert } from \"./mutations.js\";\nimport { del, update } from \"./mutations.js\";\nimport { type WhereInput, select } from \"./query.js\";\n\n/** Find the single primary-key column name of a model. */\nfunction primaryKeyOf(model: ModelClass): string {\n for (const [name, col] of Object.entries(columnsOf(model))) {\n if (col.flags.primaryKey) return name;\n }\n throw new Error(`${model.tablename} has no primary key`);\n}\n\n/**\n * An opt-in active-record wrapper around a single row.\n *\n * The current field values live on {@link data} (a plain, typed row object).\n * Mutating methods persist through the bound session and refresh `data`.\n *\n * @typeParam C - the model class.\n */\nexport class ActiveRecord<C extends ModelClass> {\n private readonly pk: string;\n\n constructor(\n private readonly model: C,\n private readonly session: AsyncSession,\n /** The current field values (a plain, typed row). */\n public data: InferModel<C>,\n ) {\n this.pk = primaryKeyOf(model);\n }\n\n /** The primary-key value of the wrapped row. */\n private pkValue(): unknown {\n return (this.data as Record<string, unknown>)[this.pk];\n }\n\n private pkFilter(): WhereInput<InferModel<C>> {\n return { [this.pk]: this.pkValue() } as WhereInput<InferModel<C>>;\n }\n\n /**\n * Persist the current `data` — insert if new, otherwise overwrite the existing\n * row (upsert on the primary key). Refreshes `data` from the returned row.\n *\n * @returns This wrapper, for chaining.\n */\n async save(): Promise<this> {\n // Overwrite only the columns actually present in `data` (an absent column\n // would otherwise be set to null and could violate NOT NULL / clobber a\n // DB-side default).\n const cols = columnsOf(this.model);\n const rowData = this.data as Record<string, unknown>;\n const setPatch: Record<string, unknown> = {};\n for (const c of Object.keys(rowData)) {\n if (c !== this.pk && c in cols) setPatch[c] = rowData[c];\n }\n const saved = await this.session\n .execute(\n insert(this.model)\n .values(this.data as InferInsert<C>)\n .onConflictDoUpdate(\n [this.pk] as (keyof InferModel<C> & string)[],\n setPatch as Partial<InferModel<C>>,\n )\n .returning(),\n )\n .one();\n this.data = saved as InferModel<C>;\n return this;\n }\n\n /**\n * Update the given columns for this row and merge them into `data`.\n *\n * @param patch The columns to change.\n * @returns This wrapper, for chaining.\n */\n async update(patch: Partial<InferModel<C>>): Promise<this> {\n await this.session.execute(update(this.model).set(patch).where(this.pkFilter()));\n this.data = { ...this.data, ...patch };\n return this;\n }\n\n /**\n * Delete this row.\n *\n * @returns The number of rows affected (0 or 1).\n */\n async delete(): Promise<number> {\n return this.session.execute(del(this.model).where(this.pkFilter())).rowsAffected();\n }\n\n /**\n * Re-fetch this row by primary key and refresh `data`.\n *\n * @returns This wrapper, for chaining.\n * @throws When the row no longer exists.\n */\n async reload(): Promise<this> {\n const fresh = await this.session\n .execute(select(this.model).where(this.pkFilter()))\n .first();\n if (fresh === null) {\n throw new Error(\n `${this.model.tablename} row ${JSON.stringify(this.pkValue())} not found on reload`,\n );\n }\n this.data = fresh as InferModel<C>;\n return this;\n }\n}\n\n/** A small factory binding a model + session for producing {@link ActiveRecord}s. */\nexport interface ActiveRecordManager<C extends ModelClass> {\n /** Wrap an existing row (already loaded) as an active record. */\n wrap(row: InferModel<C>): ActiveRecord<C>;\n /** Build an unsaved active record from insert data; call `.save()` to persist. */\n create(data: InferInsert<C>): ActiveRecord<C>;\n /** Fetch a row by primary key and wrap it, or `null` if absent. */\n get(id: unknown): Promise<ActiveRecord<C> | null>;\n}\n\n/**\n * Create an {@link ActiveRecordManager} for a model over a session.\n *\n * @param model The model class.\n * @param session The async session to persist through.\n * @returns A manager that wraps/fetches rows as active records.\n *\n * @example\n * ```ts\n * const users = activeRecord(User, engine.session());\n * const u = users.create({ name: \"Ana\", age: 30 });\n * await u.save();\n * await u.update({ age: 31 });\n * await u.delete();\n * ```\n */\nexport function activeRecord<C extends ModelClass>(\n model: C,\n session: AsyncSession,\n): ActiveRecordManager<C> {\n const pk = primaryKeyOf(model);\n return {\n wrap: (row) => new ActiveRecord(model, session, row),\n create: (data) => new ActiveRecord(model, session, data as unknown as InferModel<C>),\n async get(id) {\n const row = await session\n .execute(select(model).where({ [pk]: id } as WhereInput<InferModel<C>>))\n .first();\n return row === null ? null : new ActiveRecord(model, session, row as InferModel<C>);\n },\n };\n}\n","/**\n * tempest-db-js — typed relations (hasMany / belongsTo) with eager loading.\n *\n * Relations are plain descriptors that reference another model plus the local /\n * foreign key. `loadRelations` fetches the related rows in **one query per\n * relation** (no N+1), groups them, and attaches them to the base rows — with\n * the result type widened so each relation key is typed (`Row[]` for hasMany,\n * `Row | null` for belongsTo).\n */\n\nimport type { AsyncSession } from \"./engine.js\";\nimport { type InferModel, type ModelClass, type WhereInput, select } from \"./index.js\";\n\n/** A one-to-many relation: each base row owns many target rows. */\nexport interface HasMany<C extends ModelClass> {\n readonly kind: \"hasMany\";\n readonly target: () => C;\n /** Column on the base row (usually its primary key). */\n readonly localKey: string;\n /** Column on the target row pointing back to the base row. */\n readonly foreignKey: string;\n}\n\n/** A many-to-one relation: each base row points to one target row. */\nexport interface BelongsTo<C extends ModelClass> {\n readonly kind: \"belongsTo\";\n readonly target: () => C;\n /** Column on the base row holding the foreign key. */\n readonly localKey: string;\n /** Column on the target row (usually its primary key). */\n readonly foreignKey: string;\n}\n\n/* biome-ignore lint/suspicious/noExplicitAny: a relation map mixes target models. */\nexport type Relation = HasMany<any> | BelongsTo<any>;\n\n/** Declare a one-to-many relation. */\nexport function hasMany<C extends ModelClass>(\n target: () => C,\n keys: { localKey: string; foreignKey: string },\n): HasMany<C> {\n return {\n kind: \"hasMany\",\n target,\n localKey: keys.localKey,\n foreignKey: keys.foreignKey,\n };\n}\n\n/** Declare a many-to-one relation. */\nexport function belongsTo<C extends ModelClass>(\n target: () => C,\n keys: { localKey: string; foreignKey: string },\n): BelongsTo<C> {\n return {\n kind: \"belongsTo\",\n target,\n localKey: keys.localKey,\n foreignKey: keys.foreignKey,\n };\n}\n\n/** The value a relation contributes to a loaded row. */\nexport type RelationValue<R> = R extends HasMany<infer C>\n ? InferModel<C>[]\n : R extends BelongsTo<infer C>\n ? InferModel<C> | null\n : never;\n\n/** A base row augmented with its loaded relations. */\nexport type WithRelations<Row, Spec extends Record<string, Relation>> = Row & {\n [K in keyof Spec]: RelationValue<Spec[K]>;\n};\n\n/**\n * Eager-load relations onto a set of base rows. One query per relation.\n *\n * @param session The async session to query through.\n * @param rows The already-loaded base rows.\n * @param spec A map of relation name → relation descriptor.\n * @returns The base rows, each augmented with its relation values.\n */\nexport async function loadRelations<\n Row extends Record<string, unknown>,\n Spec extends Record<string, Relation>,\n>(session: AsyncSession, rows: Row[], spec: Spec): Promise<WithRelations<Row, Spec>[]> {\n const out = rows.map((r) => ({ ...r })) as Record<string, unknown>[];\n\n for (const [name, rel] of Object.entries(spec)) {\n const target = rel.target();\n const localValues = [...new Set(rows.map((r) => r[rel.localKey]))];\n const related =\n localValues.length > 0\n ? await session\n .execute(\n select(target).where({\n [rel.foreignKey]: { in: localValues },\n } as WhereInput<InferModel<typeof target>>),\n )\n .all()\n : [];\n\n if (rel.kind === \"hasMany\") {\n const grouped = new Map<unknown, Record<string, unknown>[]>();\n for (const row of related as Record<string, unknown>[]) {\n const key = row[rel.foreignKey];\n const list = grouped.get(key) ?? [];\n list.push(row);\n grouped.set(key, list);\n }\n out.forEach((r, i) => {\n r[name] = grouped.get(rows[i]?.[rel.localKey]) ?? [];\n });\n } else {\n const byKey = new Map<unknown, Record<string, unknown>>();\n for (const row of related as Record<string, unknown>[]) {\n byKey.set(row[rel.foreignKey], row);\n }\n out.forEach((r, i) => {\n r[name] = byKey.get(rows[i]?.[rel.localKey]) ?? null;\n });\n }\n }\n\n return out as WithRelations<Row, Spec>[];\n}\n","/**\n * tempest-db-js — Phase 4b: engine, session, real execution.\n *\n * Async by default (`createEngine`), with an optional sync engine for SQLite\n * (`createSyncEngine`). The database is identified by its URL (Phase 4a's\n * `parseDatabaseUrl`); the dialect compiles the builder AST to `{ sql, params }`\n * (Phase 4a's `getDialect`); a driver runs it; rows are coerced back to native\n * types via `coerceRow` (the serialization layer).\n *\n * SQLite execution is real and tested here through Node's built-in `node:sqlite`.\n * `better-sqlite3` and `postgres` (postgres.js) are lazy-loaded peer drivers.\n */\n\nimport { createRequire } from \"node:module\";\nimport { col, fn } from \"./conditions.js\";\nimport { type BaseDialect, getDialect } from \"./dialect.js\";\nimport { type ModelClass, columnNamesOf, columnsOf } from \"./index.js\";\nimport type { JoinBuilder, JoinNode } from \"./join.js\";\nimport type { InsertBuilder, InsertNode, UpdateBuilder } from \"./mutations.js\";\nimport { type SelectBuilder, select } from \"./query.js\";\nimport { coerceRow } from \"./serialize.js\";\nimport { type Dialect, parseDatabaseUrl } from \"./url.js\";\n\n/** A synchronous `require`, usable from both ESM and CJS builds. */\nconst nodeRequire = createRequire(import.meta.url);\n\n// ---------------------------------------------------------------------------\n// driver layer\n// ---------------------------------------------------------------------------\n\n/** The outcome of running one statement. */\nexport interface DriverResult {\n /** Returned rows (SELECT or `RETURNING`); empty otherwise. */\n readonly rows: Record<string, unknown>[];\n /** Rows affected by an INSERT/UPDATE/DELETE. */\n readonly changes: number;\n}\n\n/** A synchronous driver (SQLite). */\nexport interface SyncDriver {\n execute(sql: string, params: readonly unknown[]): DriverResult;\n /** Lazily iterate rows (for `.stream()`), if the driver supports it. */\n iterate?(\n sql: string,\n params: readonly unknown[],\n ): IterableIterator<Record<string, unknown>>;\n close(): void;\n}\n\n/** An asynchronous driver (PostgreSQL, or an async-wrapped SQLite). */\nexport interface AsyncDriver {\n execute(sql: string, params: readonly unknown[]): Promise<DriverResult>;\n /** Lazily iterate rows (for `.stream()`), if the driver supports it. */\n iterate?(\n sql: string,\n params: readonly unknown[],\n ): AsyncIterableIterator<Record<string, unknown>>;\n /**\n * Reserve a single pinned connection for the duration of a transaction.\n * Pooled drivers (PostgreSQL) MUST implement this so `BEGIN`/`COMMIT` and the\n * statements between them all run on the same connection. Single-connection\n * drivers (SQLite) may omit it — `transaction` then runs on the shared handle.\n */\n reserve?(): Promise<ReservedAsyncDriver>;\n close(): Promise<void>;\n}\n\n/** An {@link AsyncDriver} pinned to one connection, used inside a transaction. */\nexport interface ReservedAsyncDriver extends AsyncDriver {\n /** Return the pinned connection to the pool. */\n release(): Promise<void>;\n}\n\n/** Encode a JS value into something a SQLite driver can bind. */\nfunction encodeSqliteParam(value: unknown): unknown {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Uint8Array) return value;\n if (typeof value === \"object\") return JSON.stringify(value);\n return value; // number, bigint, string\n}\n\n/** SQLite driver backed by Node's built-in `node:sqlite` (zero install). */\nexport class NodeSqliteDriver implements SyncDriver {\n // biome-ignore lint/suspicious/noExplicitAny: node:sqlite DatabaseSync has no shipped types here.\n private readonly db: any;\n /**\n * Prepared-statement cache keyed by SQL text. tempest-db-js always\n * parameterizes, so a query shape maps to one stable SQL string — reusing the\n * compiled statement avoids re-`prepare()` on every call (the dominant cost of\n * per-row inserts and point lookups).\n */\n // biome-ignore lint/suspicious/noExplicitAny: node:sqlite StatementSync has no shipped types here.\n private readonly statements = new Map<string, any>();\n\n // biome-ignore lint/suspicious/noExplicitAny: accept an already-open DatabaseSync handle.\n constructor(database: any) {\n this.db = database;\n }\n\n /**\n * Open a `node:sqlite` database at the given path (or `:memory:`).\n *\n * @param path The database file, or `\":memory:\"`.\n * @param options Passed straight to `DatabaseSync` (`readOnly`, `timeout`, …).\n * @returns A driver over the open handle.\n */\n static open(\n path: string,\n options?: Readonly<Record<string, unknown>>,\n ): NodeSqliteDriver {\n // Lazy require so importing tempest-db-js never forces the built-in module to load.\n const { DatabaseSync } = nodeRequire(\"node:sqlite\") as {\n DatabaseSync: new (path: string, options?: Record<string, unknown>) => unknown;\n };\n return new NodeSqliteDriver(\n options ? new DatabaseSync(path, { ...options }) : new DatabaseSync(path),\n );\n }\n\n /** Return the cached prepared statement for `sql`, preparing it on first use. */\n // biome-ignore lint/suspicious/noExplicitAny: statement type is unavailable here.\n private prepare(sql: string): any {\n const cached = this.statements.get(sql);\n if (cached) return cached;\n const stmt = this.db.prepare(sql);\n this.statements.set(sql, stmt);\n return stmt;\n }\n\n execute(sql: string, params: readonly unknown[]): DriverResult {\n const stmt = this.prepare(sql);\n const bound = params.map(encodeSqliteParam);\n if (returnsRows(sql)) {\n return { rows: stmt.all(...bound) as Record<string, unknown>[], changes: 0 };\n }\n const info = stmt.run(...bound);\n return { rows: [], changes: Number(info.changes ?? 0) };\n }\n\n *iterate(\n sql: string,\n params: readonly unknown[],\n ): IterableIterator<Record<string, unknown>> {\n const stmt = this.prepare(sql);\n const bound = params.map(encodeSqliteParam);\n yield* stmt.iterate(...bound) as IterableIterator<Record<string, unknown>>;\n }\n\n close(): void {\n this.statements.clear();\n this.db.close();\n }\n}\n\n/** True when a statement yields rows (SELECT, PRAGMA, or any `RETURNING`). */\nfunction returnsRows(sql: string): boolean {\n return /^\\s*(select|pragma)/i.test(sql) || /\\breturning\\b/i.test(sql);\n}\n\n// ---------------------------------------------------------------------------\n// executable builders & row extraction\n// ---------------------------------------------------------------------------\n\n/* biome-ignore lint/suspicious/noExplicitAny: builder generics are irrelevant to execution dispatch. */\ntype AnySelect = SelectBuilder<any, any, any>;\n/* biome-ignore lint/suspicious/noExplicitAny: see above. */\ntype AnyInsert = InsertBuilder<any, any, any>;\n/* biome-ignore lint/suspicious/noExplicitAny: only the guarded flag matters. */\ntype GuardedUpdate = UpdateBuilder<any, true, any>;\n/* biome-ignore lint/suspicious/noExplicitAny: only the guarded flag matters. */\ntype GuardedDelete = import(\"./mutations.js\").DeleteBuilder<any, true, any>;\n/* biome-ignore lint/suspicious/noExplicitAny: join sources are irrelevant to dispatch. */\ntype AnyJoin = JoinBuilder<any>;\n\n/**\n * A builder that is safe to execute. UPDATE/DELETE are accepted only once\n * guarded (after `.where()` or `.unguarded()`) — an unguarded full-table write\n * is a compile error at the execution boundary.\n */\nexport type Executable = AnySelect | AnyInsert | GuardedUpdate | GuardedDelete | AnyJoin;\n\n/** The element type a builder yields on execution. */\nexport type RowOf<B> = B extends { readonly __row: infer R } ? R : never;\n\n/** Internals shared between single-table builders, read structurally at runtime. */\ninterface SingleBuilder {\n readonly node: Parameters<BaseDialect[\"compile\"]>[0];\n readonly source: ModelClass;\n}\n\n/** Internals of a join builder, read structurally at runtime. */\ninterface JoinRunnable {\n readonly node: JoinNode;\n readonly sources: Readonly<Record<string, ModelClass>>;\n}\n\n/** Split one flat `alias.column` row into a coerced composite `{ alias: {...} }`. */\nfunction splitJoinRow(\n node: JoinNode,\n sources: Readonly<Record<string, ModelClass>>,\n raw: Record<string, unknown>,\n): Record<string, unknown> {\n const leftAliases = new Set(\n node.joins.filter((j) => j.kind === \"left\").map((j) => j.alias),\n );\n const out: Record<string, unknown> = {};\n for (const [alias, model] of Object.entries(sources)) {\n const sub: Record<string, unknown> = {};\n const names = columnNamesOf(model);\n let allNull = true;\n for (const colName of Object.keys(columnsOf(model))) {\n const value = raw[`${alias}.${colName}`];\n if (value !== null && value !== undefined) allNull = false;\n sub[names?.[colName] ?? colName] = value;\n }\n out[alias] = leftAliases.has(alias) && allNull ? null : coerceRow(model, sub);\n }\n return out;\n}\n\n/** Coerce one raw driver row into the builder's native row shape. */\nfunction coerceOne(builder: unknown, raw: Record<string, unknown>): unknown {\n const node = (builder as { node: { kind: string } }).node;\n if (node.kind === \"join_select\") {\n const b = builder as unknown as JoinRunnable;\n return splitJoinRow(b.node, b.sources, raw);\n }\n const b = builder as unknown as SingleBuilder;\n return coerceRow(b.source, raw);\n}\n\n/** Coerce raw driver rows into the builder's native row shape. */\nfunction mapRows(builder: unknown, raw: Record<string, unknown>[]): unknown[] {\n return raw.map((r) => coerceOne(builder, r));\n}\n\n// ---------------------------------------------------------------------------\n// results\n// ---------------------------------------------------------------------------\n\n/** Raised by `.one()` when the row count is not exactly one. */\nexport class NoResultError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NoResultError\";\n }\n}\n\n/** A short, safe preview of a bound parameter for an error message. */\nfunction previewParam(value: unknown): string {\n if (value === null || value === undefined) return \"null\";\n if (value instanceof Uint8Array) return `<${value.length} bytes>`;\n const text = typeof value === \"string\" ? value : String(value);\n return text.length > 64 ? `${text.slice(0, 61)}...` : text;\n}\n\n/**\n * Raised when the driver rejects a statement. Wraps the original driver error\n * and attaches the offending SQL and its bound parameters, so a failure points\n * at the exact query instead of an opaque driver message.\n */\nexport class QueryExecutionError extends Error {\n constructor(\n /** The original error thrown by the driver. */\n override readonly cause: unknown,\n /** The SQL that failed. */\n readonly sql: string,\n /** The bound parameters, in order. */\n readonly params: readonly unknown[],\n ) {\n const reason = cause instanceof Error ? cause.message : String(cause);\n super(\n `Query failed: ${reason}\\n SQL: ${sql}\\n params: [${params\n .map(previewParam)\n .join(\", \")}]`,\n );\n this.name = \"QueryExecutionError\";\n }\n}\n\n/**\n * A hook invoked for every statement a session runs (query logging / tracing).\n * Errors thrown by the logger are ignored so logging never breaks execution.\n */\nexport type QueryLogger = (event: {\n readonly sql: string;\n readonly params: readonly unknown[];\n}) => void;\n\n/** Invoke a query logger, swallowing any error it throws. */\nfunction emitLog(\n logger: QueryLogger | undefined,\n sql: string,\n params: readonly unknown[],\n): void {\n if (!logger) return;\n try {\n logger({ sql, params });\n } catch {\n // logging must never break execution\n }\n}\n\nfunction firstScalar(row: Record<string, unknown> | undefined): unknown {\n if (!row) return null;\n const keys = Object.keys(row);\n return keys.length > 0 ? row[keys[0] as string] : null;\n}\n\n/** Synchronous result view over already-fetched rows. */\nexport class SyncResult<Row> {\n constructor(\n private readonly rows: Row[],\n private readonly changes: number,\n ) {}\n\n all(): Row[] {\n return this.rows;\n }\n first(): Row | null {\n return this.rows[0] ?? null;\n }\n one(): Row {\n if (this.rows.length !== 1) {\n throw new NoResultError(`expected exactly one row, got ${this.rows.length}`);\n }\n return this.rows[0] as Row;\n }\n oneOrNull(): Row | null {\n if (this.rows.length > 1) {\n throw new NoResultError(`expected at most one row, got ${this.rows.length}`);\n }\n return this.rows[0] ?? null;\n }\n scalar(): unknown {\n return firstScalar(this.rows[0] as Record<string, unknown> | undefined);\n }\n scalars(): unknown[] {\n return this.rows.map((r) => firstScalar(r as Record<string, unknown>));\n }\n rowsAffected(): number {\n return this.changes;\n }\n}\n\n/** Asynchronous result view (terminals return Promises). */\nexport class AsyncResult<Row> {\n constructor(private readonly inner: Promise<SyncResult<Row>>) {}\n\n async all(): Promise<Row[]> {\n return (await this.inner).all();\n }\n async first(): Promise<Row | null> {\n return (await this.inner).first();\n }\n async one(): Promise<Row> {\n return (await this.inner).one();\n }\n async oneOrNull(): Promise<Row | null> {\n return (await this.inner).oneOrNull();\n }\n async scalar(): Promise<unknown> {\n return (await this.inner).scalar();\n }\n async scalars(): Promise<unknown[]> {\n return (await this.inner).scalars();\n }\n async rowsAffected(): Promise<number> {\n return (await this.inner).rowsAffected();\n }\n}\n\n// ---------------------------------------------------------------------------\n// sessions\n// ---------------------------------------------------------------------------\n\nlet savepointCounter = 0;\n\n/**\n * True when a builder asks for `RETURNING` on a dialect that has none, so the\n * session must insert and read the row back instead of compiling one statement.\n */\nfunction needsInsertReadBack(\n dialect: BaseDialect,\n node: Parameters<BaseDialect[\"compile\"]>[0],\n): node is InsertNode {\n return dialect.name === \"mysql\" && node.kind === \"insert\" && node.returning !== null;\n}\n\n/** The model's single primary-key property name, for the insert read-back. */\nfunction singlePrimaryKey(model: ModelClass): string {\n const keys = Object.entries(columnsOf(model))\n .filter(([, column]) => column.flags.primaryKey)\n .map(([name]) => name);\n if (keys.length !== 1) {\n throw new Error(\n `${model.tablename} needs exactly one primary key to read an insert back on a dialect without RETURNING; found ${keys.length}.`,\n );\n }\n return keys[0] as string;\n}\n\n/** Reject a `raw()` call whose parameters are not an array. */\nfunction assertRawParams(params: readonly unknown[]): void {\n if (!Array.isArray(params)) {\n throw new TypeError(\n \"session.raw(sql, params) takes an array of bound parameters — never interpolate values into the SQL string.\",\n );\n }\n}\n\n/** A synchronous unit of work (SQLite). */\nexport class SyncSession {\n constructor(\n private readonly driver: SyncDriver,\n private readonly dialect: BaseDialect,\n /** Optional per-statement logger (query tracing). */\n private readonly logger?: QueryLogger,\n ) {}\n\n /** Log, run, and error-wrap one raw statement. */\n private exec(sql: string, params: readonly unknown[]): DriverResult {\n emitLog(this.logger, sql, params);\n try {\n return this.driver.execute(sql, params);\n } catch (error) {\n throw new QueryExecutionError(error, sql, params);\n }\n }\n\n /**\n * Run a raw, parameterized SQL statement (synchronous) — the runtime counterpart of the\n * migrations' `Op.execute`.\n *\n * A query builder never covers all of SQL, and without an escape hatch a single\n * unsupported query forces a whole second database stack alongside this one. Use\n * it for what the builder cannot yet express, and keep everything else typed.\n *\n * The statement goes through the same path as a compiled one: it is logged via\n * `onQuery`, wrapped in {@link QueryExecutionError} on failure, and runs on the\n * reserved connection inside `transaction()`.\n *\n * @param sql The statement text. Placeholders only (`$1` / `?` per dialect) —\n * never interpolate a value into this string.\n * @param params The bound parameters, in placeholder order.\n * @param options Pass `as` to coerce the returned rows with a model's column\n * types (and its column-name mapping).\n * @returns The result view over the returned rows.\n * @throws Error When `params` is not an array — the guard against calling this\n * with an interpolated string and no parameters by mistake.\n *\n * @example\n * ```ts\n * const claimed = await session.raw<OutboundRow>(\n * `UPDATE outbound_messages SET status = 'sending'\n * WHERE id = ANY($1) RETURNING *`,\n * [ids],\n * { as: Outbound },\n * ).all();\n * ```\n */\n raw<Row = Record<string, unknown>>(\n sql: string,\n params: readonly unknown[] = [],\n options?: { readonly as?: ModelClass },\n ): SyncResult<Row> {\n assertRawParams(params);\n const result = this.exec(sql, params);\n const model = options?.as;\n const rows = (\n model ? result.rows.map((row) => coerceRow(model, row)) : result.rows\n ) as Row[];\n return new SyncResult<Row>(rows, result.changes);\n }\n\n /** Compile, run, and coerce a builder into a result. */\n execute<B extends Executable>(builder: B): SyncResult<RowOf<B>> {\n const node = (builder as unknown as { node: Parameters<BaseDialect[\"compile\"]>[0] })\n .node;\n const { sql, params } = this.dialect.compile(node);\n const result = this.exec(sql, params);\n const rows = mapRows(builder, result.rows) as RowOf<B>[];\n return new SyncResult<RowOf<B>>(rows, result.changes);\n }\n\n /** Run `fn` inside a transaction: commit on success, rollback on throw. */\n transaction<T>(fn: (tx: SyncSession) => T): T {\n this.exec(\"BEGIN\", []);\n try {\n const out = fn(this);\n this.exec(\"COMMIT\", []);\n return out;\n } catch (error) {\n this.exec(\"ROLLBACK\", []);\n throw error;\n }\n }\n\n /** Run `fn` inside a SAVEPOINT (nested transaction). */\n beginNested<T>(fn: (sp: SyncSession) => T): T {\n savepointCounter += 1;\n const name = `qsp_${savepointCounter}`;\n this.exec(`SAVEPOINT ${name}`, []);\n try {\n const out = fn(this);\n this.exec(`RELEASE ${name}`, []);\n return out;\n } catch (error) {\n this.exec(`ROLLBACK TO ${name}`, []);\n throw error;\n }\n }\n\n /**\n * Lazily iterate result rows without materializing them all. Falls back to a\n * buffered fetch when the driver has no native iteration.\n */\n *stream<B extends Executable>(builder: B): IterableIterator<RowOf<B>> {\n const node = (builder as unknown as { node: Parameters<BaseDialect[\"compile\"]>[0] })\n .node;\n const { sql, params } = this.dialect.compile(node);\n emitLog(this.logger, sql, params);\n if (this.driver.iterate) {\n try {\n for (const raw of this.driver.iterate(sql, params)) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n } catch (error) {\n throw new QueryExecutionError(error, sql, params);\n }\n return;\n }\n for (const raw of this.exec(sql, params).rows) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n }\n\n close(): void {\n this.driver.close();\n }\n\n /** `using session = ...` closes the driver when the scope exits. */\n [Symbol.dispose](): void {\n this.close();\n }\n}\n\n/** An asynchronous unit of work. */\nexport class AsyncSession {\n constructor(\n private readonly driver: AsyncDriver,\n private readonly dialect: BaseDialect,\n /** Optional per-statement logger (query tracing). */\n private readonly logger?: QueryLogger,\n ) {}\n\n /** Log, run, and error-wrap one raw statement. */\n private async exec(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n emitLog(this.logger, sql, params);\n try {\n return await this.driver.execute(sql, params);\n } catch (error) {\n throw new QueryExecutionError(error, sql, params);\n }\n }\n\n /**\n * Run a raw, parameterized SQL statement — the runtime counterpart of the\n * migrations' `Op.execute`.\n *\n * A query builder never covers all of SQL, and without an escape hatch a single\n * unsupported query forces a whole second database stack alongside this one. Use\n * it for what the builder cannot yet express, and keep everything else typed.\n *\n * The statement goes through the same path as a compiled one: it is logged via\n * `onQuery`, wrapped in {@link QueryExecutionError} on failure, and runs on the\n * reserved connection inside `transaction()`.\n *\n * @param sql The statement text. Placeholders only (`$1` / `?` per dialect) —\n * never interpolate a value into this string.\n * @param params The bound parameters, in placeholder order.\n * @param options Pass `as` to coerce the returned rows with a model's column\n * types (and its column-name mapping).\n * @returns The result view over the returned rows.\n * @throws Error When `params` is not an array — the guard against calling this\n * with an interpolated string and no parameters by mistake.\n *\n * @example\n * ```ts\n * const claimed = await session.raw<OutboundRow>(\n * `UPDATE outbound_messages SET status = 'sending'\n * WHERE id = ANY($1) RETURNING *`,\n * [ids],\n * { as: Outbound },\n * ).all();\n * ```\n */\n raw<Row = Record<string, unknown>>(\n sql: string,\n params: readonly unknown[] = [],\n options?: { readonly as?: ModelClass },\n ): AsyncResult<Row> {\n assertRawParams(params);\n const model = options?.as;\n const inner = this.exec(sql, params).then((result) => {\n const rows = (\n model ? result.rows.map((row) => coerceRow(model, row)) : result.rows\n ) as Row[];\n return new SyncResult<Row>(rows, result.changes);\n });\n return new AsyncResult<Row>(inner);\n }\n\n execute<B extends Executable>(builder: B): AsyncResult<RowOf<B>> {\n const node = (builder as unknown as { node: Parameters<BaseDialect[\"compile\"]>[0] })\n .node;\n if (needsInsertReadBack(this.dialect, node)) {\n return new AsyncResult<RowOf<B>>(\n this.insertAndReadBack(builder as unknown as SingleBuilder, node),\n );\n }\n const { sql, params } = this.dialect.compile(node);\n const inner = this.exec(sql, params).then((result) => {\n const rows = mapRows(builder, result.rows) as RowOf<B>[];\n return new SyncResult<RowOf<B>>(rows, result.changes);\n });\n return new AsyncResult<RowOf<B>>(inner);\n }\n\n /**\n * Honor `.returning()` on a dialect without `RETURNING`, by inserting and then\n * reading the row back by key.\n *\n * Both statements must run on **one** connection, because `LAST_INSERT_ID()` is\n * per-connection: outside a transaction the pooled driver is reserved for the\n * pair; inside one, the session already holds a pinned connection (a reserved\n * driver exposes no `reserve`), so it runs there directly.\n *\n * @param builder The insert builder, for its source model.\n * @param node The insert AST, whose `returning` drives the read-back.\n * @returns The result view over the read-back row.\n * @throws Error When the insert writes more than one row — `LAST_INSERT_ID()`\n * identifies only the first, and the rest are consecutive only under some\n * auto-increment lock modes.\n */\n private async insertAndReadBack<Row>(\n builder: SingleBuilder,\n node: InsertNode,\n ): Promise<SyncResult<Row>> {\n if (node.values.length !== 1) {\n throw new Error(\n `${this.dialect.name} has no RETURNING, and reading back a multi-row insert is not reliable — insert one row at a time, or drop .returning().`,\n );\n }\n const model = builder.source;\n const pk = singlePrimaryKey(model);\n const supplied = (node.values[0] as Record<string, unknown>)[pk];\n const readBack = select(model).where(\n supplied === undefined || supplied === null\n ? col(pk).eq(fn.call(\"LAST_INSERT_ID\"))\n : { [pk]: supplied },\n );\n const insertSql = this.dialect.compile({ ...node, returning: null });\n const selectSql = this.dialect.compile(\n node.returning === \"*\" || node.returning === null\n ? readBack.node\n : { ...readBack.node, columns: node.returning },\n );\n const run = async (driver: AsyncDriver): Promise<SyncResult<Row>> => {\n const scoped = new AsyncSession(driver, this.dialect, this.logger);\n const written = await scoped.exec(insertSql.sql, insertSql.params);\n const read = await scoped.exec(selectSql.sql, selectSql.params);\n const rows = read.rows.map((row) => coerceRow(model, row)) as Row[];\n return new SyncResult<Row>(rows, written.changes);\n };\n if (!this.driver.reserve) return run(this.driver);\n const reserved = await this.driver.reserve();\n try {\n return await run(reserved);\n } finally {\n await reserved.release();\n }\n }\n\n /** Lazily iterate result rows. Uses driver streaming when available. */\n async *stream<B extends Executable>(builder: B): AsyncIterableIterator<RowOf<B>> {\n const node = (builder as unknown as { node: Parameters<BaseDialect[\"compile\"]>[0] })\n .node;\n const { sql, params } = this.dialect.compile(node);\n emitLog(this.logger, sql, params);\n if (this.driver.iterate) {\n try {\n for await (const raw of this.driver.iterate(sql, params)) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n } catch (error) {\n throw new QueryExecutionError(error, sql, params);\n }\n return;\n }\n const result = await this.exec(sql, params);\n for (const raw of result.rows) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n }\n\n async transaction<T>(fn: (tx: AsyncSession) => Promise<T>): Promise<T> {\n // Pooled drivers (PostgreSQL) must pin one connection: BEGIN/COMMIT and every\n // statement between them have to run on the same connection, or postgres.js\n // rejects the raw transaction. Single-connection drivers (SQLite) skip this.\n if (this.driver.reserve) {\n const reserved = await this.driver.reserve();\n const scoped = new AsyncSession(reserved, this.dialect, this.logger);\n try {\n await scoped.exec(\"BEGIN\", []);\n const out = await fn(scoped);\n await scoped.exec(\"COMMIT\", []);\n return out;\n } catch (error) {\n await scoped.exec(\"ROLLBACK\", []);\n throw error;\n } finally {\n await reserved.release();\n }\n }\n await this.exec(\"BEGIN\", []);\n try {\n const out = await fn(this);\n await this.exec(\"COMMIT\", []);\n return out;\n } catch (error) {\n await this.exec(\"ROLLBACK\", []);\n throw error;\n }\n }\n\n async close(): Promise<void> {\n await this.driver.close();\n }\n\n /** `await using session = ...` closes the driver when the scope exits. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// engines\n// ---------------------------------------------------------------------------\n\n/** Connection-pool tuning (PostgreSQL; ignored by SQLite). */\nexport interface PoolOptions {\n /** Max connections in the pool. */\n readonly size?: number;\n /** Close a connection after it sits idle this long (ms). */\n readonly idleTimeoutMs?: number;\n /** Give up acquiring a connection after this long (ms). */\n readonly connectTimeoutMs?: number;\n}\n\n/**\n * A server-side notice (a PostgreSQL `NOTICE`). The shape is the driver's own —\n * passed through untouched rather than normalized, since what is useful in it\n * differs per database.\n */\nexport type NoticeLogger = (notice: Record<string, unknown>) => void;\n\n/** Options shared by both engine flavors. */\nexport interface EngineOptions {\n /** Override the driver detected from the URL (e.g. `\"better-sqlite3\"`). */\n readonly driver?: string;\n /** Connection-pool tuning (PostgreSQL only). */\n readonly pool?: PoolOptions;\n /**\n * Called for every statement a session runs — SQL + bound params. Use for\n * query logging/tracing. Thrown errors are swallowed so it never breaks a query.\n */\n readonly onQuery?: QueryLogger;\n /**\n * Called for every server-side notice (`CREATE TABLE IF NOT EXISTS` on an\n * existing table, `DROP ... IF EXISTS` on a missing one, and so on).\n *\n * **Without this, notices are silenced.** postgres.js defaults to printing them\n * with `console.log`, which drops a nine-line object into the host service's\n * stdout in the middle of its structured log — on every boot, since a migration\n * runner is usually the first thing to run. Writing to the host's stdout is the\n * application's decision, not a library's, so the default is to say nothing and\n * let you route them:\n *\n * ```ts\n * createEngine(url, { onNotice: (n) => logger.debug({ pg: n }, \"postgres notice\") });\n * ```\n *\n * Thrown errors are swallowed, like `onQuery`.\n */\n readonly onNotice?: NoticeLogger;\n /**\n * Options passed straight to the underlying driver, applied **last** so they\n * win over everything this layer derives (`pool`, `onNotice`).\n *\n * The escape hatch for what the typed surface does not model and is not going\n * to — postgres.js `connection`/`types`/`transform`/`ssl`, mysql2's own\n * settings, `node:sqlite`'s `readOnly` — so a gap need not become a feature\n * request.\n */\n readonly driverOptions?: Readonly<Record<string, unknown>>;\n}\n\n/** Invoke a notice logger, swallowing any error it throws. */\nfunction emitNotice(logger: NoticeLogger | undefined, notice: unknown): void {\n if (!logger) return;\n try {\n logger(notice as Record<string, unknown>);\n } catch {\n // logging must never break a connection\n }\n}\n\n/** A synchronous engine (SQLite only). */\nexport class SyncEngine {\n readonly dialect: Dialect = \"sqlite\";\n\n constructor(\n private readonly driver: SyncDriver,\n private readonly logger?: QueryLogger,\n ) {}\n\n session(): SyncSession {\n return new SyncSession(this.driver, getDialect(\"sqlite\"), this.logger);\n }\n\n transaction<T>(fn: (tx: SyncSession) => T): T {\n return this.session().transaction(fn);\n }\n\n close(): void {\n this.driver.close();\n }\n\n /** `using engine = createSyncEngine(...)` closes the pool when the scope exits. */\n [Symbol.dispose](): void {\n this.close();\n }\n}\n\n/** An asynchronous engine. */\nexport class AsyncEngine {\n constructor(\n private readonly driver: AsyncDriver,\n readonly dialect: Dialect,\n private readonly logger?: QueryLogger,\n ) {}\n\n session(): AsyncSession {\n return new AsyncSession(this.driver, getDialect(this.dialect), this.logger);\n }\n\n transaction<T>(fn: (tx: AsyncSession) => Promise<T>): Promise<T> {\n return this.session().transaction(fn);\n }\n\n async close(): Promise<void> {\n await this.driver.close();\n }\n\n /** `await using engine = createEngine(...)` closes the pool when the scope exits. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n}\n\n/**\n * Adapt a sync **or** async driver to the async interface.\n *\n * `await` normalizes both: a sync driver returns a plain value, an async one a\n * promise, and awaiting either yields the result. That is what lets the migration\n * CLI take one code path instead of branching on a difference it cannot detect\n * from the object's shape.\n *\n * @param driver Either driver flavor.\n * @returns An async driver delegating to it.\n */\nexport function toAsyncDriver(driver: SyncDriver | AsyncDriver): AsyncDriver {\n return {\n async execute(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n return await driver.execute(sql, params);\n },\n async close(): Promise<void> {\n await driver.close();\n },\n };\n}\n\n/** Wrap a sync driver so it satisfies the async interface (SQLite async path). */\nfunction asAsync(driver: SyncDriver): AsyncDriver {\n const syncIterate = driver.iterate?.bind(driver);\n return {\n execute: (sql, params) => Promise.resolve(driver.execute(sql, params)),\n close: () => Promise.resolve(driver.close()),\n ...(syncIterate\n ? {\n iterate: async function* (sql: string, params: readonly unknown[]) {\n yield* syncIterate(sql, params);\n },\n }\n : {}),\n };\n}\n\n/** Open a SQLite sync driver from a parsed URL, passing driver options through. */\nfunction openSqliteDriver(path: string, options?: EngineOptions): SyncDriver {\n return NodeSqliteDriver.open(path, options?.driverOptions);\n}\n\n/**\n * Create a **synchronous** engine from a database URL. SQLite only — PostgreSQL\n * has no sane synchronous driver in Node, so a Postgres URL throws, pointing at\n * the async `createEngine`.\n *\n * @param url A SQLite URL, e.g. `\"sqlite:///app.db\"` or `\"sqlite://:memory:\"`.\n * @param options Engine options.\n * @returns A `SyncEngine`.\n */\nexport function createSyncEngine(url: string, options?: EngineOptions): SyncEngine {\n const parsed = parseDatabaseUrl(url);\n if (parsed.dialect !== \"sqlite\") {\n throw new Error(\n `createSyncEngine supports only SQLite; ${parsed.dialect} is async-only — use createEngine.`,\n );\n }\n return new SyncEngine(\n openSqliteDriver(parsed.database ?? \":memory:\", options),\n options?.onQuery,\n );\n}\n\n/**\n * Create an **asynchronous** engine from a database URL (the default). Works for\n * both SQLite (sync driver wrapped as async) and PostgreSQL (postgres.js,\n * lazy-loaded).\n *\n * @param url A database URL, e.g. `\"postgresql://app@localhost/app\"` or\n * `\"sqlite:///app.db\"`.\n * @param options Engine options.\n * @returns An `AsyncEngine`.\n */\nexport function createEngine(url: string, options?: EngineOptions): AsyncEngine {\n const parsed = parseDatabaseUrl(url);\n if (parsed.dialect === \"sqlite\") {\n return new AsyncEngine(\n asAsync(openSqliteDriver(parsed.database ?? \":memory:\", options)),\n \"sqlite\",\n options?.onQuery,\n );\n }\n if (parsed.dialect === \"mysql\") {\n // MySQL: mysql2 is lazy-loaded the first time a query runs.\n return new AsyncEngine(\n createMysqlDriver(parsed.raw, options),\n \"mysql\",\n options?.onQuery,\n );\n }\n // PostgreSQL: postgres.js is lazy-loaded the first time a query runs.\n return new AsyncEngine(\n createPostgresDriver(parsed.raw, options),\n \"postgresql\",\n options?.onQuery,\n );\n}\n\n/** Encode a JS value into something the MySQL driver (mysql2) can bind. */\nfunction encodeMysqlParam(value: unknown): unknown {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Uint8Array) return value;\n if (value instanceof Date) return value;\n if (typeof value === \"object\") return JSON.stringify(value);\n return value; // number, bigint, string\n}\n\n/** Shape a mysql2 result into our `DriverResult`. */\nfunction toMysqlResult(rows: unknown): DriverResult {\n if (Array.isArray(rows)) {\n return { rows: rows as Record<string, unknown>[], changes: 0 };\n }\n // A ResultSetHeader (INSERT/UPDATE/DELETE): no rows, affectedRows is the count.\n const header = rows as { affectedRows?: number };\n return { rows: [], changes: header.affectedRows ?? 0 };\n}\n\n/**\n * MySQL driver backed by mysql2/promise (lazy-loaded peer dependency).\n *\n * Transactions reserve a single pooled connection via {@link AsyncDriver.reserve}\n * so `BEGIN`/`COMMIT` and the statements between them run on one connection.\n * MySQL has no `RETURNING`; the dialect throws if it is requested.\n */\nfunction createMysqlDriver(url: string, options?: EngineOptions): AsyncDriver {\n const pool = options?.pool;\n // biome-ignore lint/suspicious/noExplicitAny: mysql2 pool typed at call site.\n let poolHandle: any;\n const ensure = async (): Promise<void> => {\n if (poolHandle) return;\n const moduleName = \"mysql2/promise\";\n // biome-ignore lint/suspicious/noExplicitAny: dynamic import of the peer dep.\n const mod = (await import(/* @vite-ignore */ moduleName)) as any;\n const opts: Record<string, unknown> = { uri: url };\n if (pool?.size !== undefined) opts.connectionLimit = pool.size;\n if (pool?.idleTimeoutMs !== undefined) opts.idleTimeout = pool.idleTimeoutMs;\n if (pool?.connectTimeoutMs !== undefined) opts.connectTimeout = pool.connectTimeoutMs;\n Object.assign(opts, options?.driverOptions ?? {});\n poolHandle = mod.createPool(opts);\n };\n const runOn = async (\n // biome-ignore lint/suspicious/noExplicitAny: mysql2 queryable (pool or connection).\n queryable: any,\n sql: string,\n params: readonly unknown[],\n ): Promise<DriverResult> => {\n const [rows] = await queryable.query(sql, params.map(encodeMysqlParam));\n return toMysqlResult(rows);\n };\n return {\n async execute(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n await ensure();\n return runOn(poolHandle, sql, params);\n },\n async reserve(): Promise<ReservedAsyncDriver> {\n await ensure();\n // biome-ignore lint/suspicious/noExplicitAny: reserved connection from mysql2.\n const conn: any = await poolHandle.getConnection();\n return {\n execute: (sql, params) => runOn(conn, sql, params),\n async release(): Promise<void> {\n conn.release();\n },\n async close(): Promise<void> {\n conn.release();\n },\n };\n },\n async close(): Promise<void> {\n if (poolHandle) await poolHandle.end();\n },\n };\n}\n\n/** Shape a postgres.js result array into our `DriverResult`. */\nfunction toPostgresResult(rows: unknown): DriverResult {\n const arr = rows as Record<string, unknown>[] & { count?: number };\n return { rows: Array.from(arr), changes: arr.count ?? arr.length };\n}\n\n/**\n * PostgreSQL driver backed by postgres.js (lazy-loaded peer dependency).\n *\n * Transactions reserve a single connection via {@link AsyncDriver.reserve} —\n * postgres.js pools connections, so a raw `BEGIN` on the shared client would run\n * on a different connection than the statements that follow (and is rejected with\n * `UNSAFE_TRANSACTION`). The reserved connection runs `BEGIN`/`COMMIT`/`ROLLBACK`\n * and every statement between them on one socket, then is released back.\n */\nfunction createPostgresDriver(url: string, options?: EngineOptions): AsyncDriver {\n const pool = options?.pool;\n // biome-ignore lint/suspicious/noExplicitAny: postgres.js client typed at call site.\n let client: any;\n const ensure = async (): Promise<void> => {\n if (client) return;\n // Non-literal specifier so the optional peer dep is not type-resolved at build.\n const moduleName = \"postgres\";\n // biome-ignore lint/suspicious/noExplicitAny: dynamic import of the peer dep.\n const mod = (await import(/* @vite-ignore */ moduleName)) as any;\n // Map our PoolOptions onto postgres.js's option names (seconds, not ms).\n const opts: Record<string, unknown> = {};\n if (pool?.size !== undefined) opts.max = pool.size;\n if (pool?.idleTimeoutMs !== undefined)\n opts.idle_timeout = Math.ceil(pool.idleTimeoutMs / 1000);\n if (pool?.connectTimeoutMs !== undefined) {\n opts.connect_timeout = Math.ceil(pool.connectTimeoutMs / 1000);\n }\n opts.onnotice = (notice: unknown): void => emitNotice(options?.onNotice, notice);\n Object.assign(opts, options?.driverOptions ?? {});\n client = (mod.default ?? mod)(url, opts);\n };\n return {\n async execute(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n await ensure();\n // postgres.js `unsafe` runs a parameterized string with positional params.\n return toPostgresResult(await client.unsafe(sql, params as unknown[]));\n },\n async reserve(): Promise<ReservedAsyncDriver> {\n await ensure();\n // biome-ignore lint/suspicious/noExplicitAny: reserved connection from postgres.js.\n const conn: any = await client.reserve();\n return {\n async execute(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n return toPostgresResult(await conn.unsafe(sql, params as unknown[]));\n },\n async release(): Promise<void> {\n conn.release();\n },\n async close(): Promise<void> {\n conn.release();\n },\n };\n },\n async close(): Promise<void> {\n if (client) await client.end();\n },\n };\n}\n","/**\n * tempest-db-js — feasibility spike for Phase 1.\n *\n * Proves the central design claim: a class-based, SQLAlchemy-style model whose\n * fields are runtime column-builders can drive full static row-type inference in\n * TypeScript, despite TS erasing types at runtime.\n *\n * This is a SPIKE, not the final API. It validates the type machinery only.\n */\n\n/** Phantom marker carrying the static TS type a column maps to. */\ndeclare const TYPE: unique symbol;\n\n/** Column flags that influence the inferred row/insert shape. */\ninterface ColumnFlags {\n readonly primaryKey: boolean;\n readonly notNull: boolean;\n readonly hasDefault: boolean;\n /**\n * A `UNIQUE` constraint on the column. Does NOT influence the inferred type —\n * it is DDL-only metadata (mirrors SQLAlchemy's `mapped_column(unique=True)`).\n */\n readonly unique: boolean;\n}\n\nconst DEFAULT_FLAGS: ColumnFlags = {\n primaryKey: false,\n notNull: false,\n hasDefault: false,\n unique: false,\n};\n\n/**\n * The canonical, dialect-neutral kind of a column type. Mirrors SQLAlchemy's\n * generic types (e.g. `String` → varchar, `Text` → text). Dialect renderers\n * (Phase 4/6) map each kind + meta to concrete SQL per database.\n */\nexport type ColumnTypeKind =\n | \"smallint\"\n | \"integer\"\n | \"bigint\"\n | \"numeric\"\n | \"real\"\n | \"double\"\n | \"varchar\"\n | \"text\"\n | \"char\"\n | \"boolean\"\n | \"date\"\n | \"time\"\n | \"datetime\"\n | \"timestamp\"\n | \"blob\"\n | \"json\"\n | \"uuid\"\n | \"enum\"\n | \"array\";\n\n/** Parameters that refine a column type and feed the migration IR / DDL. */\nexport interface ColumnTypeMeta {\n /** Max length for `varchar`/`char`. */\n readonly length?: number | undefined;\n /** Total digits for `numeric`. */\n readonly precision?: number | undefined;\n /** Digits after the decimal point for `numeric`. */\n readonly scale?: number | undefined;\n /** `WITH TIME ZONE` for `timestamp`/`time`. */\n readonly withTimezone?: boolean | undefined;\n /** Allowed values for `enum`. */\n readonly values?: readonly string[] | undefined;\n /** Render as `JSONB` (PostgreSQL) instead of `JSON`. */\n readonly jsonb?: boolean | undefined;\n /** The element type of an `array` column (`text[]`, `integer[]`). */\n readonly element?: ColumnType | undefined;\n}\n\n/** A structured, dialect-neutral column type descriptor. */\nexport interface ColumnType {\n readonly kind: ColumnTypeKind;\n readonly meta: ColumnTypeMeta;\n}\n\n/**\n * A portable default expression. The token is dialect-neutral; the renderer\n * (Phase 4/6) maps it to the right SQL per database — e.g. `\"now\"` becomes\n * `CURRENT_TIMESTAMP` on SQLite and `now()` on PostgreSQL. Use `{ raw }` as an\n * escape hatch for a verbatim SQL fragment, or `{ parts }` for a parameterized\n * fragment built by the `sql.expr` tagged template (one bound parameter per gap\n * between consecutive parts).\n */\nexport type PortableExpression =\n | \"now\"\n | \"current_date\"\n | \"current_time\"\n | \"uuidv4\"\n | { readonly raw: string }\n | { readonly parts: readonly string[] };\n\n/**\n * A column default. Either a constant literal value or a server-side expression\n * evaluated by the database (mirrors SQLAlchemy's `default` vs `server_default`).\n * Feeds the migration IR (`DefaultIR`).\n */\nexport type DefaultValue =\n | { readonly kind: \"literal\"; readonly value: unknown }\n | { readonly kind: \"expression\"; readonly expression: PortableExpression };\n\n/**\n * Brand marking a value as a SQL expression rather than a bound parameter.\n *\n * A plain object reaching `set()`/`values()` is a mistake (it would be bound as a\n * parameter and silently written as JSON or null); an object carrying this symbol\n * is deliberate, and the dialect renders it inline instead of binding it. Mirrors\n * how `Condition` is branded, so the check is a symbol lookup, not duck typing.\n */\nconst EXPRESSION = Symbol.for(\"tempest-db-js.expression\");\n\n/**\n * A SQL expression, usable both as a column default (`.default(sql.now())`) and\n * as a write value (`.set({ attempts: sql.raw(\"attempts + 1\") })`). The dialect\n * renders `expression` inline and binds `params` in the order of the fragment's\n * gaps.\n */\nexport interface SqlExpression {\n readonly [EXPRESSION]: true;\n readonly kind: \"expression\";\n readonly expression: PortableExpression;\n /** Parameters bound into the fragment's gaps, in order (empty for a token). */\n readonly params: readonly unknown[];\n}\n\n/** Build a branded {@link SqlExpression} from a portable token or fragment. */\nfunction expression(\n token: PortableExpression,\n params: readonly unknown[] = [],\n): SqlExpression {\n return { [EXPRESSION]: true, kind: \"expression\", expression: token, params };\n}\n\n/**\n * Runtime guard: is this value a branded {@link SqlExpression}?\n *\n * @param value Any value handed to `set()`, `values()` or `.default()`.\n * @returns True when the value carries the expression brand.\n */\nexport function isSqlExpression(value: unknown): value is SqlExpression {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as Record<PropertyKey, unknown>)[EXPRESSION] === true\n );\n}\n\n/**\n * Portable server-side expressions, à la SQLAlchemy's `func`.\n *\n * Every entry doubles as a column default and as a write value, so\n * `.default(sql.now())` and `.set({ updatedAt: sql.now() })` both work.\n */\nexport const sql = {\n /** Current timestamp at insert (`CURRENT_TIMESTAMP` / `now()`). */\n now: (): SqlExpression => expression(\"now\"),\n /** Current date. */\n currentDate: (): SqlExpression => expression(\"current_date\"),\n /** Current time. */\n currentTime: (): SqlExpression => expression(\"current_time\"),\n /** A freshly generated UUID v4 (`gen_random_uuid()` / portable fallback). */\n uuidv4: (): SqlExpression => expression(\"uuidv4\"),\n /**\n * Escape hatch: a verbatim SQL expression rendered as-is, with no parameters.\n *\n * The fragment is interpolated into the statement untouched, so it must never\n * carry user input — use {@link sql.expr} when a value has to be bound.\n *\n * @param fragment The SQL text (e.g. `\"attempts + 1\"`).\n * @returns The expression, usable as a default and as a write value.\n */\n raw: (fragment: string): SqlExpression => expression({ raw: fragment }),\n /**\n * A parameterized SQL expression, written as a tagged template. Static text is\n * SQL; every `${...}` interpolation becomes a bound parameter, so the fragment\n * is injection-safe by construction.\n *\n * Cannot be used as a column default — a `DEFAULT` clause has nowhere to bind\n * parameters; use {@link sql.raw} there.\n *\n * @param parts The static SQL segments supplied by the template tag.\n * @param values The interpolated values, bound in order.\n * @returns The expression, usable as a write value.\n *\n * @example\n * ```ts\n * update(Account).set({ balance: sql.expr`balance - ${amount}` }).where({ id });\n * // UPDATE \"accounts\" SET \"balance\" = balance - $1 WHERE \"id\" = $2\n * ```\n */\n expr: (parts: TemplateStringsArray, ...values: unknown[]): SqlExpression =>\n expression({ parts: Array.from(parts) }, values),\n} as const;\n\n/** Narrow a `.default()` argument to a `DefaultValue` expression/literal marker. */\nfunction isDefaultValue(value: unknown): value is DefaultValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"kind\" in value &&\n ((value as { kind: unknown }).kind === \"literal\" ||\n (value as { kind: unknown }).kind === \"expression\")\n );\n}\n\n/** True when an expression carries bound parameters (illegal in a DDL default). */\nfunction bindsParameters(value: DefaultValue): boolean {\n return (\n value.kind === \"expression\" &&\n typeof value.expression === \"object\" &&\n \"parts\" in value.expression\n );\n}\n\n/**\n * A referential action for a foreign key's `ON DELETE` / `ON UPDATE` clause.\n * Dialect-neutral tokens rendered uppercase at the DDL edge (mirrors\n * SQLAlchemy's `ForeignKey(ondelete=..., onupdate=...)`).\n */\nexport type FkAction = \"cascade\" | \"restrict\" | \"set null\" | \"set default\" | \"no action\";\n\n/**\n * A resolved foreign-key reference: the target `table.column` plus optional\n * referential actions. Produced by `Column.references(\"table.column\", ...)`.\n */\nexport interface ForeignKeyRef {\n readonly table: string;\n readonly column: string;\n readonly onDelete?: FkAction | undefined;\n readonly onUpdate?: FkAction | undefined;\n}\n\n/** Options for a foreign-key reference (referential actions). */\nexport interface ForeignKeyOptions {\n readonly onDelete?: FkAction | undefined;\n readonly onUpdate?: FkAction | undefined;\n}\n\n/** Parse a `\"table.column\"` reference string into a {@link ForeignKeyRef}. */\nfunction parseReference(ref: string, options?: ForeignKeyOptions): ForeignKeyRef {\n const dot = ref.lastIndexOf(\".\");\n if (dot <= 0 || dot === ref.length - 1) {\n throw new Error(`Invalid foreign key reference \"${ref}\"; expected \"table.column\".`);\n }\n return {\n table: ref.slice(0, dot),\n column: ref.slice(dot + 1),\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n };\n}\n\n/**\n * A typed column builder. Holds runtime metadata (structured `type`, `flags`,\n * `default`, `onUpdate`, foreign-key `reference`) and a phantom static type `T`\n * used purely for inference.\n */\nclass Column<T, F extends ColumnFlags = ColumnFlags> {\n /** Phantom: never read at runtime, only inspected by the type system. */\n declare readonly [TYPE]: T;\n\n constructor(\n readonly type: ColumnType,\n readonly flags: F,\n /** The default applied on insert, or `null` for none. */\n readonly defaultValue: DefaultValue | null = null,\n /** The value re-applied on update (e.g. `updated_at`), or `null`. */\n readonly onUpdateValue: DefaultValue | null = null,\n /** The foreign-key reference this column points to, or `null` for none. */\n readonly reference: ForeignKeyRef | null = null,\n /** An explicit database column name overriding the property name, or `null`. */\n readonly dbName: string | null = null,\n ) {}\n\n /** Clone this column with one facet replaced, carrying every other over. */\n private derive<F2 extends ColumnFlags>(patch: {\n flags?: F2;\n defaultValue?: DefaultValue | null;\n onUpdateValue?: DefaultValue | null;\n reference?: ForeignKeyRef | null;\n dbName?: string | null;\n }): Column<T, F2> {\n return new Column<T, F2>(\n this.type,\n (patch.flags ?? this.flags) as F2,\n patch.defaultValue !== undefined ? patch.defaultValue : this.defaultValue,\n patch.onUpdateValue !== undefined ? patch.onUpdateValue : this.onUpdateValue,\n patch.reference !== undefined ? patch.reference : this.reference,\n patch.dbName !== undefined ? patch.dbName : this.dbName,\n );\n }\n\n primaryKey(): Column<T, F & { primaryKey: true; hasDefault: true }> {\n return this.derive({ flags: { ...this.flags, primaryKey: true, hasDefault: true } });\n }\n\n notNull(): Column<T, F & { notNull: true }> {\n return this.derive({ flags: { ...this.flags, notNull: true } });\n }\n\n /**\n * Add a `UNIQUE` constraint to the column (mirrors SQLAlchemy's\n * `mapped_column(unique=True)`). DDL-only — does not change the inferred type.\n */\n unique(): Column<T, F & { unique: true }> {\n return this.derive({ flags: { ...this.flags, unique: true } });\n }\n\n /**\n * Map this property to a differently-named database column, à la SQLAlchemy's\n * `mapped_column(\"consumer_name\")` (Django's `db_column`, Prisma's `@map`).\n *\n * The override applies everywhere the name reaches SQL — select, insert,\n * update, delete, where, order by, group by, returning, conflict targets, the\n * migration IR and the drift check — while the TypeScript row keeps the\n * property name. Use it to keep a `snake_case` schema behind a `camelCase`\n * model; {@link Model.naming} does the same for a whole table at once.\n *\n * @param dbName The real column name in the database.\n * @returns A new column bound to that name.\n * @throws Error When `dbName` is empty.\n *\n * @example\n * ```ts\n * class ApiKey extends Model {\n * static tablename = \"api_keys\";\n * consumerName = column.text().name(\"consumer_name\").notNull();\n * }\n * ```\n */\n name(dbName: string): Column<T, F> {\n if (dbName.length === 0) {\n throw new Error(\"column.name() requires a non-empty database column name.\");\n }\n return this.derive({ dbName });\n }\n\n /**\n * Declare a foreign-key reference to another table's column, à la SQLAlchemy's\n * `mapped_column(ForeignKey(\"table.column\", ondelete=...))`. DDL-only — does\n * not change the inferred type.\n *\n * @param ref The target as `\"table.column\"` (e.g. `\"users.id\"`).\n * @param options Optional `onDelete` / `onUpdate` referential actions.\n * @returns A new column carrying the reference.\n * @throws Error When `ref` is not a valid `\"table.column\"` string.\n */\n references(ref: string, options?: ForeignKeyOptions): Column<T, F> {\n return this.derive({ reference: parseReference(ref, options) });\n }\n\n /**\n * Set the insert-time default: a constant value of type `T`, or a portable\n * server-side expression from {@link sql} (e.g. `sql.now()`, `sql.uuidv4()`).\n *\n * @param value The literal default, or a {@link sql} expression.\n * @returns A new column carrying the default.\n * @throws Error When given a `sql.expr` fragment — a `DEFAULT` clause has\n * nowhere to bind parameters; use `sql.raw()` for a verbatim expression.\n */\n default(value: T | DefaultValue): Column<T, F & { hasDefault: true }> {\n const resolved: DefaultValue = isDefaultValue(value)\n ? value\n : { kind: \"literal\", value };\n if (bindsParameters(resolved)) {\n throw new Error(\n \"sql.expr`...` binds parameters and cannot be a column default — use sql.raw() for a verbatim DEFAULT expression.\",\n );\n }\n return this.derive({\n flags: { ...this.flags, hasDefault: true },\n defaultValue: resolved,\n });\n }\n\n /**\n * Re-apply a value whenever the row is updated (e.g. an `updated_at` column\n * with `sql.now()`). Mirrors SQLAlchemy's `onupdate`.\n *\n * @param value The literal value, or a {@link sql} expression.\n * @returns A new column carrying the on-update value.\n * @throws Error When given a `sql.expr` fragment (see {@link Column.default}).\n */\n onUpdate(value: T | DefaultValue): Column<T, F> {\n const resolved: DefaultValue = isDefaultValue(value)\n ? value\n : { kind: \"literal\", value };\n if (bindsParameters(resolved)) {\n throw new Error(\n \"sql.expr`...` binds parameters and cannot be an onUpdate default — use sql.raw() for a verbatim expression.\",\n );\n }\n return this.derive({ onUpdateValue: resolved });\n }\n}\n\n/** Build a `Column` of static type `T` from a kind + optional meta. */\nfunction makeColumn<T>(\n kind: ColumnTypeKind,\n meta: ColumnTypeMeta = {},\n): Column<T, ColumnFlags> {\n return new Column<T, ColumnFlags>({ kind, meta }, DEFAULT_FLAGS);\n}\n\n/**\n * Column factory mirroring SQLAlchemy's typed column constructors. Each entry\n * pairs a distinct SQL type with the TypeScript type it maps to.\n *\n * Notable mappings:\n * - `varchar(n)` (`VARCHAR(n)`) is distinct from `text` (`TEXT`).\n * - `bigInteger` maps to `bigint` (not `number`) to keep 64-bit precision.\n * - `numeric`/`decimal` map to `string` — JavaScript has no exact decimal, and\n * stringifying preserves precision instead of losing it to a float.\n * - `json<T>()` carries the parsed value type; `jsonb` is the PostgreSQL variant.\n * - `enum(...)` infers a string-literal union from its values.\n */\nexport const column = {\n /** `SMALLINT` → `number`. */\n smallInteger: (): Column<number, ColumnFlags> => makeColumn<number>(\"smallint\"),\n /** `INTEGER` → `number`. */\n integer: (): Column<number, ColumnFlags> => makeColumn<number>(\"integer\"),\n /** `BIGINT` → `bigint` (64-bit precision preserved). */\n bigInteger: (): Column<bigint, ColumnFlags> => makeColumn<bigint>(\"bigint\"),\n /** `NUMERIC(precision, scale)` → `string` (exact decimal, no float loss). */\n numeric: (precision?: number, scale?: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"numeric\", { precision, scale }),\n /** Alias of {@link column.numeric}. */\n decimal: (precision?: number, scale?: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"numeric\", { precision, scale }),\n /** `REAL` → `number`. */\n real: (): Column<number, ColumnFlags> => makeColumn<number>(\"real\"),\n /** `DOUBLE PRECISION` → `number`. */\n double: (): Column<number, ColumnFlags> => makeColumn<number>(\"double\"),\n /** `VARCHAR(length)` → `string`. Distinct from {@link column.text}. */\n varchar: (length: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"varchar\", { length }),\n /** Alias of {@link column.varchar} (SQLAlchemy's `String`). */\n string: (length: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"varchar\", { length }),\n /** `CHAR(length)` → `string` (fixed-width). */\n char: (length: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"char\", { length }),\n /** `TEXT` → `string` (unbounded). Distinct from {@link column.varchar}. */\n text: (): Column<string, ColumnFlags> => makeColumn<string>(\"text\"),\n /** `BOOLEAN` → `boolean`. */\n boolean: (): Column<boolean, ColumnFlags> => makeColumn<boolean>(\"boolean\"),\n /** `DATE` → `Date`. */\n date: (): Column<Date, ColumnFlags> => makeColumn<Date>(\"date\"),\n /** `TIME` → `string`. Pass `{ timezone: true }` for `WITH TIME ZONE`. */\n time: (options?: { timezone?: boolean }): Column<string, ColumnFlags> =>\n makeColumn<string>(\"time\", { withTimezone: options?.timezone }),\n /**\n * `DATETIME`/`TIMESTAMP` → `Date` (SQLAlchemy's generic `DateTime`). Pass\n * `{ timezone: true }` for `WITH TIME ZONE`. Pair with `.default(sql.now())`\n * and `.onUpdate(sql.now())` for managed `created_at`/`updated_at` columns.\n */\n datetime: (options?: { timezone?: boolean }): Column<Date, ColumnFlags> =>\n makeColumn<Date>(\"datetime\", { withTimezone: options?.timezone }),\n /** `TIMESTAMP` → `Date` (SQL-specific). Pass `{ timezone: true }`. */\n timestamp: (options?: { timezone?: boolean }): Column<Date, ColumnFlags> =>\n makeColumn<Date>(\"timestamp\", { withTimezone: options?.timezone }),\n /** `BLOB`/`BYTEA` → `Uint8Array`. */\n blob: (): Column<Uint8Array, ColumnFlags> => makeColumn<Uint8Array>(\"blob\"),\n /** `JSON` → the given parsed value type `T` (defaults to `unknown`). */\n json: <T = unknown>(): Column<T, ColumnFlags> => makeColumn<T>(\"json\"),\n /** `JSONB` (PostgreSQL) → the given parsed value type `T`. */\n jsonb: <T = unknown>(): Column<T, ColumnFlags> =>\n makeColumn<T>(\"json\", { jsonb: true }),\n /** `UUID` → `string`. */\n uuid: (): Column<string, ColumnFlags> => makeColumn<string>(\"uuid\"),\n /** `ENUM(...values)` → a string-literal union of the given values. */\n enum: <const E extends string>(...values: E[]): Column<E, ColumnFlags> =>\n makeColumn<E>(\"enum\", { values }),\n /**\n * A PostgreSQL array column (`text[]`, `integer[]`) → `T[]`.\n *\n * PostgreSQL only: SQLite and MySQL have no native array type, and rendering\n * one as JSON there would give the same model different semantics per dialect\n * (`@>` and `&&` work on one and not the other), so the DDL renderer throws\n * for those dialects instead of falling back silently.\n *\n * @param element The element column (its type, not its flags, is what is used).\n * @returns A column whose inferred type is an array of the element's type.\n *\n * @example\n * ```ts\n * class ApiKey extends Model {\n * static tablename = \"api_keys\";\n * scopes = column.array(column.text()).notNull().default([\"send\"]);\n * }\n * ```\n */\n array: <T>(element: Column<T, ColumnFlags>): Column<T[], ColumnFlags> =>\n makeColumn<T[]>(\"array\", { element: element.type }),\n} as const;\n\n/**\n * A table-level constraint declared via a model's `static tableArgs`. Mirrors\n * SQLAlchemy's `__table_args__` entries (`UniqueConstraint`, `ForeignKeyConstraint`).\n * Use the {@link unique} and {@link foreignKey} helpers to build these.\n */\nexport type TableConstraint =\n | {\n readonly kind: \"unique\";\n readonly name?: string | undefined;\n readonly columns: readonly string[];\n }\n | {\n readonly kind: \"foreignKey\";\n readonly name?: string | undefined;\n readonly columns: readonly string[];\n readonly refTable: string;\n readonly refColumns: readonly string[];\n readonly onDelete?: FkAction | undefined;\n readonly onUpdate?: FkAction | undefined;\n };\n\n/**\n * Declare a (possibly composite) `UNIQUE` table constraint over the given\n * columns. Mirrors SQLAlchemy's `UniqueConstraint(\"a\", \"b\")`.\n *\n * @param columns The column names covered by the constraint.\n * @returns A unique {@link TableConstraint}.\n * @throws Error When no columns are given.\n */\nexport function unique(...columns: string[]): TableConstraint {\n if (columns.length === 0) {\n throw new Error(\"unique() requires at least one column.\");\n }\n return { kind: \"unique\", columns };\n}\n\n/**\n * Declare a (possibly composite) foreign-key table constraint. Mirrors\n * SQLAlchemy's `ForeignKeyConstraint([...], [...], ondelete=...)`.\n *\n * @param columns The local column names.\n * @param refTable The referenced table name.\n * @param refColumns The referenced column names (same length as `columns`).\n * @param options Optional constraint `name` and referential actions.\n * @returns A foreign-key {@link TableConstraint}.\n * @throws Error When the column arrays are empty or mismatched in length.\n */\nexport function foreignKey(\n columns: string[],\n refTable: string,\n refColumns: string[],\n options?: { name?: string; onDelete?: FkAction; onUpdate?: FkAction },\n): TableConstraint {\n if (columns.length === 0 || columns.length !== refColumns.length) {\n throw new Error(\n \"foreignKey() requires matching, non-empty local and referenced column lists.\",\n );\n }\n return {\n kind: \"foreignKey\",\n name: options?.name,\n columns,\n refTable,\n refColumns,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n };\n}\n\n/**\n * How property names map to database column names when a column declares no\n * explicit {@link Column.name}.\n *\n * - `\"preserve\"` (default) — the column name is the property name, verbatim.\n * - `\"snake_case\"` — `consumerName` becomes `consumer_name`.\n */\nexport type NamingStrategy = \"preserve\" | \"snake_case\";\n\n/** Convert a `camelCase` / `PascalCase` identifier to `snake_case`. */\nexport function toSnakeCase(name: string): string {\n return name\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1_$2\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .toLowerCase();\n}\n\n/** Base class every model extends, SQLAlchemy-declarative style. */\n// biome-ignore lint/complexity/noStaticOnlyClass: declarative base users subclass; column fields live on instances.\nexport abstract class Model {\n static tablename: string;\n /**\n * Optional table-level constraints (composite unique / foreign keys), returned\n * by a thunk so forward references resolve lazily. Mirrors SQLAlchemy's\n * `__table_args__`.\n */\n static tableArgs?: () => readonly TableConstraint[];\n /**\n * How to derive column names from property names (default `\"preserve\"`). Set\n * `\"snake_case\"` to keep a `snake_case` schema behind a `camelCase` model\n * without annotating every column; {@link Column.name} overrides it per column.\n */\n static naming?: NamingStrategy;\n}\n\n/** Memoized column maps, keyed by model class (identity is stable per class). */\nconst columnsCache = new WeakMap<ModelClass, Record<string, Column<unknown>>>();\n\n/**\n * Reflect a model class into its column map at runtime, keyed by column name.\n *\n * Instantiates the class once and collects every field that is a `Column`. Used\n * by the serialization layer and (Phase 6) the migration schema reflector.\n *\n * The result is **memoized per class** — a model's columns never change at\n * runtime, and this is called once per row on hot read paths (coercion, joins),\n * so re-instantiating the class every time would dominate large result sets.\n *\n * @param model The model class (subclass of `Model`).\n * @returns A record of column name → `Column` instance (do not mutate).\n */\nexport function columnsOf(model: ModelClass): Record<string, Column<unknown>> {\n const cached = columnsCache.get(model);\n if (cached) return cached;\n const instance = new (model as new () => Model)();\n const out: Record<string, Column<unknown>> = {};\n for (const [key, value] of Object.entries(instance)) {\n if (value instanceof Column) {\n out[key] = value as Column<unknown>;\n }\n }\n columnsCache.set(model, out);\n return out;\n}\n\n/** A mapping between property names and database column names. */\nexport type NameMap = Readonly<Record<string, string>>;\n\n/** Memoized property → column maps (`null` when every name is the identity). */\nconst nameMapCache = new WeakMap<ModelClass, NameMap | null>();\n\n/** Memoized column → property maps (`null` when every name is the identity). */\nconst propMapCache = new WeakMap<ModelClass, NameMap | null>();\n\n/**\n * The property → database-column map for a model, or `null` when every column\n * keeps its property name.\n *\n * `null` is the common case and the fast path: builders and the row coercer skip\n * translation entirely, so a model that renames nothing costs nothing. The map\n * is memoized per class, like {@link columnsOf}.\n *\n * @param model The model class.\n * @returns The name map, or `null` when no column is renamed.\n * @throws Error When two properties resolve to the same column name.\n */\nexport function columnNamesOf(model: ModelClass): NameMap | null {\n const cached = nameMapCache.get(model);\n if (cached !== undefined) return cached;\n const strategy: NamingStrategy = model.naming ?? \"preserve\";\n const map: Record<string, string> = {};\n const seen = new Map<string, string>();\n let renamed = false;\n for (const [prop, col] of Object.entries(columnsOf(model))) {\n const dbName = col.dbName ?? (strategy === \"snake_case\" ? toSnakeCase(prop) : prop);\n const collision = seen.get(dbName);\n if (collision !== undefined) {\n throw new Error(\n `${model.tablename}: properties \"${collision}\" and \"${prop}\" both map to column \"${dbName}\".`,\n );\n }\n seen.set(dbName, prop);\n map[prop] = dbName;\n if (dbName !== prop) renamed = true;\n }\n const result = renamed ? (map as NameMap) : null;\n nameMapCache.set(model, result);\n return result;\n}\n\n/**\n * The database-column → property map for a model, or `null` when every column\n * keeps its property name. The inverse of {@link columnNamesOf}, used to map\n * driver rows back into property space.\n *\n * @param model The model class.\n * @returns The inverse name map, or `null` when no column is renamed.\n */\nexport function columnPropsOf(model: ModelClass): NameMap | null {\n const cached = propMapCache.get(model);\n if (cached !== undefined) return cached;\n const forward = columnNamesOf(model);\n let result: NameMap | null = null;\n if (forward) {\n const inverse: Record<string, string> = {};\n for (const [prop, dbName] of Object.entries(forward)) inverse[dbName] = prop;\n result = inverse as NameMap;\n }\n propMapCache.set(model, result);\n return result;\n}\n\n/** Resolve one property name to its database column name. */\nexport function dbColumn(names: NameMap | null | undefined, prop: string): string {\n return names?.[prop] ?? prop;\n}\n\n/** Pull the static type out of a Column. */\ntype ColType<C> = C extends Column<infer T, infer _F> ? T : never;\n\n/** Keys of the model instance whose values are Columns. */\ntype ColumnKeys<M> = {\n [K in keyof M]: M[K] extends Column<unknown, ColumnFlags> ? K : never;\n}[keyof M];\n\n/** Constructor type for a Model subclass. */\ntype ModelClass = (new () => Model) & {\n tablename: string;\n tableArgs?: () => readonly TableConstraint[];\n naming?: NamingStrategy;\n};\n\n/** Flatten an intersection into a single object literal for clean inference. */\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\n/** The nullability-aware value a column contributes to a row. */\ntype ColValue<Col> = Col extends Column<infer T, infer F>\n ? F extends { notNull: true } | { primaryKey: true }\n ? T\n : T | null\n : never;\n\n/** True when a column has a default (or is a PK) — i.e. optional on insert. */\ntype HasDefault<Col> = Col extends Column<unknown, infer F>\n ? F extends { hasDefault: true }\n ? true\n : false\n : false;\n\n/** True when a column accepts NULL — neither `notNull` nor a primary key. */\ntype IsNullable<Col> = Col extends Column<unknown, infer F>\n ? F extends { notNull: true } | { primaryKey: true }\n ? false\n : true\n : false;\n\n/**\n * Keys of the model whose columns may be omitted on insert.\n *\n * A column is optional when it has a default **or** when it accepts NULL: SQL\n * applies `NULL` to an omitted column that declares no other default, so\n * requiring the caller to write `note: null` adds noise that reads like a\n * deliberate decision to blank the column. Passing `null` explicitly still works.\n */\ntype OptionalInsertKeys<I> = {\n [K in ColumnKeys<I>]: HasDefault<I[K]> extends true\n ? K\n : IsNullable<I[K]> extends true\n ? K\n : never;\n}[ColumnKeys<I>];\n\n/**\n * Infer the SELECT row shape from a model class: every column field becomes its\n * mapped static type. Columns marked notNull/primaryKey are non-nullable; others\n * are `T | null` (SQL semantics — an unconstrained column can be NULL).\n */\nexport type InferModel<C extends ModelClass> = {\n [K in ColumnKeys<InstanceType<C>>]: ColValue<InstanceType<C>[K]>;\n};\n\n/**\n * Infer the INSERT shape: a column is optional when it has a default (or is a PK)\n * **or** when it is nullable — matching SQL, where an omitted column with no\n * `DEFAULT` clause is written as `NULL`. Only `notNull` columns without a default\n * are required. Nullability is preserved on both sides.\n */\nexport type InferInsert<C extends ModelClass> = Simplify<\n {\n [K in OptionalInsertKeys<InstanceType<C>>]?: ColValue<InstanceType<C>[K]>;\n } & {\n [K in Exclude<\n ColumnKeys<InstanceType<C>>,\n OptionalInsertKeys<InstanceType<C>>\n >]: ColValue<InstanceType<C>[K]>;\n }\n>;\n\nexport { Column, type ColType, type ColumnFlags, type ModelClass };\n\nexport {\n and,\n col,\n type CondNode,\n type Condition,\n Expression,\n type ExprNode,\n fn,\n isCondition,\n isExpression,\n not,\n or,\n toCondNode,\n val,\n type WhereArg,\n} from \"./conditions.js\";\n\nexport {\n Agg,\n type AggregateTerm,\n avg,\n count,\n type LockClause,\n type LockOptions,\n max,\n min,\n isSubquery,\n type Operator,\n type OperatorsFor,\n OPERATORS,\n type OrderTerm,\n type SelectNode,\n SelectBuilder,\n select,\n type SortDirection,\n type Subquery,\n sum,\n type WhereInput,\n} from \"./query.js\";\n\nexport {\n DeleteBuilder,\n type DeleteNode,\n del,\n InsertBuilder,\n type InsertNode,\n insert,\n type OnConflict,\n type OnConflictOptions,\n type OnConflictUpdateOptions,\n type Returning,\n type WritePatch,\n type WriteValues,\n UpdateBuilder,\n type UpdateNode,\n update,\n} from \"./mutations.js\";\n\nexport {\n type Dialect,\n detectDialect,\n InvalidDatabaseUrl,\n type ParsedDatabaseUrl,\n parseDatabaseUrl,\n} from \"./url.js\";\n\nexport {\n fromDict,\n parse,\n stringify,\n toDict,\n toJSON,\n ValidationError,\n} from \"./serialize.js\";\n\nexport {\n BaseDialect,\n type CompiledQuery,\n getDialect,\n MysqlDialect,\n Params,\n PostgresDialect,\n type QueryNode,\n SqliteDialect,\n} from \"./dialect.js\";\n\nexport {\n type ColRef,\n join,\n JoinBuilder,\n type JoinClause,\n type JoinNode,\n type JoinOn,\n type JoinSelection,\n type JoinWhereInput,\n type Sources,\n} from \"./join.js\";\n\nexport {\n BaseRepository,\n type PaginationFilter,\n type PaginationResult,\n RecordNotFound,\n} from \"./repository.js\";\n\nexport {\n ActiveRecord,\n type ActiveRecordManager,\n activeRecord,\n} from \"./active-record.js\";\n\nexport {\n type BelongsTo,\n belongsTo,\n type HasMany,\n hasMany,\n loadRelations,\n type Relation,\n type RelationValue,\n type WithRelations,\n} from \"./relations.js\";\n\nexport {\n AsyncEngine,\n AsyncResult,\n AsyncSession,\n type AsyncDriver,\n createEngine,\n createSyncEngine,\n type DriverResult,\n type EngineOptions,\n type Executable,\n NoResultError,\n NodeSqliteDriver,\n type NoticeLogger,\n type PoolOptions,\n QueryExecutionError,\n type QueryLogger,\n type ReservedAsyncDriver,\n type RowOf,\n type SyncDriver,\n SyncEngine,\n SyncResult,\n SyncSession,\n toAsyncDriver,\n} from \"./engine.js\";\n"]}
1
+ {"version":3,"sources":["../src/conditions.ts","../src/query.ts","../src/serialize.ts","../src/mutations.ts","../src/url.ts","../src/expressions.ts","../src/dialect.ts","../src/join.ts","../src/repository.ts","../src/active-record.ts","../src/relations.ts","../src/engine.ts","../src/index.ts"],"names":["fn","column","col","decode","update","sql","primaryKeyOf","createRequire","b"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * tempest-db-js — logical combinators for `where` (and/or/not).\n *\n * A `where` value is either the object form (an implicit AND of its fields) or a\n * `Condition` built with `and`/`or`/`not`. Both normalize to a `CondNode` tree\n * that every builder stores and the dialect compiles recursively — so select,\n * update, delete and join all share one condition language.\n */\n\nimport type { Operator, WhereInput } from \"./query.js\";\n\n/** Field-map condition (implicit AND of its entries). */\nexport interface CondFields {\n readonly kind: \"fields\";\n readonly fields: Record<string, unknown>;\n}\n\n/**\n * One side of a comparison: a column reference, a bound value, or a SQL function\n * applied to other expressions.\n *\n * A column reference carries the **property** name, not the database column —\n * the dialect resolves it through the node's name map, so `col()` cannot become a\n * back door around an explicit `.name()` mapping.\n */\nexport type ExprNode =\n | { readonly kind: \"column\"; readonly name: string }\n | { readonly kind: \"value\"; readonly value: unknown }\n | { readonly kind: \"fn\"; readonly name: string; readonly args: readonly ExprNode[] };\n\n/** Logical condition nodes. */\nexport type CondNode =\n | CondFields\n | { readonly kind: \"and\"; readonly parts: readonly CondNode[] }\n | { readonly kind: \"or\"; readonly parts: readonly CondNode[] }\n | { readonly kind: \"not\"; readonly part: CondNode }\n | {\n readonly kind: \"compare\";\n readonly left: ExprNode;\n readonly op: Operator;\n readonly right: ExprNode;\n };\n\nconst CONDITION = Symbol.for(\"tempest-db-js.condition\");\n\n/** A composed condition produced by `and`/`or`/`not`. */\nexport interface Condition {\n readonly [CONDITION]: true;\n readonly node: CondNode;\n}\n\n/** Runtime guard: is this value a composed `Condition`? */\nexport function isCondition(value: unknown): value is Condition {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as Record<PropertyKey, unknown>)[CONDITION] === true\n );\n}\n\n/** Normalize a where argument (object form or `Condition`) to a `CondNode`. */\nexport function toCondNode(input: Condition | Record<string, unknown>): CondNode {\n return isCondition(input) ? input.node : { kind: \"fields\", fields: input };\n}\n\nfunction wrap(node: CondNode): Condition {\n return { [CONDITION]: true, node };\n}\n\n/**\n * A `where` argument: the object form (keys typed against `Row`) or a `Condition`.\n *\n * @typeParam Row - the row type whose columns the field keys are checked against.\n * Defaults to a permissive shape; pass it explicitly (e.g. `or<UserRow>(...)`)\n * for full key + operator checking inside combinators.\n */\nexport type WhereArg<Row = Record<string, unknown>> = WhereInput<Row> | Condition;\n\n/** Normalize a comparison operand: an {@link Expression}, or a bound value. */\nfunction toExprNode(operand: unknown): ExprNode {\n return isExpression(operand) ? operand.node : { kind: \"value\", value: operand };\n}\n\n/**\n * Reject an {@link Expression} among operands that are bound as values.\n *\n * `IN` and `BETWEEN` bind their operands, so an expression slipped into the list\n * would be serialized by the driver instead of rendered as SQL — the same silent\n * corruption that `set()` guards against.\n *\n * @param op The operator name, for the message.\n * @param operands The operands to check.\n * @throws Error When any operand is an expression.\n */\nfunction assertValueOperands(op: string, operands: readonly unknown[]): void {\n if (operands.some(isExpression)) {\n throw new Error(\n `The \"${op}\" operator binds its operands, so it takes values, not expressions.`,\n );\n }\n}\n\n/** Runtime guard: is this operand a built {@link Expression}? */\nexport function isExpression(value: unknown): value is Expression {\n return value instanceof Expression;\n}\n\n/**\n * One side of a comparison, built with {@link col}, {@link val} or {@link fn}.\n *\n * The comparison methods mirror the `where` operators, but both sides are\n * expressions — which is what makes `col(\"total\").gt(col(\"paid\"))` and a\n * functional-index lookup like `fn.lower(\"email\").eq(fn.lower(val(probe)))`\n * expressible at all. An operand that is not an `Expression` is bound as a\n * parameter, so `.eq(probe)` stays safe by default.\n */\nexport class Expression {\n constructor(\n /** The expression AST the dialect renders. */\n readonly node: ExprNode,\n ) {}\n\n /** Compare this expression against another expression or a bound value. */\n private compare(op: Operator, operand: unknown): Condition {\n return wrap({ kind: \"compare\", left: this.node, op, right: toExprNode(operand) });\n }\n\n /** `=` (or `IS NULL` for a null value). */\n eq(operand: unknown): Condition {\n return this.compare(\"eq\", operand);\n }\n /** `<>` (or `IS NOT NULL` for a null value). */\n ne(operand: unknown): Condition {\n return this.compare(\"ne\", operand);\n }\n /** `>`. */\n gt(operand: unknown): Condition {\n return this.compare(\"gt\", operand);\n }\n /** `>=`. */\n gte(operand: unknown): Condition {\n return this.compare(\"gte\", operand);\n }\n /** `<`. */\n lt(operand: unknown): Condition {\n return this.compare(\"lt\", operand);\n }\n /** `<=`. */\n lte(operand: unknown): Condition {\n return this.compare(\"lte\", operand);\n }\n /** `LIKE` — `%` and `_` in the operand are wildcards. */\n like(pattern: string | Expression): Condition {\n return this.compare(\"like\", pattern);\n }\n /** `ILIKE` — case-insensitive **pattern** matching, wildcards included. */\n ilike(pattern: string | Expression): Condition {\n return this.compare(\"ilike\", pattern);\n }\n /** Case-insensitive equality (`lower(a) = lower(b)`), with no wildcards. */\n ieq(operand: unknown): Condition {\n return this.compare(\"ieq\", operand);\n }\n /**\n * `IN (...)` over a list of values.\n *\n * @param values The values to test against.\n * @returns The condition.\n * @throws Error When an entry is an {@link Expression} — a list operand is\n * bound, so an expression there would be serialized as a parameter instead of\n * rendered as SQL.\n */\n in(values: readonly unknown[]): Condition {\n assertValueOperands(\"in\", values);\n return this.compare(\"in\", values);\n }\n /**\n * `NOT IN (...)` over a list of values.\n *\n * @param values The values to exclude.\n * @returns The condition.\n * @throws Error When an entry is an {@link Expression} (see {@link Expression.in}).\n */\n notIn(values: readonly unknown[]): Condition {\n assertValueOperands(\"notIn\", values);\n return this.compare(\"notIn\", values);\n }\n /**\n * `BETWEEN lo AND hi` (inclusive).\n *\n * @param lo The lower bound.\n * @param hi The upper bound.\n * @returns The condition.\n * @throws Error When a bound is an {@link Expression} (see {@link Expression.in}).\n */\n between(lo: unknown, hi: unknown): Condition {\n assertValueOperands(\"between\", [lo, hi]);\n return this.compare(\"between\", [lo, hi]);\n }\n /** `IS NULL` (true) / `IS NOT NULL` (false). */\n isNull(value = true): Condition {\n return this.compare(\"isNull\", value);\n }\n}\n\n/**\n * A column reference, by **property** name.\n *\n * Pass the row type for key-safety: `col<UserRow>(\"total\")` rejects a name that\n * is not a column. The name is resolved through the model's column-name map at\n * compile time, exactly like the object form of `where`.\n *\n * @param name The model property name.\n * @returns An expression referencing that column.\n *\n * @example\n * ```ts\n * select(Order).where(col<OrderRow>(\"total\").gt(col<OrderRow>(\"paid\")));\n * // SELECT * FROM \"orders\" WHERE \"total\" > \"paid\"\n * ```\n */\nexport function col<Row = Record<string, unknown>>(name: keyof Row & string): Expression {\n return new Expression({ kind: \"column\", name });\n}\n\n/**\n * A bound value, for the places that take an expression and would otherwise read\n * a bare string as a column name (the arguments of {@link fn}).\n *\n * @param value The value to bind as a parameter.\n * @returns An expression that renders as a placeholder.\n */\nexport function val(value: unknown): Expression {\n return new Expression({ kind: \"value\", value });\n}\n\n/** Function names are interpolated verbatim, so they must be plain identifiers. */\nconst FUNCTION_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** Coerce a function argument: a bare string is a column, everything else a value. */\nfunction toArg(arg: Expression | string): ExprNode {\n return typeof arg === \"string\" ? { kind: \"column\", name: arg } : arg.node;\n}\n\n/**\n * Build a call to a SQL function.\n *\n * A bare string argument is a **column name** — that is the useful default here\n * (`fn.lower(\"username\")`), and it is why a literal has to be wrapped in\n * {@link val}. The function name is interpolated into the statement, so it is\n * validated as a plain identifier and must never come from user input; the\n * arguments are always rendered through the expression compiler.\n *\n * @param name The SQL function name.\n * @param args Column names or expressions.\n * @returns An expression for the call.\n * @throws Error When `name` is not a plain SQL identifier.\n */\nfunction call(name: string, ...args: (Expression | string)[]): Expression {\n if (!FUNCTION_NAME.test(name)) {\n throw new Error(\n `fn.call() takes a plain SQL function name; got ${JSON.stringify(name)}.`,\n );\n }\n return new Expression({ kind: \"fn\", name, args: args.map(toArg) });\n}\n\n/**\n * SQL functions usable on either side of a comparison.\n *\n * The named entries are the ones every supported dialect implements. Anything\n * else — `date_trunc`, `strftime`, a custom function — goes through\n * {@link fn.call}, which does not pretend to be portable.\n *\n * @example\n * ```ts\n * select(AdminUser).where(fn.lower(\"username\").eq(fn.lower(val(probe))));\n * // WHERE lower(\"username\") = lower($1)\n * ```\n */\nexport const fn = {\n /** `lower(x)`. */\n lower: (arg: Expression | string): Expression => call(\"lower\", arg),\n /** `upper(x)`. */\n upper: (arg: Expression | string): Expression => call(\"upper\", arg),\n /** `trim(x)`. */\n trim: (arg: Expression | string): Expression => call(\"trim\", arg),\n /** `length(x)`. */\n length: (arg: Expression | string): Expression => call(\"length\", arg),\n /** `abs(x)`. */\n abs: (arg: Expression | string): Expression => call(\"abs\", arg),\n /** `coalesce(a, b, ...)`. */\n coalesce: (...args: (Expression | string)[]): Expression => call(\"coalesce\", ...args),\n /**\n * Any other SQL function, by name. Portability is the caller's problem —\n * `date_trunc` is PostgreSQL, `strftime` is SQLite.\n */\n call,\n} as const;\n\n/** Combine conditions with `AND`. */\nexport function and<Row = Record<string, unknown>>(\n ...inputs: WhereArg<NoInfer<Row>>[]\n): Condition {\n return wrap({\n kind: \"and\",\n parts: inputs.map((i) => toCondNode(i as Record<string, unknown>)),\n });\n}\n\n/** Combine conditions with `OR`. */\nexport function or<Row = Record<string, unknown>>(\n ...inputs: WhereArg<NoInfer<Row>>[]\n): Condition {\n return wrap({\n kind: \"or\",\n parts: inputs.map((i) => toCondNode(i as Record<string, unknown>)),\n });\n}\n\n/** Negate a condition with `NOT`. */\nexport function not<Row = Record<string, unknown>>(\n input: WhereArg<NoInfer<Row>>,\n): Condition {\n return wrap({ kind: \"not\", part: toCondNode(input as Record<string, unknown>) });\n}\n","/**\n * tempest-db-js — Phase 2 feasibility spike: the typed query builder.\n *\n * The builder is PURE AST + phantom types. It does not touch a database — that is\n * Phase 4 (`session.execute`). This file proves that:\n * - `select(User)` infers the full row type,\n * - `select(User, [\"id\", \"name\"])` infers a `Pick` projection,\n * - `.where(...)` / `.orderBy(...)` reject keys that are not columns,\n * all at compile time.\n *\n * This is a SPIKE, not the final API.\n */\n\nimport { type CondNode, type Condition, toCondNode } from \"./conditions.js\";\nimport {\n type InferModel,\n type ModelClass,\n type NameMap,\n columnNamesOf,\n} from \"./index.js\";\n\n// --------------------------------------------------------------------------\n// AST\n// --------------------------------------------------------------------------\n\n/** Sort direction for ORDER BY. */\nexport type SortDirection = \"asc\" | \"desc\";\n\n/** One ORDER BY term. */\nexport interface OrderTerm {\n readonly column: string;\n readonly direction: SortDirection;\n}\n\n/** One aggregate expression in a grouped SELECT (`COUNT(*) AS \"n\"`). */\nexport interface AggregateTerm {\n readonly fn: \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\n /** The column to aggregate, or `\"*\"` (only valid for `count`). */\n readonly column: string | \"*\";\n /** The result alias. */\n readonly alias: string;\n}\n\n/**\n * A row-level locking clause (`SELECT ... FOR UPDATE`).\n *\n * `wait` decides what happens when another transaction already holds the lock:\n * `\"block\"` waits, `\"skipLocked\"` skips those rows (the job-queue claim), and\n * `\"noWait\"` fails immediately.\n */\nexport interface LockClause {\n readonly strength: \"update\" | \"share\";\n readonly wait: \"block\" | \"skipLocked\" | \"noWait\";\n /** Tables to lock (`FOR UPDATE OF t`); empty locks every table in the query. */\n readonly of: readonly string[];\n}\n\n/** Options accepted by {@link SelectBuilder.forUpdate} / {@link SelectBuilder.forShare}. */\nexport interface LockOptions {\n /** Skip rows another transaction has locked instead of waiting for them. */\n readonly skipLocked?: boolean;\n /** Fail immediately instead of waiting for a locked row. */\n readonly noWait?: boolean;\n /** Restrict the lock to these tables (`FOR UPDATE OF ...`). */\n readonly of?: readonly string[];\n}\n\n/** Serializable AST for a SELECT. Dialects (Phase 4) compile this to SQL. */\nexport interface SelectNode {\n readonly kind: \"select\";\n readonly table: string;\n /** Projected columns, or \"*\" for the whole row. */\n readonly columns: readonly string[] | \"*\";\n /** Emit `SELECT DISTINCT` when true. */\n readonly distinct: boolean;\n /** Aggregate expressions; when non-empty, this is a grouped/aggregate query. */\n readonly aggregates: readonly AggregateTerm[];\n /** `GROUP BY` columns. */\n readonly groupBy: readonly string[];\n readonly where: CondNode | undefined;\n /** `HAVING` condition, keyed by aggregate alias or grouped column. */\n readonly having?: CondNode | undefined;\n readonly orderBy: readonly OrderTerm[];\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n /** Row-level locking clause, or `undefined` for none. */\n readonly lock?: LockClause | undefined;\n /** Property → column map, or `undefined` when every name is the identity. */\n readonly names?: NameMap | undefined;\n}\n\n// --------------------------------------------------------------------------\n// where input typing (Phase 3 — operators typed per column type)\n// --------------------------------------------------------------------------\n\n/**\n * A SELECT projecting exactly one column of type `T`, usable as the operand of\n * `in` / `notIn`.\n *\n * Build it with {@link SelectBuilder.asSubquery}, which both narrows the\n * projection to one column and gives the operand its element type.\n */\nexport interface Subquery<T> {\n /** Phantom: the element type the subquery yields, read only by the type system. */\n readonly __element?: T;\n /** The AST the outer statement embeds. */\n readonly node: SelectNode;\n}\n\n/** Runtime guard: is this `in`/`notIn` operand a subquery rather than a list? */\nexport function isSubquery(value: unknown): value is Subquery<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { node?: { kind?: unknown } }).node?.kind === \"select\"\n );\n}\n\n/** Operators valid on every column type. */\ninterface BaseOperators<T> {\n /** Equal to. */\n eq?: T;\n /** Not equal to. */\n ne?: T;\n /**\n * One of the given values (`IN`) — a list, or a single-column\n * {@link Subquery} built with `.asSubquery(column)`.\n */\n in?: readonly T[] | Subquery<T>;\n /** None of the given values (`NOT IN`), as a list or a {@link Subquery}. */\n notIn?: readonly T[] | Subquery<T>;\n /** `IS NULL` (true) / `IS NOT NULL` (false). */\n isNull?: boolean;\n}\n\n/** Extra operators for ordered types (numbers, bigint, dates). */\ninterface OrderedOperators<T> extends BaseOperators<T> {\n /** Greater than. */\n gt?: T;\n /** Greater than or equal. */\n gte?: T;\n /** Less than. */\n lt?: T;\n /** Less than or equal. */\n lte?: T;\n /** Inclusive range `BETWEEN lo AND hi`. */\n between?: readonly [T, T];\n}\n\n/** Extra operators for string-like types. */\ninterface StringOperators<T> extends BaseOperators<T> {\n /** `LIKE` pattern (case-sensitive). `%` and `_` are wildcards. */\n like?: string;\n /**\n * `ILIKE` **pattern** (case-insensitive). This is pattern matching, not\n * equality: `%` and `_` in the operand are wildcards, so `{ ilike: \"%\" }`\n * matches every row. Never feed it unescaped user input — for a\n * case-insensitive *equality* test use {@link StringOperators.ieq}, and to\n * match a literal that may contain wildcards, wrap it in `escapeLike`.\n */\n ilike?: string;\n /**\n * Case-insensitive equality — compiles to `lower(col) = lower($1)`, with no\n * wildcards. The safe operator for a case-insensitive lookup (login, email),\n * and the one that matches a `lower(col)` functional index.\n */\n ieq?: T;\n}\n\n/** Extra operators for array columns (PostgreSQL). */\ninterface ArrayOperators<T> extends BaseOperators<T> {\n /** `@>` — the column contains every element of the operand. */\n contains?: T;\n /** `<@` — every element of the column is in the operand. */\n containedBy?: T;\n /** `&&` — the column and the operand share at least one element. */\n overlaps?: T;\n}\n\n/**\n * The operator object allowed for a column of (non-null) type `T`:\n * - `T[]` → equality, `in`, `contains`/`containedBy`/`overlaps` (PostgreSQL)\n * - `string` → equality, `in`, `like`/`ilike`/`ieq`\n * - `number` / `bigint` / `Date` → equality, `in`, ordered comparisons, `between`\n * - `boolean` → equality, `isNull`\n * - anything else (json/blob) → equality and `in` only\n */\nexport type OperatorsFor<T> = [T] extends [readonly unknown[]]\n ? ArrayOperators<T>\n : [T] extends [string]\n ? StringOperators<T>\n : [T] extends [number]\n ? OrderedOperators<T>\n : [T] extends [bigint]\n ? OrderedOperators<T>\n : [T] extends [Date]\n ? OrderedOperators<T>\n : [T] extends [boolean]\n ? BaseOperators<T>\n : BaseOperators<T>;\n\n/**\n * `where` shape: each key must be a real column; each value accepts either a\n * bare value (shorthand for `eq`) or an operator object restricted to operators\n * valid for that column's type. A `like` on a `number` column, or `gt` on a\n * `string`, is a compile error.\n */\nexport type WhereInput<Row = Record<string, unknown>> = {\n [K in keyof Row]?: Row[K] | OperatorsFor<NonNullable<Row[K]>>;\n};\n\n/** The full set of operator keys, for the dialect compiler to recognize. */\nexport const OPERATORS = [\n \"eq\",\n \"ne\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"like\",\n \"ilike\",\n \"ieq\",\n \"in\",\n \"notIn\",\n \"between\",\n \"isNull\",\n \"contains\",\n \"containedBy\",\n \"overlaps\",\n] as const;\n\n/** One supported operator name. */\nexport type Operator = (typeof OPERATORS)[number];\n\n// --------------------------------------------------------------------------\n// aggregate expressions\n// --------------------------------------------------------------------------\n\n/** An aggregate expression carrying its result type `T` as a phantom. */\nexport class Agg<T> {\n declare readonly __t: T;\n constructor(\n readonly fn: AggregateTerm[\"fn\"],\n readonly column: string | \"*\",\n ) {}\n}\n\n/** `COUNT(*)` — the number of rows in the group (never null). */\nexport function count(): Agg<number> {\n return new Agg<number>(\"count\", \"*\");\n}\n/** `SUM(column)` — null when the group has no non-null values. */\nexport function sum(column: string): Agg<number | null> {\n return new Agg<number | null>(\"sum\", column);\n}\n/** `AVG(column)` — null when the group has no non-null values. */\nexport function avg(column: string): Agg<number | null> {\n return new Agg<number | null>(\"avg\", column);\n}\n/** `MIN(column)` — numeric columns; null on an empty group. */\nexport function min(column: string): Agg<number | null> {\n return new Agg<number | null>(\"min\", column);\n}\n/** `MAX(column)` — numeric columns; null on an empty group. */\nexport function max(column: string): Agg<number | null> {\n return new Agg<number | null>(\"max\", column);\n}\n\n/** Extract the phantom result type of an aggregate expression. */\ntype AggResult<A> = A extends Agg<infer T> ? T : never;\n\n/** Flatten an intersection into a single object literal. */\ntype SimplifyProj<T> = { [K in keyof T]: T[K] } & {};\n\n// --------------------------------------------------------------------------\n// builder\n// --------------------------------------------------------------------------\n\n/**\n * Immutable, chainable SELECT builder.\n *\n * @typeParam Full - the complete row type (constrains where/orderBy keys).\n * @typeParam Proj - the projected result type returned on execution.\n */\nexport class SelectBuilder<Full, Proj = Full, Grouped extends boolean = false> {\n /** Phantom: the result element type, read only by the type system. */\n declare readonly __row: Proj;\n /** Phantom: `true` once `aggregate()` has made `having()` meaningful. */\n declare readonly __grouped: Grouped;\n\n constructor(\n readonly node: SelectNode,\n /** The source model, used to coerce rows on execution. */\n readonly source: ModelClass,\n ) {}\n\n private with(patch: Partial<SelectNode>): SelectBuilder<Full, Proj, Grouped> {\n return new SelectBuilder<Full, Proj, Grouped>(\n { ...this.node, ...patch },\n this.source,\n );\n }\n\n /** Add a WHERE filter: the object form (keys typed) or an `and`/`or`/`not`. */\n where(input: WhereInput<Full> | Condition): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ where: toCondNode(input as Record<string, unknown>) });\n }\n\n /**\n * Filter by the result of the aggregation (`HAVING`).\n *\n * Only available on a grouped builder — `.having()` before `.aggregate()` is a\n * compile error, not invalid SQL at runtime. Keys are the aggregate aliases you\n * named plus the grouped columns; `WHERE` still filters rows *before* grouping,\n * which is a different question.\n *\n * @param input The condition, keyed by alias or grouped column.\n * @returns A builder carrying the `HAVING` clause.\n *\n * @example\n * ```ts\n * select(Outbound)\n * .where({ status: \"queued\" })\n * .aggregate([\"consumer\"], { n: count() })\n * .having({ n: { gt: 100 } });\n * // ... GROUP BY \"consumer\" HAVING COUNT(*) > $2\n * ```\n */\n having(\n this: SelectBuilder<Full, Proj, true>,\n input: WhereInput<Proj> | Condition,\n ): SelectBuilder<Full, Proj, true> {\n return new SelectBuilder<Full, Proj, true>(\n { ...this.node, having: toCondNode(input as Record<string, unknown>) },\n this.source,\n );\n }\n\n /** Emit `SELECT DISTINCT` — drop duplicate rows. */\n distinct(): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ distinct: true });\n }\n\n /**\n * Group by columns and compute aggregates. The result row is the grouped\n * columns (typed from the model) plus one field per aggregate alias.\n *\n * @param groupBy The columns to group by (checked against the model). Pass `[]`\n * for a whole-table aggregate.\n * @param spec A map of result alias → aggregate expression ({@link count},\n * {@link sum}, {@link avg}, {@link min}, {@link max}).\n * @returns A builder whose row is `Pick<Full, K> & { [alias]: aggResult }`.\n *\n * @example\n * ```ts\n * select(Order).aggregate([\"status\"], { n: count(), total: sum(\"amount\") });\n * // rows: { status: string; n: number; total: number | null }[]\n * ```\n */\n aggregate<K extends keyof Full & string, S extends Record<string, Agg<unknown>>>(\n groupBy: readonly K[],\n spec: S,\n ): SelectBuilder<\n Full,\n SimplifyProj<Pick<Full, K> & { [A in keyof S]: AggResult<S[A]> }>,\n true\n > {\n const aggregates: AggregateTerm[] = Object.entries(spec).map(([alias, agg]) => ({\n fn: agg.fn,\n column: agg.column,\n alias,\n }));\n return new SelectBuilder(\n { ...this.node, aggregates, groupBy },\n this.source,\n ) as unknown as SelectBuilder<\n Full,\n SimplifyProj<Pick<Full, K> & { [A in keyof S]: AggResult<S[A]> }>,\n true\n >;\n }\n\n /**\n * Order by a column of the model, or — on a grouped query — by an aggregate\n * alias. Unlike `HAVING`, every dialect accepts the output alias in `ORDER BY`,\n * so the alias is emitted as written.\n *\n * @param column A model column, or a projected alias.\n * @param direction `\"asc\"` (default) or `\"desc\"`.\n * @returns A builder carrying the ordering term.\n */\n orderBy(\n column: (keyof Full & string) | (keyof Proj & string),\n direction: SortDirection = \"asc\",\n ): SelectBuilder<Full, Proj, Grouped> {\n return this.with({\n orderBy: [...this.node.orderBy, { column, direction }],\n });\n }\n\n /** Limit the number of rows. */\n limit(n: number): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ limit: n });\n }\n\n /** Skip the first `n` rows. */\n offset(n: number): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ offset: n });\n }\n\n /**\n * Narrow this SELECT to a single column and mark it as a subquery, so it can be\n * the operand of `in` / `notIn`.\n *\n * The whole query — `where`, `orderBy`, `limit`, and a locking clause — is\n * embedded in the outer statement, which is what collapses the claim-a-batch\n * pattern into one round trip instead of selecting ids and sending them back.\n *\n * @param column The single column to project (checked against the model).\n * @returns A subquery carrying that column's type.\n *\n * @example\n * ```ts\n * update(Outbound)\n * .set({ status: \"sending\", attempts: sql.raw(\"attempts + 1\") })\n * .where({\n * id: {\n * in: select(Outbound)\n * .where({ status: \"queued\" })\n * .orderBy(\"nextAttemptAt\")\n * .limit(10)\n * .forUpdate({ skipLocked: true })\n * .asSubquery(\"id\"),\n * },\n * })\n * .returning();\n * ```\n */\n asSubquery<K extends keyof Full & string>(column: K): Subquery<Full[K]> {\n return { node: { ...this.node, columns: [column] } } as Subquery<Full[K]>;\n }\n\n /**\n * Lock the selected rows for update (`SELECT ... FOR UPDATE`), à la\n * SQLAlchemy's `with_for_update()`.\n *\n * `{ skipLocked: true }` is the job-queue claim: competing workers each take a\n * disjoint batch instead of blocking on — or worse, double-processing — the\n * same rows.\n *\n * PostgreSQL and MySQL 8.0+ only. SQLite has no row-level locking, and its\n * dialect throws rather than emitting a `SELECT` that silently locks nothing —\n * a lock that does not exist only fails under production concurrency.\n *\n * @param options `skipLocked` / `noWait` wait behavior, and `of` to restrict\n * the lock to specific tables.\n * @returns A builder carrying the locking clause.\n * @throws Error When both `skipLocked` and `noWait` are set.\n *\n * @example\n * ```ts\n * const batch = await session.execute(\n * select(Outbound)\n * .where({ status: \"queued\" })\n * .orderBy(\"nextAttemptAt\")\n * .limit(10)\n * .forUpdate({ skipLocked: true }),\n * ).all();\n * ```\n */\n forUpdate(options?: LockOptions): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ lock: buildLock(\"update\", options) });\n }\n\n /**\n * Take a shared read lock on the selected rows (`SELECT ... FOR SHARE`), the\n * weaker counterpart of {@link SelectBuilder.forUpdate}.\n *\n * @param options `skipLocked` / `noWait` wait behavior, and `of` tables.\n * @returns A builder carrying the locking clause.\n * @throws Error When both `skipLocked` and `noWait` are set.\n */\n forShare(options?: LockOptions): SelectBuilder<Full, Proj, Grouped> {\n return this.with({ lock: buildLock(\"share\", options) });\n }\n}\n\n/** Normalize {@link LockOptions} into the AST's {@link LockClause}. */\nfunction buildLock(\n strength: LockClause[\"strength\"],\n options: LockOptions | undefined,\n): LockClause {\n if (options?.skipLocked && options?.noWait) {\n throw new Error(\"forUpdate/forShare accept skipLocked or noWait, not both.\");\n }\n const wait: LockClause[\"wait\"] = options?.skipLocked\n ? \"skipLocked\"\n : options?.noWait\n ? \"noWait\"\n : \"block\";\n return { strength, wait, of: options?.of ?? [] };\n}\n\n// --------------------------------------------------------------------------\n// entrypoint\n// --------------------------------------------------------------------------\n\n/** Build a SELECT over every column of the model. */\nexport function select<C extends ModelClass>(\n model: C,\n): SelectBuilder<InferModel<C>, InferModel<C>>;\n\n/** Build a SELECT projecting only the given columns. */\nexport function select<C extends ModelClass, K extends keyof InferModel<C> & string>(\n model: C,\n columns: readonly K[],\n): SelectBuilder<InferModel<C>, Pick<InferModel<C>, K>>;\n\nexport function select(\n model: ModelClass,\n columns?: readonly string[],\n): SelectBuilder<unknown, unknown> {\n return new SelectBuilder(\n {\n kind: \"select\",\n table: model.tablename,\n columns: columns ?? \"*\",\n distinct: false,\n aggregates: [],\n groupBy: [],\n where: undefined,\n orderBy: [],\n limit: undefined,\n offset: undefined,\n names: columnNamesOf(model) ?? undefined,\n },\n model,\n );\n}\n","/**\n * tempest-db-js — row (de)serialization, à la Python's `model_dump` / `model_validate`.\n *\n * Rows in tempest-db-js are plain inferred objects. This module converts between three\n * representations, coercing each field by its column type:\n *\n * - **Row** — native JS values (`Date`, `bigint`, `Uint8Array`, parsed JSON).\n * - **Dict** — a plain object of native values, restricted to known columns.\n * - **JSON** — a JSON-safe object (`Date` → ISO string, `bigint` → string,\n * `Uint8Array` → base64), ready for `JSON.stringify`.\n *\n * `fromDict` rebuilds a validated Row from arbitrary input (e.g. an API payload),\n * coercing strings back to `Date`/`bigint`/`Uint8Array` and validating that\n * required columns are present.\n */\n\nimport {\n type Column,\n type ColumnType,\n type InferModel,\n type ModelClass,\n type NameMap,\n columnPropsOf,\n columnsOf,\n} from \"./index.js\";\n\n/** Raised when `fromDict` input fails validation against the model. */\nexport class ValidationError extends Error {\n constructor(\n readonly table: string,\n readonly issues: readonly string[],\n ) {\n super(`Validation failed for ${table}:\\n - ${issues.join(\"\\n - \")}`);\n this.name = \"ValidationError\";\n }\n}\n\n/** Base64-encode bytes (Node `Buffer`, falling back to a manual encoder). */\nfunction toBase64(bytes: Uint8Array): string {\n if (typeof Buffer !== \"undefined\") return Buffer.from(bytes).toString(\"base64\");\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\n/** Base64-decode to bytes. */\nfunction fromBase64(value: string): Uint8Array {\n if (typeof Buffer !== \"undefined\") return new Uint8Array(Buffer.from(value, \"base64\"));\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Encode one native row value to its JSON-safe form, by column kind. */\nfunction encodeValue(column: Column<unknown>, value: unknown): unknown {\n if (value === null || value === undefined) return null;\n switch (column.type.kind) {\n case \"bigint\":\n return typeof value === \"bigint\" ? value.toString() : value;\n case \"date\":\n case \"datetime\":\n case \"timestamp\":\n return value instanceof Date ? value.toISOString() : value;\n case \"blob\":\n return value instanceof Uint8Array ? toBase64(value) : value;\n default:\n return value;\n }\n}\n\n/** Decode one dict value to its native row form, by column kind. */\nfunction decodeValue(column: Column<unknown>, value: unknown): unknown {\n if (value === null || value === undefined) return null;\n switch (column.type.kind) {\n case \"bigint\":\n return typeof value === \"bigint\" ? value : BigInt(value as string | number);\n case \"date\":\n case \"datetime\":\n case \"timestamp\":\n return value instanceof Date ? value : new Date(value as string | number);\n case \"blob\":\n return value instanceof Uint8Array ? value : fromBase64(value as string);\n case \"json\":\n return typeof value === \"string\" ? JSON.parse(value) : value;\n case \"array\": {\n const element = column.type.meta.element;\n const items = typeof value === \"string\" ? JSON.parse(value) : value;\n if (!Array.isArray(items)) return items;\n if (!element) return items;\n return items.map((item) => decodeValue({ type: element } as Column<unknown>, item));\n }\n case \"numeric\":\n return typeof value === \"string\" ? value : String(value);\n case \"boolean\":\n return typeof value === \"boolean\" ? value : value === 1 || value === \"true\";\n case \"smallint\":\n case \"integer\":\n case \"real\":\n case \"double\":\n return typeof value === \"number\" ? value : Number(value);\n default:\n return value; // varchar/text/char/uuid/enum/time → string passthrough\n }\n}\n\n/**\n * Convert a row to a plain dict of native values, restricted to known columns.\n * Strips any non-column properties; keeps `Date`/`bigint`/`Uint8Array` as-is.\n *\n * @param model The model class.\n * @param row The row object.\n * @returns A plain object with one entry per column.\n */\nexport function toDict<C extends ModelClass>(\n model: C,\n row: InferModel<C>,\n): Record<string, unknown> {\n const columns = columnsOf(model);\n const out: Record<string, unknown> = {};\n for (const name of Object.keys(columns)) {\n out[name] = (row as Record<string, unknown>)[name] ?? null;\n }\n return out;\n}\n\n/**\n * Convert a row to a JSON-safe object: `Date` → ISO string, `bigint` → string,\n * `Uint8Array` → base64. Ready to hand to `JSON.stringify`.\n *\n * @param model The model class.\n * @param row The row object.\n * @returns A JSON-safe object with one entry per column.\n */\nexport function toJSON<C extends ModelClass>(\n model: C,\n row: InferModel<C>,\n): Record<string, unknown> {\n const columns = columnsOf(model);\n const out: Record<string, unknown> = {};\n for (const [name, col] of Object.entries(columns)) {\n out[name] = encodeValue(col, (row as Record<string, unknown>)[name] ?? null);\n }\n return out;\n}\n\n/** Convenience: `toJSON` then `JSON.stringify`. */\nexport function stringify<C extends ModelClass>(model: C, row: InferModel<C>): string {\n return JSON.stringify(toJSON(model, row));\n}\n\n/**\n * Build a validated row from an arbitrary dict/JSON object (e.g. an API body).\n *\n * Each known column is coerced from the input to its native type (strings back\n * to `Date`/`bigint`/`Uint8Array`, JSON strings parsed). A column that is\n * `notNull`, has no default, and is missing/null in the input is a validation\n * error. Unknown keys in the input are ignored.\n *\n * @param model The model class.\n * @param data The input object (parsed JSON or a plain dict).\n * @returns A typed row.\n * @throws ValidationError When a required column is absent.\n */\nexport function fromDict<C extends ModelClass>(\n model: C,\n data: Record<string, unknown>,\n): InferModel<C> {\n const columns = columnsOf(model);\n const out: Record<string, unknown> = {};\n const issues: string[] = [];\n\n for (const [name, col] of Object.entries(columns)) {\n const present = name in data && data[name] !== undefined && data[name] !== null;\n if (!present) {\n const required = col.flags.notNull && !col.flags.hasDefault;\n if (required) {\n issues.push(`missing required column \"${name}\"`);\n continue;\n }\n out[name] = null;\n continue;\n }\n try {\n out[name] = decodeValue(col, data[name]);\n } catch (error) {\n issues.push(`column \"${name}\": ${(error as Error).message}`);\n }\n }\n\n if (issues.length > 0) {\n throw new ValidationError(model.tablename, issues);\n }\n return out as InferModel<C>;\n}\n\n/** Parse a JSON string then build a validated row. */\nexport function parse<C extends ModelClass>(model: C, json: string): InferModel<C> {\n return fromDict(model, JSON.parse(json) as Record<string, unknown>);\n}\n\n/** A per-column value decoder for the hot read path. */\ntype Decoder = (value: unknown) => unknown;\n\n/**\n * Build the specialized decoder for a column type, or `null` when the type needs\n * no coercion (varchar/text/char/uuid/enum/time — plain string passthrough).\n * Dispatching on the kind once here (at build time) keeps the per-row path a\n * single indirect call instead of a switch.\n */\nfunction decoderFor(type: ColumnType): Decoder | null {\n switch (type.kind) {\n case \"bigint\":\n return (v) => (v == null ? null : typeof v === \"bigint\" ? v : BigInt(v as string));\n case \"date\":\n case \"datetime\":\n case \"timestamp\":\n return (v) => (v == null ? null : v instanceof Date ? v : new Date(v as string));\n case \"blob\":\n return (v) =>\n v == null ? null : v instanceof Uint8Array ? v : fromBase64(v as string);\n case \"json\":\n return (v) => (v == null ? null : typeof v === \"string\" ? JSON.parse(v) : v);\n case \"array\": {\n const element = type.meta.element;\n const inner = element ? decoderFor(element) : null;\n if (!inner) return null;\n return (v) => (v == null ? null : Array.isArray(v) ? v.map(inner) : v);\n }\n case \"numeric\":\n return (v) => (v == null ? null : typeof v === \"string\" ? v : String(v));\n case \"boolean\":\n return (v) =>\n v == null ? null : typeof v === \"boolean\" ? v : v === 1 || v === \"true\";\n case \"smallint\":\n case \"integer\":\n case \"real\":\n case \"double\":\n return (v) => (v == null ? null : typeof v === \"number\" ? v : Number(v));\n default:\n return null; // varchar/text/char/uuid/enum/time → passthrough\n }\n}\n\n/**\n * Everything needed to turn a raw driver row into a model row: how to rename the\n * keys back into property space, and how to coerce the values.\n */\ninterface RowMapper {\n /** Database column → property name, or `null` when every name is the identity. */\n readonly props: NameMap | null;\n /** Database column → decoder, for the columns that need coercion. */\n readonly decoders: Map<string, Decoder>;\n}\n\n/** Memoized per-model row mappers. */\nconst mapperCache = new WeakMap<ModelClass, RowMapper>();\n\n/**\n * The (memoized) row mapper for a model. Keyed by **database** column name,\n * because that is what the driver hands back — a model that renames its columns\n * still lands in property space after one lookup.\n */\nfunction mapperFor(model: ModelClass): RowMapper {\n const cached = mapperCache.get(model);\n if (cached) return cached;\n const props = columnPropsOf(model);\n const names = props\n ? Object.fromEntries(Object.entries(props).map(([db, prop]) => [prop, db]))\n : null;\n const decoders = new Map<string, Decoder>();\n for (const [prop, col] of Object.entries(columnsOf(model))) {\n const decoder = decoderFor(col.type);\n if (decoder) decoders.set(names?.[prop] ?? prop, decoder);\n }\n const mapper: RowMapper = { props, decoders };\n mapperCache.set(model, mapper);\n return mapper;\n}\n\n/**\n * Coerce a raw driver row into native row values, by column type, renaming the\n * keys back to model property names when the model maps columns explicitly. Unlike\n * `fromDict`, it does NOT validate required columns — a row read from the\n * database (or a projection) is taken as-is, only its values are normalized\n * (e.g. `0/1` → boolean, ISO string → `Date`, JSON string → object). Keys that\n * are not columns of the model (or columns needing no coercion) pass through\n * untouched.\n *\n * Uses a memoized per-model decoder map so a large result set does not\n * re-reflect the model or re-dispatch the type switch on every row.\n *\n * @param model The model class.\n * @param raw The raw row returned by the driver.\n * @returns The row with native-typed values.\n */\nexport function coerceRow<C extends ModelClass>(\n model: C,\n raw: Record<string, unknown>,\n): InferModel<C> {\n const { props, decoders } = mapperFor(model);\n const out: Record<string, unknown> = {};\n for (const name of Object.keys(raw)) {\n const decode = decoders.get(name);\n out[props?.[name] ?? name] = decode ? decode(raw[name]) : raw[name];\n }\n return out as InferModel<C>;\n}\n","/**\n * tempest-db-js — Phase 2: typed INSERT / UPDATE / DELETE builders.\n *\n * Like `select`, these are PURE AST + phantom types — no database access. They\n * are executed in Phase 4 via `session.execute`.\n *\n * Safety rule: UPDATE and DELETE start in an *unguarded* type state. A builder\n * only becomes executable once it has a `.where(...)` clause or an explicit\n * `.unguarded()` opt-in. Phase 4's `session.execute` will accept only guarded\n * builders, making an accidental full-table write a compile error.\n */\n\nimport { type CondNode, type Condition, toCondNode } from \"./conditions.js\";\nimport {\n type InferInsert,\n type InferModel,\n type ModelClass,\n type NameMap,\n type SqlExpression,\n columnNamesOf,\n columnsOf,\n isSqlExpression,\n} from \"./index.js\";\nimport type { WhereInput } from \"./query.js\";\nimport { ValidationError } from \"./serialize.js\";\n\n// --------------------------------------------------------------------------\n// shared\n// --------------------------------------------------------------------------\n\n/** Columns to return from a mutation, or \"*\" for the whole row. */\nexport type Returning = readonly string[] | \"*\" | null;\n\n/**\n * A write shape over `Row`: every column accepts its own value **or** a\n * {@link SqlExpression}, which the dialect renders inline instead of binding.\n * Optionality is preserved from `Row`, so an insert shape keeps its defaults\n * optional.\n */\nexport type WriteValues<Row> = { [K in keyof Row]: Row[K] | SqlExpression };\n\n/** A partial write shape — the `SET` clause of an UPDATE or a `DO UPDATE`. */\nexport type WritePatch<Row> = { [K in keyof Row]?: Row[K] | SqlExpression };\n\n/**\n * Column kinds whose stored value is legitimately an object or an array. Every\n * other kind takes a scalar, so an object reaching it is a mistake.\n */\nconst STRUCTURED_KINDS: ReadonlySet<string> = new Set([\"json\", \"array\", \"blob\"]);\n\n/** True when a value is a scalar SQL can bind as-is. */\nfunction isBindableScalar(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n const type = typeof value;\n if (type === \"string\" || type === \"number\" || type === \"bigint\" || type === \"boolean\") {\n return true;\n }\n return value instanceof Date || value instanceof Uint8Array;\n}\n\n/**\n * Reject write values that SQL cannot bind meaningfully, before they reach the\n * driver.\n *\n * Without this, a stray object is bound as a parameter and the driver stringifies\n * it (or stores null), so a typo like `{ attempts: { raw: \"attempts + 1\" } }`\n * silently corrupts the column instead of failing. TypeScript already rejects it,\n * but JavaScript callers, an `as` cast, or data crossing a network boundary do\n * not go through the type-checker. To write an expression, use the branded\n * `sql.raw()` / `sql.expr` values.\n *\n * @param model The model the statement writes to.\n * @param values The column → value map from `set()` / `values()`.\n * @param clause The clause name, for the error message.\n * @throws ValidationError When a value is not bindable, or a key is not a column.\n */\nfunction assertWritableValues(\n model: ModelClass,\n values: Record<string, unknown>,\n clause: \"set\" | \"values\",\n): void {\n const columns = columnsOf(model);\n const issues: string[] = [];\n for (const [key, value] of Object.entries(values)) {\n const col = columns[key];\n if (!col) {\n issues.push(`${clause}: \"${key}\" is not a column of ${model.tablename}`);\n continue;\n }\n if (isSqlExpression(value) || isBindableScalar(value)) continue;\n if (typeof value === \"object\" && STRUCTURED_KINDS.has(col.type.kind)) continue;\n issues.push(\n `${clause}: \"${key}\" got ${describeValue(value)}, which cannot be bound to a ` +\n `${col.type.kind} column — use sql.raw()/sql.expr\\`...\\` for a SQL expression`,\n );\n }\n if (issues.length > 0) throw new ValidationError(model.tablename, issues);\n}\n\n/**\n * Reject a multi-row insert whose rows disagree about a **defaulted** column.\n *\n * Every row of one INSERT shares one column list, so a key present in some rows\n * and absent in others is bound as `NULL` for the rows that omit it. For a plain\n * nullable column that is exactly what omitting it meant anyway; for a column\n * with a `DEFAULT` (a primary key included) it is not — the row would be written\n * as NULL instead of taking its default. SQLite has no `DEFAULT` keyword inside\n * `VALUES`, so there is no portable per-row escape; failing loudly is the honest\n * option.\n *\n * @param model The model being inserted into.\n * @param rows The rows of this insert.\n * @throws ValidationError When rows disagree about a column that has a default.\n */\nfunction assertConsistentRows(\n model: ModelClass,\n rows: readonly Record<string, unknown>[],\n): void {\n if (rows.length < 2) return;\n const union = new Set<string>();\n for (const row of rows) for (const key of Object.keys(row)) union.add(key);\n const inconsistent = [...union].filter((key) => rows.some((row) => !(key in row)));\n if (inconsistent.length === 0) return;\n const columns = columnsOf(model);\n const defaulted = inconsistent.filter((key) => columns[key]?.flags.hasDefault);\n if (defaulted.length === 0) return;\n const named = defaulted.map((c) => `\"${c}\"`).join(\", \");\n const verb = defaulted.length === 1 ? \"has\" : \"have\";\n throw new ValidationError(model.tablename, [\n `values: ${named} ${verb} a default but is missing from some rows of this multi-row insert — every row shares one column list, so the omitting rows would be written as NULL instead of taking the default. Give the column in every row, or insert the rows separately.`,\n ]);\n}\n\n/** A short description of a rejected value, for the validation message. */\nfunction describeValue(value: unknown): string {\n if (typeof value === \"function\") return \"a function\";\n if (Array.isArray(value)) return \"an array\";\n if (typeof value === \"symbol\") return \"a symbol\";\n return \"an object\";\n}\n\n// --------------------------------------------------------------------------\n// INSERT\n// --------------------------------------------------------------------------\n\n/**\n * Conflict-resolution clause for an INSERT (`ON CONFLICT`). `target` is the\n * conflicting column(s) (a unique/PK constraint); `update` is `\"nothing\"` for\n * `DO NOTHING`, or the columns to overwrite for `DO UPDATE SET`.\n */\nexport interface OnConflict {\n readonly target: readonly string[];\n readonly update: Record<string, unknown> | \"nothing\";\n /**\n * The predicate of a **partial** unique index. PostgreSQL only matches a\n * partial index as a conflict target when `ON CONFLICT` repeats its predicate,\n * so without this an insert against `... WHERE key IS NOT NULL` is rejected\n * with \"there is no unique or exclusion constraint matching the ON CONFLICT\n * specification\".\n */\n readonly targetWhere?: CondNode | undefined;\n /** Extra condition restricting which conflicting rows `DO UPDATE` rewrites. */\n readonly updateWhere?: CondNode | undefined;\n}\n\n/** Options for the `ON CONFLICT` clause of {@link InsertBuilder.onConflictDoNothing}. */\nexport interface OnConflictOptions<Full> {\n /** The predicate of the partial unique index used as the conflict target. */\n readonly where?: WhereInput<Full> | Condition;\n}\n\n/** Options for {@link InsertBuilder.onConflictDoUpdate}. */\nexport interface OnConflictUpdateOptions<Full> {\n /** The predicate of the partial unique index used as the conflict target. */\n readonly indexWhere?: WhereInput<Full> | Condition;\n /** Extra condition deciding which conflicting rows are actually rewritten. */\n readonly updateWhere?: WhereInput<Full> | Condition;\n}\n\n/** Serializable AST for an INSERT. */\nexport interface InsertNode {\n readonly kind: \"insert\";\n readonly table: string;\n readonly values: readonly Record<string, unknown>[];\n readonly returning: Returning;\n /** Conflict handling (`ON CONFLICT ...`), or `undefined` for none. */\n readonly onConflict?: OnConflict;\n /** Property → column map, or `undefined` when every name is the identity. */\n readonly names?: NameMap | undefined;\n}\n\n/**\n * INSERT builder.\n *\n * @typeParam Full - the complete row type (for `returning`).\n * @typeParam Ins - the insert shape (defaults/PK optional).\n * @typeParam Ret - execution result: `number` (rows affected) until `returning`.\n */\nexport class InsertBuilder<Full, Ins, Ret = number> {\n declare readonly __row: Ret;\n\n constructor(\n readonly node: InsertNode,\n /** The source model, used to coerce returned rows on execution. */\n readonly source: ModelClass,\n ) {}\n\n private with<R>(patch: Partial<InsertNode>): InsertBuilder<Full, Ins, R> {\n return new InsertBuilder<Full, Ins, R>({ ...this.node, ...patch }, this.source);\n }\n\n /**\n * Provide one row or many rows to insert, typed by the insert shape.\n *\n * @param rows One row, or an array of rows.\n * @returns A builder carrying the rows.\n * @throws ValidationError When a value is not a column value the dialect can\n * bind (see the `sql` helpers for writing an expression instead), or when the\n * rows of a multi-row insert disagree about a column that has a default.\n */\n values(\n rows: WriteValues<Ins> | readonly WriteValues<Ins>[],\n ): InsertBuilder<Full, Ins, Ret> {\n const list = (Array.isArray(rows) ? rows : [rows]) as readonly Record<\n string,\n unknown\n >[];\n for (const row of list) assertWritableValues(this.source, row, \"values\");\n assertConsistentRows(this.source, list);\n return this.with<Ret>({ values: list });\n }\n\n /**\n * On a unique/PK conflict on `target`, do nothing (skip the row).\n *\n * @param target The conflicting column(s) — a unique or primary key.\n * @param options Pass `where` to name the predicate of a **partial** unique\n * index, which PostgreSQL requires in order to match it as a conflict target.\n * @returns A builder carrying the conflict clause.\n *\n * @example\n * ```ts\n * insert(Outbound)\n * .values(data)\n * .onConflictDoNothing([\"consumer\", \"idempotencyKey\"], {\n * where: { idempotencyKey: { isNull: false } },\n * })\n * .returning();\n * ```\n */\n onConflictDoNothing(\n target: readonly (keyof Full & string)[],\n options?: OnConflictOptions<Full>,\n ): InsertBuilder<Full, Ins, Ret> {\n return this.with<Ret>({\n onConflict: {\n target,\n update: \"nothing\",\n targetWhere: options?.where ? toCondNode(options.where as never) : undefined,\n },\n });\n }\n\n /**\n * On a unique/PK conflict on `target`, overwrite the given columns (upsert).\n *\n * @param target The conflicting column(s) — a unique or primary key.\n * @param set The columns to update with new values.\n * @param options `indexWhere` names the predicate of a partial unique index\n * (the conflict target); `updateWhere` further restricts which conflicting\n * rows are rewritten.\n * @returns A builder carrying the conflict clause.\n * @throws ValidationError When a `set` value cannot be bound.\n */\n onConflictDoUpdate(\n target: readonly (keyof Full & string)[],\n set: WritePatch<Full>,\n options?: OnConflictUpdateOptions<Full>,\n ): InsertBuilder<Full, Ins, Ret> {\n assertWritableValues(this.source, set as Record<string, unknown>, \"set\");\n return this.with<Ret>({\n onConflict: {\n target,\n update: set as Record<string, unknown>,\n targetWhere: options?.indexWhere\n ? toCondNode(options.indexWhere as never)\n : undefined,\n updateWhere: options?.updateWhere\n ? toCondNode(options.updateWhere as never)\n : undefined,\n },\n });\n }\n\n /** Return the full inserted row(s). */\n returning(): InsertBuilder<Full, Ins, Full>;\n /** Return only the given columns of the inserted row(s). */\n returning<K extends keyof Full & string>(\n columns: readonly K[],\n ): InsertBuilder<Full, Ins, Pick<Full, K>>;\n returning(columns?: readonly string[]): InsertBuilder<Full, Ins, unknown> {\n return this.with<unknown>({ returning: columns ?? \"*\" });\n }\n}\n\n/** Build an INSERT into the model's table. */\nexport function insert<C extends ModelClass>(\n model: C,\n): InsertBuilder<InferModel<C>, InferInsert<C>> {\n return new InsertBuilder(\n {\n kind: \"insert\",\n table: model.tablename,\n values: [],\n returning: null,\n names: columnNamesOf(model) ?? undefined,\n },\n model,\n );\n}\n\n// --------------------------------------------------------------------------\n// UPDATE\n// --------------------------------------------------------------------------\n\n/** Serializable AST for an UPDATE. */\nexport interface UpdateNode {\n readonly kind: \"update\";\n readonly table: string;\n readonly set: Record<string, unknown>;\n readonly where: CondNode | undefined;\n /** True once a where-clause or explicit opt-in makes the write safe. */\n readonly guarded: boolean;\n readonly returning: Returning;\n /** Property → column map, or `undefined` when every name is the identity. */\n readonly names?: NameMap | undefined;\n}\n\n/**\n * UPDATE builder.\n *\n * @typeParam Full - the complete row type.\n * @typeParam Guarded - `true` once safe to execute (has where or opted out).\n * @typeParam Ret - execution result type.\n */\nexport class UpdateBuilder<Full, Guarded extends boolean, Ret = number> {\n declare readonly __row: Ret;\n declare readonly __guarded: Guarded;\n\n constructor(\n readonly node: UpdateNode,\n /** The source model, used to coerce returned rows on execution. */\n readonly source: ModelClass,\n ) {}\n\n private with<G extends boolean, R>(\n patch: Partial<UpdateNode>,\n ): UpdateBuilder<Full, G, R> {\n return new UpdateBuilder<Full, G, R>({ ...this.node, ...patch }, this.source);\n }\n\n /**\n * The columns to write. Partial — only the given columns change.\n *\n * A value is bound as a parameter unless it is a {@link sql} expression, which\n * is rendered inline instead — that is how a counter is written without a\n * read-modify-write race.\n *\n * @param values The column → value map.\n * @returns A builder carrying the assignments.\n * @throws ValidationError When a value is not a column value the dialect can\n * bind (a bare object, an array on a scalar column, a function).\n *\n * @example\n * ```ts\n * update(Outbound)\n * .set({ attempts: sql.raw(\"attempts + 1\"), updatedAt: sql.now() })\n * .where({ id });\n * ```\n */\n set(values: WritePatch<Full>): UpdateBuilder<Full, Guarded, Ret> {\n assertWritableValues(this.source, values as Record<string, unknown>, \"set\");\n return this.with<Guarded, Ret>({ set: values as Record<string, unknown> });\n }\n\n /** Restrict the rows to update. Marks the builder safe to execute. */\n where(input: WhereInput<Full> | Condition): UpdateBuilder<Full, true, Ret> {\n return this.with<true, Ret>({\n where: toCondNode(input as Record<string, unknown>),\n guarded: true,\n });\n }\n\n /** Explicit opt-in to update EVERY row. Use deliberately. */\n unguarded(): UpdateBuilder<Full, true, Ret> {\n return this.with<true, Ret>({ guarded: true });\n }\n\n /** Return the full updated row(s). */\n returning(): UpdateBuilder<Full, Guarded, Full>;\n /** Return only the given columns of the updated row(s). */\n returning<K extends keyof Full & string>(\n columns: readonly K[],\n ): UpdateBuilder<Full, Guarded, Pick<Full, K>>;\n returning(columns?: readonly string[]): UpdateBuilder<Full, Guarded, unknown> {\n return this.with<Guarded, unknown>({ returning: columns ?? \"*\" });\n }\n}\n\n/** Build an UPDATE on the model's table. Starts unguarded. */\nexport function update<C extends ModelClass>(\n model: C,\n): UpdateBuilder<InferModel<C>, false> {\n return new UpdateBuilder(\n {\n kind: \"update\",\n table: model.tablename,\n set: {},\n where: undefined,\n guarded: false,\n returning: null,\n names: columnNamesOf(model) ?? undefined,\n },\n model,\n );\n}\n\n// --------------------------------------------------------------------------\n// DELETE\n// --------------------------------------------------------------------------\n\n/** Serializable AST for a DELETE. */\nexport interface DeleteNode {\n readonly kind: \"delete\";\n readonly table: string;\n readonly where: CondNode | undefined;\n readonly guarded: boolean;\n readonly returning: Returning;\n /** Property → column map, or `undefined` when every name is the identity. */\n readonly names?: NameMap | undefined;\n}\n\n/**\n * DELETE builder. Starts unguarded — same safety rule as UPDATE.\n *\n * @typeParam Full - the complete row type.\n * @typeParam Guarded - `true` once safe to execute.\n * @typeParam Ret - execution result type.\n */\nexport class DeleteBuilder<Full, Guarded extends boolean, Ret = number> {\n declare readonly __row: Ret;\n declare readonly __guarded: Guarded;\n\n constructor(\n readonly node: DeleteNode,\n /** The source model, used to coerce returned rows on execution. */\n readonly source: ModelClass,\n ) {}\n\n private with<G extends boolean, R>(\n patch: Partial<DeleteNode>,\n ): DeleteBuilder<Full, G, R> {\n return new DeleteBuilder<Full, G, R>({ ...this.node, ...patch }, this.source);\n }\n\n /** Restrict the rows to delete. Marks the builder safe to execute. */\n where(input: WhereInput<Full> | Condition): DeleteBuilder<Full, true, Ret> {\n return this.with<true, Ret>({\n where: toCondNode(input as Record<string, unknown>),\n guarded: true,\n });\n }\n\n /** Explicit opt-in to delete EVERY row. Use deliberately. */\n unguarded(): DeleteBuilder<Full, true, Ret> {\n return this.with<true, Ret>({ guarded: true });\n }\n\n /** Return the full deleted row(s). */\n returning(): DeleteBuilder<Full, Guarded, Full>;\n /** Return only the given columns of the deleted row(s). */\n returning<K extends keyof Full & string>(\n columns: readonly K[],\n ): DeleteBuilder<Full, Guarded, Pick<Full, K>>;\n returning(columns?: readonly string[]): DeleteBuilder<Full, Guarded, unknown> {\n return this.with<Guarded, unknown>({ returning: columns ?? \"*\" });\n }\n}\n\n/** Build a DELETE on the model's table. Starts unguarded. */\nexport function del<C extends ModelClass>(model: C): DeleteBuilder<InferModel<C>, false> {\n return new DeleteBuilder(\n {\n kind: \"delete\",\n table: model.tablename,\n where: undefined,\n guarded: false,\n returning: null,\n names: columnNamesOf(model) ?? undefined,\n },\n model,\n );\n}\n","/**\n * tempest-db-js — database URL parsing & dialect detection.\n *\n * Mirrors SQLAlchemy's `make_url`: a single connection string identifies the\n * dialect (and optional driver), so switching databases is just swapping the\n * URL — `sqlite://./app.db` ↔ `postgresql://user:pass@host/db`.\n *\n * The driver suffix (`postgresql+pg`, `sqlite+better-sqlite3`, or SQLAlchemy's\n * async flavors like `postgresql+asyncpg`) is parsed out and ignored for dialect\n * detection, so URLs copied from a Python service still work here.\n */\n\n/** A database dialect tempest-db-js can target. */\nexport type Dialect = \"sqlite\" | \"postgresql\" | \"mysql\";\n\n/** A parsed database URL, dialect-neutral. */\nexport interface ParsedDatabaseUrl {\n /** The detected dialect. */\n readonly dialect: Dialect;\n /** Driver after the `+` in the scheme (e.g. `better-sqlite3`), or `null`. */\n readonly driver: string | null;\n /** Host (PostgreSQL/MySQL), or `null` for SQLite. */\n readonly host: string | null;\n /** Port, or `null`. */\n readonly port: number | null;\n /** Username, or `null`. */\n readonly user: string | null;\n /** Password, or `null`. */\n readonly password: string | null;\n /** Database name (PostgreSQL) or file path (SQLite). `:memory:` for in-memory. */\n readonly database: string | null;\n /** Extra query-string options (`?sslmode=require`). */\n readonly options: Readonly<Record<string, string>>;\n /** The original URL, untouched. */\n readonly raw: string;\n}\n\n/** Raised when a URL cannot be parsed or its dialect is unsupported. */\nexport class InvalidDatabaseUrl extends Error {\n constructor(url: string, reason: string) {\n super(`Invalid database URL ${JSON.stringify(url)}: ${reason}`);\n this.name = \"InvalidDatabaseUrl\";\n }\n}\n\n/** Map a scheme's base name to a tempest-db-js dialect. */\nconst DIALECT_ALIASES: Readonly<Record<string, Dialect>> = {\n sqlite: \"sqlite\",\n sqlite3: \"sqlite\",\n postgresql: \"postgresql\",\n postgres: \"postgresql\",\n pg: \"postgresql\",\n mysql: \"mysql\",\n mariadb: \"mysql\",\n};\n\n/** Split `\"postgresql+asyncpg\"` into `[\"postgresql\", \"asyncpg\"]`. */\nfunction splitScheme(scheme: string): { base: string; driver: string | null } {\n const plus = scheme.indexOf(\"+\");\n if (plus === -1) return { base: scheme.toLowerCase(), driver: null };\n return {\n base: scheme.slice(0, plus).toLowerCase(),\n driver: scheme.slice(plus + 1) || null,\n };\n}\n\n/** Decode a URL component, leaving it untouched if it is not encoded. */\nfunction decode(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\n/**\n * Parse a SQLite URL. Forms supported (SQLAlchemy-compatible):\n * - `sqlite://:memory:` / `sqlite::memory:` → in-memory\n * - `sqlite:///relative/path.db` → relative path\n * - `sqlite:////absolute/path.db` → absolute path\n * - `sqlite://./app.db` / `sqlite:app.db` → relative path (convenience)\n */\nfunction parseSqlite(\n raw: string,\n driver: string | null,\n rest: string,\n): ParsedDatabaseUrl {\n let database: string;\n if (rest.endsWith(\":memory:\")) {\n database = \":memory:\";\n } else if (rest.startsWith(\"///\")) {\n // sqlite:///rel → \"rel\" ; sqlite:////abs → \"/abs\"\n database = rest.slice(3) || \":memory:\";\n } else if (rest.startsWith(\"//\")) {\n database = rest.slice(2) || \":memory:\";\n } else {\n database = rest || \":memory:\";\n }\n return {\n dialect: \"sqlite\",\n driver,\n host: null,\n port: null,\n user: null,\n password: null,\n database: decode(database),\n options: {},\n raw,\n };\n}\n\n/**\n * Parse a network-style URL (PostgreSQL or MySQL) via the WHATWG URL parser.\n * Both share the `scheme://user:pass@host:port/db?opts` shape, so one parser\n * serves both — only the resulting `dialect` differs.\n */\nfunction parseNetworkUrl(\n raw: string,\n driver: string | null,\n rest: string,\n dialect: \"postgresql\" | \"mysql\",\n): ParsedDatabaseUrl {\n // Rebuild with a clean scheme so the WHATWG URL parser accepts it.\n let parsed: URL;\n try {\n parsed = new URL(`${dialect}:${rest}`);\n } catch {\n throw new InvalidDatabaseUrl(raw, \"could not parse host/credentials\");\n }\n const database = decode(parsed.pathname.replace(/^\\//, \"\")) || null;\n const options: Record<string, string> = {};\n for (const [key, value] of parsed.searchParams) options[key] = value;\n return {\n dialect,\n driver,\n host: parsed.hostname || null,\n port: parsed.port ? Number(parsed.port) : null,\n user: parsed.username ? decode(parsed.username) : null,\n password: parsed.password ? decode(parsed.password) : null,\n database,\n options,\n raw,\n };\n}\n\n/**\n * Parse a database URL into its dialect and connection parts.\n *\n * @param url A connection string, e.g. `\"postgresql://app:app@localhost/app\"`\n * or `\"sqlite:///app.db\"`. An async driver suffix (`+asyncpg`, `+aiosqlite`)\n * is accepted and ignored for dialect detection.\n * @returns The parsed, dialect-neutral connection descriptor.\n * @throws InvalidDatabaseUrl When the URL has no scheme or an unknown dialect.\n */\nexport function parseDatabaseUrl(url: string): ParsedDatabaseUrl {\n const schemeEnd = url.indexOf(\":\");\n if (schemeEnd === -1) {\n throw new InvalidDatabaseUrl(\n url,\n \"missing scheme (expected e.g. sqlite:// or postgresql://)\",\n );\n }\n const { base, driver } = splitScheme(url.slice(0, schemeEnd));\n const dialect = DIALECT_ALIASES[base];\n if (!dialect) {\n throw new InvalidDatabaseUrl(url, `unknown dialect ${JSON.stringify(base)}`);\n }\n const rest = url.slice(schemeEnd + 1);\n if (dialect === \"sqlite\") return parseSqlite(url, driver, rest);\n return parseNetworkUrl(url, driver, rest, dialect);\n}\n\n/** Detect just the dialect of a URL, ignoring the rest. */\nexport function detectDialect(url: string): Dialect {\n return parseDatabaseUrl(url).dialect;\n}\n","/**\n * tempest-db-js — portable SQL expression rendering.\n *\n * A `sql.now()` / `sql.uuidv4()` token is dialect-neutral in the AST and in the\n * migration IR; this is the single place it becomes concrete SQL. Kept in its own\n * module (types only, no runtime imports) so both the query dialect and the DDL\n * renderer share one mapping instead of drifting apart.\n */\n\nimport type { Dialect } from \"./url.js\";\n\n/** The dialect-neutral expression tokens (the non-fragment `PortableExpression`s). */\nexport type PortableToken = \"now\" | \"current_date\" | \"current_time\" | \"uuidv4\";\n\n/**\n * Render a portable expression token to SQL for the dialect.\n *\n * @param token The dialect-neutral token.\n * @param dialect The target dialect.\n * @returns The SQL text for that token.\n */\nexport function renderPortableToken(token: PortableToken, dialect: Dialect): string {\n switch (token) {\n case \"now\":\n return dialect === \"postgresql\" ? \"now()\" : \"CURRENT_TIMESTAMP\";\n case \"current_date\":\n return \"CURRENT_DATE\";\n case \"current_time\":\n return \"CURRENT_TIME\";\n case \"uuidv4\":\n if (dialect === \"postgresql\") return \"gen_random_uuid()\";\n if (dialect === \"mysql\") return \"(UUID())\";\n return \"(lower(hex(randomblob(16))))\";\n }\n}\n","/**\n * tempest-db-js — Phase 4a: dialect SQL compilation.\n *\n * Turns the dialect-neutral AST (`SelectNode`, `InsertNode`, `UpdateNode`,\n * `DeleteNode` from Phases 1-2) into `{ sql, params }`. This is the ONLY place\n * SQL is produced — always parameterized (`?` for SQLite, `$1` for PostgreSQL),\n * never string interpolation, so it is injection-safe by construction.\n *\n * It does NOT touch a database — execution is Phase 4b (`session.execute`).\n */\n\nimport type { CondNode, ExprNode } from \"./conditions.js\";\nimport { renderPortableToken } from \"./expressions.js\";\nimport { type NameMap, type SqlExpression, isSqlExpression } from \"./index.js\";\nimport type { JoinNode } from \"./join.js\";\nimport type { DeleteNode, InsertNode, UpdateNode } from \"./mutations.js\";\nimport { type LockClause, OPERATORS, type SelectNode, isSubquery } from \"./query.js\";\nimport type { Dialect } from \"./url.js\";\n\n/** A compiled, parameterized statement ready to hand to a driver. */\nexport interface CompiledQuery {\n readonly sql: string;\n readonly params: readonly unknown[];\n}\n\n/** Any compilable AST node. */\nexport type QueryNode = SelectNode | InsertNode | UpdateNode | DeleteNode | JoinNode;\n\nconst OPERATOR_SET: ReadonlySet<string> = new Set(OPERATORS);\n\n/** True when a where-value is an operator object rather than a bare value. */\nfunction isOperatorObject(value: unknown): value is Record<string, unknown> {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n value instanceof Date ||\n value instanceof Uint8Array\n ) {\n return false;\n }\n const keys = Object.keys(value);\n return keys.length > 0 && keys.every((k) => OPERATOR_SET.has(k));\n}\n\n/**\n * Collects bound parameters and renders placeholders in dialect style. Exposed\n * because dialect subclasses receive it when overriding clause rendering.\n */\nexport class Params {\n readonly values: unknown[] = [];\n\n constructor(private readonly placeholder: (index: number) => string) {}\n\n bind(value: unknown): string {\n this.values.push(value);\n return this.placeholder(this.values.length);\n }\n}\n\n/**\n * The column list of an INSERT: the union of every row's keys, in first-seen\n * order.\n *\n * Taking only the first row's keys silently drops a value that a later row\n * supplies — the column is never named, so the value has nowhere to go. That was\n * unreachable while every row had to carry every key, and became reachable the\n * moment nullable columns turned optional on insert.\n *\n * @param rows The rows being inserted.\n * @returns Every column named by at least one row.\n */\nfunction insertColumns(rows: readonly Record<string, unknown>[]): string[] {\n const columns: string[] = [];\n const seen = new Set<string>();\n for (const row of rows) {\n for (const key of Object.keys(row)) {\n if (seen.has(key)) continue;\n seen.add(key);\n columns.push(key);\n }\n }\n return columns;\n}\n\n/** True when any value written by an INSERT is a SQL expression, not a literal. */\nfunction insertHasExpression(node: InsertNode): boolean {\n for (const row of node.values) {\n for (const value of Object.values(row)) {\n if (isSqlExpression(value)) return true;\n }\n }\n const update = node.onConflict?.update;\n if (update && update !== \"nothing\") {\n for (const value of Object.values(update)) {\n if (isSqlExpression(value)) return true;\n }\n }\n return false;\n}\n\n/**\n * Base SQL compiler shared by every dialect. Subclasses customize only what\n * actually differs between databases (placeholder syntax, `ILIKE` support).\n */\nexport abstract class BaseDialect {\n abstract readonly name: Dialect;\n\n /**\n * INSERT SQL templates keyed by structure (dialect|table|columns|rowCount|\n * returning). Shared across dialect instances — the key namespaces by dialect\n * name, and the placeholder text is dialect-specific but structure-determined.\n */\n private static readonly insertTemplates = new Map<string, string>();\n\n /** Quoted-identifier cache (see {@link quoteId}). Shared across dialects. */\n private static readonly quotedIds = new Map<string, string>();\n\n /** Render the n-th (1-based) placeholder. */\n protected abstract placeholder(index: number): string;\n\n /** Render a case-insensitive LIKE for the active dialect. */\n protected abstract ilike(column: string, param: string): string;\n\n /**\n * Validate a subquery operand before it is rendered, for dialects that restrict\n * what an `IN (SELECT ...)` may contain. The default accepts everything.\n *\n * @param _node The subquery's AST.\n * @throws Error When the dialect cannot execute this subquery.\n */\n protected checkSubquery(_node: SelectNode): void {}\n\n /**\n * The SQL operator for an array containment/overlap test.\n *\n * Only PostgreSQL has native arrays; the other dialects throw rather than\n * emitting an operator that means something else there.\n *\n * @param op The array operator name.\n * @returns The SQL operator text.\n * @throws Error On a dialect without native array support.\n */\n protected arrayOperator(op: \"contains\" | \"containedBy\" | \"overlaps\"): string {\n throw new Error(\n `The \"${op}\" operator needs native array support, which ${this.name} does not have.`,\n );\n }\n\n /**\n * Quote an identifier (column/table) for the active dialect.\n *\n * Memoized: identifiers form a small, stable set (column/table names), but this\n * runs for every identifier on every compile. Caching the quoted form removes a\n * regex-replace + string allocation from the hot path. The standard double-quote\n * form is identical across both dialects, so one shared cache is correct.\n */\n protected quoteId(name: string): string {\n const cached = BaseDialect.quotedIds.get(name);\n if (cached !== undefined) return cached;\n const quoted = `\"${name.replace(/\"/g, '\"\"')}\"`;\n BaseDialect.quotedIds.set(name, quoted);\n return quoted;\n }\n\n /** Compile any node to `{ sql, params }`. */\n compile(node: QueryNode): CompiledQuery {\n const params = new Params((i) => this.placeholder(i));\n let sql: string;\n switch (node.kind) {\n case \"select\":\n sql = this.compileSelect(node, params);\n break;\n case \"insert\":\n sql = this.compileInsert(node, params);\n break;\n case \"update\":\n sql = this.compileUpdate(node, params);\n break;\n case \"delete\":\n sql = this.compileDelete(node, params);\n break;\n case \"join_select\":\n sql = this.compileJoin(node, params);\n break;\n }\n return { sql, params: params.values };\n }\n\n /**\n * Render a qualified `alias.column` ref as `\"alias\".\"column\"`, translating the\n * property name to the real column name for that alias's model.\n *\n * @param ref The `alias.property` reference (a bare name is left unqualified).\n * @param names The node's per-alias name maps, if any source renames columns.\n * @returns The quoted, qualified identifier.\n */\n private qualify(\n ref: string,\n names?: Readonly<Record<string, NameMap>> | undefined,\n ): string {\n const dot = ref.indexOf(\".\");\n if (dot === -1) return this.quoteId(ref);\n const alias = ref.slice(0, dot);\n const prop = ref.slice(dot + 1);\n return `${this.quoteId(alias)}.${this.columnId(prop, names?.[alias])}`;\n }\n\n /**\n * Quote a column identifier, translating the model property name to the real\n * database column name first.\n *\n * `names` is `undefined` for a model that renames nothing — the overwhelmingly\n * common case — so this stays a single lookup plus the memoized quote.\n *\n * @param prop The model property name as written in the builder.\n * @param names The node's property → column map, if any.\n * @returns The quoted database identifier.\n */\n protected columnId(prop: string, names: NameMap | undefined): string {\n return this.quoteId(names?.[prop] ?? prop);\n }\n\n /**\n * Render a {@link SqlExpression} inline, binding the parameters it carries.\n *\n * This is what keeps `set({ attempts: sql.raw(\"attempts + 1\") })` an expression\n * instead of a bound object: the fragment goes into the statement text, and\n * only a `sql.expr` template's interpolations become parameters.\n *\n * @param expr The branded expression.\n * @param params The parameter collector for the statement being compiled.\n * @returns The SQL text of the expression.\n */\n protected renderExpression(expr: SqlExpression, params: Params): string {\n const token = expr.expression;\n if (typeof token === \"string\") return renderPortableToken(token, this.name);\n if (\"raw\" in token) return token.raw;\n const parts = token.parts;\n let sql = parts[0] ?? \"\";\n for (let i = 1; i < parts.length; i++) {\n sql += `${params.bind(expr.params[i - 1])}${parts[i]}`;\n }\n return sql;\n }\n\n /** Render one write value: a SQL expression inline, anything else as a parameter. */\n protected renderValue(value: unknown, params: Params): string {\n return isSqlExpression(value)\n ? this.renderExpression(value, params)\n : params.bind(value);\n }\n\n /**\n * Render a row-level locking clause (`FOR UPDATE ...`).\n *\n * Standard on PostgreSQL and MySQL 8.0+; SQLite overrides it to throw.\n *\n * @param lock The locking clause from the node.\n * @returns The SQL text, leading space included.\n */\n protected renderLock(lock: LockClause): string {\n const strength = lock.strength === \"update\" ? \"FOR UPDATE\" : \"FOR SHARE\";\n const of =\n lock.of.length > 0 ? ` OF ${lock.of.map((t) => this.quoteId(t)).join(\", \")}` : \"\";\n const wait =\n lock.wait === \"skipLocked\"\n ? \" SKIP LOCKED\"\n : lock.wait === \"noWait\"\n ? \" NOWAIT\"\n : \"\";\n return ` ${strength}${of}${wait}`;\n }\n\n // ---- statements -------------------------------------------------------\n\n /**\n * Compile a SELECT.\n *\n * Two alias rules differ between clauses and are handled here: PostgreSQL does\n * NOT accept a `SELECT` alias in `HAVING`, so an aggregate key is re-emitted as\n * its expression (`COUNT(*) > $1`), a form every dialect accepts; `ORDER BY`,\n * by contrast, accepts the output alias everywhere, so it is emitted as\n * written.\n *\n * @param node The select AST.\n * @param params The parameter collector.\n * @returns The SQL text.\n */\n private compileSelect(node: SelectNode, params: Params): string {\n const names = node.names;\n let cols: string;\n if (node.aggregates.length > 0) {\n // Grouped/aggregate query: SELECT group cols + `FN(col) AS \"alias\"`.\n const groupSel = node.groupBy.map((c) => this.columnId(c, names));\n const aggSel = node.aggregates.map((a) => {\n const inner = a.column === \"*\" ? \"*\" : this.columnId(a.column, names);\n return `${a.fn.toUpperCase()}(${inner}) AS ${this.quoteId(a.alias)}`;\n });\n cols = [...groupSel, ...aggSel].join(\", \");\n } else {\n cols =\n node.columns === \"*\"\n ? \"*\"\n : node.columns.map((c) => this.columnId(c, names)).join(\", \");\n }\n let sql = `SELECT ${node.distinct ? \"DISTINCT \" : \"\"}${cols} FROM ${this.quoteId(node.table)}`;\n\n const where = this.compileCondition(node.where, params, (k) =>\n this.columnId(k, names),\n );\n if (where) sql += ` WHERE ${where}`;\n\n if (node.groupBy.length > 0) {\n sql += ` GROUP BY ${node.groupBy.map((c) => this.columnId(c, names)).join(\", \")}`;\n }\n\n const aggByAlias = new Map(node.aggregates.map((a) => [a.alias, a]));\n\n if (node.having) {\n const having = this.compileCondition(node.having, params, (key) => {\n const agg = aggByAlias.get(key);\n if (!agg) return this.columnId(key, names);\n const inner = agg.column === \"*\" ? \"*\" : this.columnId(agg.column, names);\n return `${agg.fn.toUpperCase()}(${inner})`;\n });\n if (having) sql += ` HAVING ${having}`;\n }\n\n if (node.orderBy.length > 0) {\n const terms = node.orderBy\n .map((t) => {\n const id = aggByAlias.has(t.column)\n ? this.quoteId(t.column)\n : this.columnId(t.column, names);\n return `${id} ${t.direction === \"desc\" ? \"DESC\" : \"ASC\"}`;\n })\n .join(\", \");\n sql += ` ORDER BY ${terms}`;\n }\n if (node.limit !== undefined) sql += ` LIMIT ${params.bind(node.limit)}`;\n if (node.offset !== undefined) sql += ` OFFSET ${params.bind(node.offset)}`;\n if (node.lock) {\n if (node.distinct || node.groupBy.length > 0 || node.aggregates.length > 0) {\n throw new Error(\n \"FOR UPDATE / FOR SHARE cannot be combined with DISTINCT or an aggregate query — lock the underlying rows in a separate SELECT.\",\n );\n }\n sql += this.renderLock(node.lock);\n }\n return sql;\n }\n\n /**\n * Compile an INSERT.\n *\n * Takes the cached fast path only when the statement text is a pure function of\n * its structure. A SQL expression among the values, or a conflict predicate,\n * makes the text depend on the values themselves — those compile uncached, in\n * SQL order, so placeholder positions stay correct.\n */\n private compileInsert(node: InsertNode, params: Params): string {\n const columns = insertColumns(node.values);\n const conflict = node.onConflict;\n const cacheable =\n conflict?.targetWhere === undefined &&\n conflict?.updateWhere === undefined &&\n !insertHasExpression(node);\n if (!cacheable) return this.compileInsertDirect(node, columns, params);\n\n // Bind every value in row-major, column order. The SQL text is independent of\n // the values (a null becomes a placeholder like any other), so it depends only\n // on the structure — which lets us cache the template below.\n for (const row of node.values) {\n for (const c of columns) params.bind((row as Record<string, unknown>)[c] ?? null);\n }\n // ON CONFLICT DO UPDATE binds its SET values after the row values, in key order.\n const conflictCols =\n conflict && conflict.update !== \"nothing\" ? Object.keys(conflict.update) : [];\n for (const c of conflictCols) {\n params.bind((conflict?.update as Record<string, unknown>)[c]);\n }\n return this.insertTemplate(node, columns, conflictCols, params);\n }\n\n /**\n * Compile an INSERT without the template cache, rendering clauses in statement\n * order so every parameter is bound at the position it appears.\n *\n * @param node The insert node.\n * @param columns The column keys shared by every row.\n * @param params The parameter collector.\n * @returns The SQL text.\n */\n private compileInsertDirect(\n node: InsertNode,\n columns: readonly string[],\n params: Params,\n ): string {\n const names = node.names;\n const colSql = columns.map((c) => this.columnId(c, names)).join(\", \");\n const rowsSql = node.values\n .map((row) => {\n const cells = columns.map((c) =>\n this.renderValue((row as Record<string, unknown>)[c] ?? null, params),\n );\n return `(${cells.join(\", \")})`;\n })\n .join(\", \");\n let sql = `INSERT INTO ${this.quoteId(node.table)} (${colSql}) VALUES ${rowsSql}`;\n if (node.onConflict) {\n const update = node.onConflict.update;\n const conflictCols = update === \"nothing\" ? [] : Object.keys(update);\n let cursor = 0;\n sql += this.renderConflict(\n node.onConflict,\n conflictCols,\n () => {\n const key = conflictCols[cursor++] as string;\n return this.renderValue((update as Record<string, unknown>)[key], params);\n },\n names,\n params,\n );\n }\n sql += this.compileReturning(node.returning, names);\n return sql;\n }\n\n /**\n * The INSERT SQL template for a given structure, cached across calls.\n *\n * The text depends only on (dialect, table, columns, row count, returning,\n * conflict shape) — never on the bound values — and placeholder positions are\n * deterministic from the counts (a fresh statement always starts binding at 1).\n * So a per-row insert loop compiles the string once and reuses it every row.\n */\n private insertTemplate(\n node: InsertNode,\n columns: readonly string[],\n conflictCols: readonly string[],\n params: Params,\n ): string {\n const returningKey =\n node.returning === null\n ? \"\"\n : node.returning === \"*\"\n ? \"*\"\n : node.returning.join(\",\");\n const conflictKey = node.onConflict\n ? `${node.onConflict.target.join(\",\")}>${node.onConflict.update === \"nothing\" ? \"nothing\" : conflictCols.join(\",\")}`\n : \"\";\n const key = `${this.name}|${node.table}|${columns.join(\",\")}|${node.values.length}|${returningKey}|${conflictKey}`;\n const cached = BaseDialect.insertTemplates.get(key);\n if (cached !== undefined) return cached;\n\n const names = node.names;\n const colSql = columns.map((c) => this.columnId(c, names)).join(\", \");\n let position = 0;\n const rowsSql = node.values\n .map(() => `(${columns.map(() => this.placeholder(++position)).join(\", \")})`)\n .join(\", \");\n let sql = `INSERT INTO ${this.quoteId(node.table)} (${colSql}) VALUES ${rowsSql}`;\n if (node.onConflict) {\n sql += this.renderConflict(\n node.onConflict,\n conflictCols,\n () => this.placeholder(++position),\n names,\n params,\n );\n }\n sql += this.compileReturning(node.returning, names);\n BaseDialect.insertTemplates.set(key, sql);\n return sql;\n }\n\n /**\n * Render the conflict-handling clause. Standard SQL (SQLite/PostgreSQL) uses\n * `ON CONFLICT (...) [WHERE predicate] DO NOTHING | DO UPDATE SET ... [WHERE ...]`;\n * MySQL overrides this.\n *\n * The index predicate is rendered before the `DO UPDATE` assignments because\n * that is where it sits in the statement, so its parameters bind first.\n *\n * @param onConflict The conflict clause from the node.\n * @param conflictCols The columns to overwrite on `DO UPDATE` (empty for nothing).\n * @param nextValue Yields the SQL for the next `DO UPDATE` assignment value.\n * @param names The node's property → column map, if any.\n * @param params The parameter collector, for the predicates.\n * @returns The SQL text, leading space included.\n */\n protected renderConflict(\n onConflict: NonNullable<InsertNode[\"onConflict\"]>,\n conflictCols: readonly string[],\n nextValue: () => string,\n names: NameMap | undefined,\n params: Params,\n ): string {\n const idFor = (key: string): string => this.columnId(key, names);\n const target = onConflict.target.map(idFor).join(\", \");\n const indexWhere = this.compileCondition(onConflict.targetWhere, params, idFor);\n const targetSql = indexWhere ? `(${target}) WHERE ${indexWhere}` : `(${target})`;\n if (onConflict.update === \"nothing\") return ` ON CONFLICT ${targetSql} DO NOTHING`;\n const assignments = conflictCols\n .map((c) => `${idFor(c)} = ${nextValue()}`)\n .join(\", \");\n let sql = ` ON CONFLICT ${targetSql} DO UPDATE SET ${assignments}`;\n const updateWhere = this.compileCondition(onConflict.updateWhere, params, idFor);\n if (updateWhere) sql += ` WHERE ${updateWhere}`;\n return sql;\n }\n\n private compileUpdate(node: UpdateNode, params: Params): string {\n const names = node.names;\n const sets = Object.entries(node.set)\n .map(\n ([col, value]) =>\n `${this.columnId(col, names)} = ${this.renderValue(value, params)}`,\n )\n .join(\", \");\n let sql = `UPDATE ${this.quoteId(node.table)} SET ${sets}`;\n const where = this.compileCondition(node.where, params, (k) =>\n this.columnId(k, names),\n );\n if (where) sql += ` WHERE ${where}`;\n sql += this.compileReturning(node.returning, names);\n return sql;\n }\n\n private compileDelete(node: DeleteNode, params: Params): string {\n const names = node.names;\n let sql = `DELETE FROM ${this.quoteId(node.table)}`;\n const where = this.compileCondition(node.where, params, (k) =>\n this.columnId(k, names),\n );\n if (where) sql += ` WHERE ${where}`;\n sql += this.compileReturning(node.returning, names);\n return sql;\n }\n\n private compileJoin(node: JoinNode, params: Params): string {\n const names = node.names;\n const cols = node.selections\n .map((s) => {\n const ref = `${s.alias}.${s.column}`;\n return `${this.qualify(ref, names)} AS ${this.quoteId(ref)}`;\n })\n .join(\", \");\n let sql = `SELECT ${cols} FROM ${this.quoteId(node.base.table)} AS ${this.quoteId(node.base.alias)}`;\n for (const j of node.joins) {\n const kw = j.kind === \"left\" ? \"LEFT JOIN\" : \"INNER JOIN\";\n const on = j.on\n .map(([l, r]) => `${this.qualify(l, names)} = ${this.qualify(r, names)}`)\n .join(\" AND \");\n sql += ` ${kw} ${this.quoteId(j.table)} AS ${this.quoteId(j.alias)} ON ${on}`;\n }\n const where = this.compileCondition(node.where, params, (k) =>\n this.qualify(k, names),\n );\n if (where) sql += ` WHERE ${where}`;\n if (node.orderBy.length > 0) {\n const terms = node.orderBy\n .map(\n (t) =>\n `${this.qualify(t.ref, names)} ${t.direction === \"desc\" ? \"DESC\" : \"ASC\"}`,\n )\n .join(\", \");\n sql += ` ORDER BY ${terms}`;\n }\n if (node.limit !== undefined) sql += ` LIMIT ${params.bind(node.limit)}`;\n if (node.offset !== undefined) sql += ` OFFSET ${params.bind(node.offset)}`;\n return sql;\n }\n\n // ---- clauses ----------------------------------------------------------\n\n protected compileReturning(\n returning: readonly string[] | \"*\" | null,\n names?: NameMap | undefined,\n ): string {\n if (returning === null) return \"\";\n if (returning === \"*\") return \" RETURNING *\";\n return ` RETURNING ${returning.map((c) => this.columnId(c, names)).join(\", \")}`;\n }\n\n /**\n * Compile a condition tree (fields / and / or / not) to SQL. `idFor` renders a\n * key to a quoted identifier — `quoteId` for single-table, `qualify` for joins —\n * so select/update/delete/join all share this one compiler.\n */\n private compileCondition(\n node: CondNode | undefined,\n params: Params,\n idFor: (key: string) => string,\n ): string {\n if (!node) return \"\";\n switch (node.kind) {\n case \"fields\": {\n const conditions: string[] = [];\n for (const [key, value] of Object.entries(node.fields)) {\n const id = idFor(key);\n if (isOperatorObject(value)) {\n for (const [op, operand] of Object.entries(value)) {\n conditions.push(this.compileOperator(id, op, operand, params));\n }\n } else {\n // bare value → equality (null → IS NULL)\n conditions.push(\n value === null ? `${id} IS NULL` : `${id} = ${params.bind(value)}`,\n );\n }\n }\n return conditions.join(\" AND \");\n }\n case \"and\":\n case \"or\": {\n const parts = node.parts\n .map((p) => this.compileCondition(p, params, idFor))\n .filter((s) => s.length > 0);\n if (parts.length === 0) return \"\";\n const sep = node.kind === \"and\" ? \" AND \" : \" OR \";\n return parts.map((p) => `(${p})`).join(sep);\n }\n case \"not\": {\n const inner = this.compileCondition(node.part, params, idFor);\n return inner ? `NOT (${inner})` : \"\";\n }\n case \"compare\": {\n const left = this.renderExpr(node.left, params, idFor);\n if (node.right.kind === \"value\") {\n return this.compileOperator(left, node.op, node.right.value, params);\n }\n return this.compileExprOperator(\n left,\n node.op,\n this.renderExpr(node.right, params, idFor),\n );\n }\n }\n }\n\n /**\n * Render one side of a comparison.\n *\n * A column reference goes through `idFor`, so an explicit `.name()` mapping and\n * join qualification apply here exactly as they do in the object form of\n * `where` — `col()` is not a way around them. Only a `value` node binds.\n *\n * @param node The expression AST.\n * @param params The parameter collector.\n * @param idFor The identifier resolver for the enclosing statement.\n * @returns The SQL text of the expression.\n */\n private renderExpr(\n node: ExprNode,\n params: Params,\n idFor: (key: string) => string,\n ): string {\n switch (node.kind) {\n case \"column\":\n return idFor(node.name);\n case \"value\":\n return params.bind(node.value);\n case \"fn\": {\n const args = node.args.map((a) => this.renderExpr(a, params, idFor)).join(\", \");\n return `${node.name}(${args})`;\n }\n }\n }\n\n /**\n * Compile a comparison whose right-hand side is another expression rather than\n * a bound value (`total > paid`, `lower(a) = lower(b)`).\n *\n * The list and null operators are excluded: `IN`, `BETWEEN` and `IS NULL` take\n * a value operand, and accepting an expression there would silently compile to\n * something else.\n *\n * @param left The rendered left-hand side.\n * @param op The operator name.\n * @param right The rendered right-hand side.\n * @returns The SQL text of the predicate.\n * @throws Error When the operator needs a value operand.\n */\n private compileExprOperator(left: string, op: string, right: string): string {\n switch (op) {\n case \"eq\":\n return `${left} = ${right}`;\n case \"ne\":\n return `${left} <> ${right}`;\n case \"gt\":\n return `${left} > ${right}`;\n case \"gte\":\n return `${left} >= ${right}`;\n case \"lt\":\n return `${left} < ${right}`;\n case \"lte\":\n return `${left} <= ${right}`;\n case \"like\":\n return `${left} LIKE ${right}`;\n case \"ilike\":\n return this.ilike(left, right);\n case \"ieq\":\n return `lower(${left}) = lower(${right})`;\n case \"contains\":\n case \"containedBy\":\n case \"overlaps\":\n return `${left} ${this.arrayOperator(op)} ${right}`;\n default:\n throw new Error(`The \"${op}\" operator takes a value operand, not an expression.`);\n }\n }\n\n private compileOperator(\n id: string,\n op: string,\n operand: unknown,\n params: Params,\n ): string {\n switch (op) {\n case \"eq\":\n return operand === null ? `${id} IS NULL` : `${id} = ${params.bind(operand)}`;\n case \"ne\":\n return operand === null\n ? `${id} IS NOT NULL`\n : `${id} <> ${params.bind(operand)}`;\n case \"gt\":\n return `${id} > ${params.bind(operand)}`;\n case \"gte\":\n return `${id} >= ${params.bind(operand)}`;\n case \"lt\":\n return `${id} < ${params.bind(operand)}`;\n case \"lte\":\n return `${id} <= ${params.bind(operand)}`;\n case \"like\":\n return `${id} LIKE ${params.bind(operand)}`;\n case \"ilike\":\n return this.ilike(id, params.bind(operand));\n case \"ieq\":\n return operand === null\n ? `${id} IS NULL`\n : `lower(${id}) = lower(${params.bind(operand)})`;\n case \"contains\":\n return `${id} ${this.arrayOperator(\"contains\")} ${params.bind(operand)}`;\n case \"containedBy\":\n return `${id} ${this.arrayOperator(\"containedBy\")} ${params.bind(operand)}`;\n case \"overlaps\":\n return `${id} ${this.arrayOperator(\"overlaps\")} ${params.bind(operand)}`;\n case \"in\":\n return this.compileIn(id, operand, params, false);\n case \"notIn\":\n return this.compileIn(id, operand, params, true);\n case \"between\": {\n const [lo, hi] = operand as readonly [unknown, unknown];\n return `${id} BETWEEN ${params.bind(lo)} AND ${params.bind(hi)}`;\n }\n case \"isNull\":\n return operand ? `${id} IS NULL` : `${id} IS NOT NULL`;\n default:\n throw new Error(`Unknown operator ${JSON.stringify(op)}`);\n }\n }\n\n /**\n * Compile `IN` / `NOT IN`, whose operand is either a value list or a\n * single-column subquery.\n *\n * The subquery is rendered at the position it appears in the outer statement\n * and shares the same parameter collector, so its own placeholders land in the\n * right order — and it keeps its own `names` map, since the inner model may use\n * a different naming convention than the outer one.\n *\n * @param id The quoted column identifier being tested.\n * @param operand A list of values, or a {@link Subquery}.\n * @param params The parameter collector for the statement being compiled.\n * @param negate True for `NOT IN`.\n * @returns The SQL text of the predicate.\n */\n private compileIn(\n id: string,\n operand: unknown,\n params: Params,\n negate: boolean,\n ): string {\n const keyword = negate ? \"NOT IN\" : \"IN\";\n if (isSubquery(operand)) {\n this.checkSubquery(operand.node);\n return `${id} ${keyword} (${this.compileSelect(operand.node, params)})`;\n }\n const values = operand as readonly unknown[];\n if (values.length === 0) {\n // empty IN matches nothing; empty NOT IN matches everything\n return negate ? \"1 = 1\" : \"1 = 0\";\n }\n const list = values.map((v) => params.bind(v)).join(\", \");\n return `${id} ${keyword} (${list})`;\n }\n}\n\n/** SQLite dialect: `?` placeholders; `ILIKE` falls back to `LIKE` (ASCII-insensitive). */\nexport class SqliteDialect extends BaseDialect {\n readonly name = \"sqlite\" as const;\n\n protected placeholder(): string {\n return \"?\";\n }\n\n protected ilike(column: string, param: string): string {\n return `${column} LIKE ${param}`;\n }\n\n /**\n * SQLite has no row-level locking, so a lock request is an error rather than a\n * silently unlocked `SELECT` — a lock that does not exist only shows up as\n * duplicated work under production concurrency.\n */\n protected override renderLock(): string {\n throw new Error(\n \"SQLite has no row-level locking — FOR UPDATE / FOR SHARE is unsupported. Serialize the claim inside a transaction instead.\",\n );\n }\n}\n\n/** PostgreSQL dialect: `$1` placeholders; native `ILIKE`; native array operators. */\nexport class PostgresDialect extends BaseDialect {\n readonly name = \"postgresql\" as const;\n\n protected placeholder(index: number): string {\n return `$${index}`;\n }\n\n protected ilike(column: string, param: string): string {\n return `${column} ILIKE ${param}`;\n }\n\n protected override arrayOperator(op: \"contains\" | \"containedBy\" | \"overlaps\"): string {\n if (op === \"contains\") return \"@>\";\n if (op === \"containedBy\") return \"<@\";\n return \"&&\";\n }\n}\n\n/** Backtick-quoted identifier cache for MySQL (its quoting differs from the base). */\nconst mysqlQuotedIds = new Map<string, string>();\n\n/**\n * MySQL dialect: `?` placeholders, backtick identifiers, `ON DUPLICATE KEY\n * UPDATE` for upsert, and case-insensitive `LIKE` (default collation). MySQL has\n * no `RETURNING`, so requesting it throws.\n */\nexport class MysqlDialect extends BaseDialect {\n readonly name = \"mysql\" as const;\n\n protected placeholder(): string {\n return \"?\";\n }\n\n protected ilike(column: string, param: string): string {\n return `${column} LIKE ${param}`; // MySQL LIKE is case-insensitive by default\n }\n\n protected override quoteId(name: string): string {\n const cached = mysqlQuotedIds.get(name);\n if (cached !== undefined) return cached;\n const quoted = `\\`${name.replace(/`/g, \"``\")}\\``;\n mysqlQuotedIds.set(name, quoted);\n return quoted;\n }\n\n /**\n * MySQL rejects `LIMIT` inside an `IN` subquery with\n * `ER_NOT_SUPPORTED_YET: This version of MySQL doesn't yet support\n * 'LIMIT & IN/ALL/ANY/SOME subquery'`. Failing at compile time names the fix\n * instead of surfacing that error from the driver at runtime.\n */\n protected override checkSubquery(node: SelectNode): void {\n if (node.limit !== undefined || node.offset !== undefined) {\n throw new Error(\n \"MySQL does not support LIMIT/OFFSET inside an IN subquery. Select the ids first and pass them as a list, or wrap the subquery in a derived table.\",\n );\n }\n }\n\n protected override renderConflict(\n onConflict: NonNullable<InsertNode[\"onConflict\"]>,\n conflictCols: readonly string[],\n nextValue: () => string,\n names: NameMap | undefined,\n ): string {\n if (onConflict.targetWhere || onConflict.updateWhere) {\n throw new Error(\n \"MySQL's ON DUPLICATE KEY UPDATE has no conflict-target predicate — a partial unique index is PostgreSQL/SQLite only.\",\n );\n }\n if (onConflict.update === \"nothing\") {\n // MySQL has no DO NOTHING; a no-op self-assignment on a target column is\n // the idiomatic equivalent (keeps the existing row untouched).\n const col = this.columnId(onConflict.target[0] ?? \"id\", names);\n return ` ON DUPLICATE KEY UPDATE ${col} = ${col}`;\n }\n const assignments = conflictCols\n .map((c) => `${this.columnId(c, names)} = ${nextValue()}`)\n .join(\", \");\n return ` ON DUPLICATE KEY UPDATE ${assignments}`;\n }\n\n /**\n * MySQL has no `RETURNING`, so it cannot be compiled into a statement.\n *\n * `session.execute()` still honors `.returning()` on a **single-row INSERT** by\n * running the insert and reading the row back by key on the same connection —\n * that is execution, not compilation, so it never reaches here. Compiling a\n * node with `returning` directly is an error, rather than SQL that silently\n * returns nothing.\n */\n protected override compileReturning(returning: readonly string[] | \"*\" | null): string {\n if (returning === null) return \"\";\n throw new Error(\n \"RETURNING cannot be compiled for MySQL. session.execute() reads a single-row INSERT back by key (LAST_INSERT_ID()); UPDATE/DELETE have no equivalent — run a SELECT yourself.\",\n );\n }\n}\n\n/** Get a dialect instance by name. */\nexport function getDialect(name: Dialect): BaseDialect {\n switch (name) {\n case \"sqlite\":\n return new SqliteDialect();\n case \"postgresql\":\n return new PostgresDialect();\n case \"mysql\":\n return new MysqlDialect();\n }\n}\n","/**\n * tempest-db-js — Phase 5: typed joins with composite result types.\n *\n * `join(User, \"user\").innerJoin(Order, \"order\", { \"user.id\": \"order.userId\" })`\n * yields rows shaped `{ user: UserRow; order: OrderRow }`. A `leftJoin` makes the\n * joined side nullable (`OrderRow | null`), matching SQL outer-join semantics.\n *\n * Columns are aliased in SQL (`\"user\".\"id\" AS \"user.id\"`) so a flat driver row is\n * split back into one nested object per source, each coerced by its model.\n */\n\nimport { type CondNode, type Condition, toCondNode } from \"./conditions.js\";\nimport {\n type InferModel,\n type ModelClass,\n type NameMap,\n columnNamesOf,\n columnsOf,\n} from \"./index.js\";\nimport type { OperatorsFor, SortDirection } from \"./query.js\";\n\n// ---------------------------------------------------------------------------\n// AST\n// ---------------------------------------------------------------------------\n\n/** One joined table. */\nexport interface JoinClause {\n readonly kind: \"inner\" | \"left\";\n readonly table: string;\n readonly alias: string;\n /** Equality pairs of qualified columns: `[\"user.id\", \"order.userId\"]`. */\n readonly on: readonly (readonly [string, string])[];\n}\n\n/** A selected column, qualified by source alias. */\nexport interface JoinSelection {\n readonly alias: string;\n readonly column: string;\n}\n\n/** Collapse a union of object types into their intersection. */\ntype UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never;\n\n/**\n * `where` filter for a join. Keys are `alias.column` refs; each value accepts a\n * bare value (shorthand for `eq`) or an operator object restricted to the\n * operators valid for that column's type — exactly like the single-table\n * {@link WhereInput}, but qualified per source. `like` on a numeric join column,\n * or `gt` on a string one, is a compile error.\n */\nexport type JoinWhereInput<S extends Sources> = Partial<\n UnionToIntersection<\n {\n [A in keyof S]: {\n [C in keyof NonNullable<S[A]> & string as `${A & string}.${C}`]:\n | NonNullable<S[A]>[C]\n | OperatorsFor<NonNullable<NonNullable<S[A]>[C]>>;\n };\n }[keyof S]\n >\n>;\n\n/** Serializable AST for a multi-table SELECT. */\nexport interface JoinNode {\n readonly kind: \"join_select\";\n readonly base: { readonly table: string; readonly alias: string };\n readonly joins: readonly JoinClause[];\n readonly selections: readonly JoinSelection[];\n readonly where: CondNode | undefined;\n readonly orderBy: readonly {\n readonly ref: string;\n readonly direction: SortDirection;\n }[];\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n /** Per-alias property → column maps, for the sources that rename columns. */\n readonly names?: Readonly<Record<string, NameMap>> | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// type helpers\n// ---------------------------------------------------------------------------\n\n/** A map of source alias → its (possibly nullable) row type. */\nexport type Sources = Record<string, object | null>;\n\n/** Every `alias.column` reference across the current sources. */\nexport type ColRef<S extends Sources> = {\n [A in keyof S]: `${A & string}.${keyof NonNullable<S[A]> & string}`;\n}[keyof S];\n\n/** Valid `alias.column` references for a newly joined model. */\ntype RightRef<\n A extends string,\n C extends ModelClass,\n> = `${A}.${keyof InferModel<C> & string}`;\n\n/** The `on` condition: map existing-source refs to new-table refs (equality). */\nexport type JoinOn<S extends Sources, A extends string, C extends ModelClass> = Partial<\n Record<ColRef<S>, RightRef<A, C>>\n>;\n\n// ---------------------------------------------------------------------------\n// builder\n// ---------------------------------------------------------------------------\n\n/** Build the qualified selection list for a model under an alias. */\nfunction selectionsFor(alias: string, model: ModelClass): JoinSelection[] {\n return Object.keys(columnsOf(model)).map((column) => ({ alias, column }));\n}\n\n/**\n * Register a source's property → column map under its alias, or keep the node\n * map untouched when the model renames nothing.\n *\n * @param current The node's existing per-alias maps.\n * @param alias The alias the model is joined under.\n * @param model The joined model.\n * @returns The updated map, or `undefined` when no source renames anything.\n */\nfunction withAliasNames(\n current: Readonly<Record<string, NameMap>> | undefined,\n alias: string,\n model: ModelClass,\n): Readonly<Record<string, NameMap>> | undefined {\n const names = columnNamesOf(model);\n if (!names) return current;\n return { ...(current ?? {}), [alias]: names };\n}\n\n/**\n * Immutable, chainable multi-table SELECT builder.\n *\n * @typeParam S - the accumulated sources (alias → row type; nullable for left joins).\n */\nexport class JoinBuilder<S extends Sources> {\n /** Phantom: the composite result row type. */\n declare readonly __row: { [A in keyof S]: S[A] };\n\n constructor(\n readonly node: JoinNode,\n /** Source models keyed by alias, for SQL expansion and row coercion. */\n readonly sources: Readonly<Record<string, ModelClass>>,\n ) {}\n\n private add<S2 extends Sources>(\n clause: JoinClause,\n model: ModelClass,\n ): JoinBuilder<S2> {\n return new JoinBuilder<S2>(\n {\n ...this.node,\n joins: [...this.node.joins, clause],\n selections: [...this.node.selections, ...selectionsFor(clause.alias, model)],\n names: withAliasNames(this.node.names, clause.alias, model),\n },\n { ...this.sources, [clause.alias]: model },\n );\n }\n\n private clause(\n kind: \"inner\" | \"left\",\n model: ModelClass,\n alias: string,\n on: Record<string, string>,\n ): JoinClause {\n return {\n kind,\n table: model.tablename,\n alias,\n on: Object.entries(on) as [string, string][],\n };\n }\n\n /** Inner join another model under `alias`. */\n innerJoin<C extends ModelClass, A extends string>(\n model: C,\n alias: A,\n on: JoinOn<S, A, C>,\n ): JoinBuilder<S & { [K in A]: InferModel<C> }> {\n return this.add(\n this.clause(\"inner\", model, alias, on as Record<string, string>),\n model,\n );\n }\n\n /** Left (outer) join another model under `alias` — its side becomes nullable. */\n leftJoin<C extends ModelClass, A extends string>(\n model: C,\n alias: A,\n on: JoinOn<S, A, C>,\n ): JoinBuilder<S & { [K in A]: InferModel<C> | null }> {\n return this.add(\n this.clause(\"left\", model, alias, on as Record<string, string>),\n model,\n );\n }\n\n /** Filter by `alias.column` references (object form) or an `and`/`or`/`not`. */\n where(input: JoinWhereInput<S> | Condition): JoinBuilder<S> {\n return new JoinBuilder<S>(\n { ...this.node, where: toCondNode(input as Record<string, unknown>) },\n this.sources,\n );\n }\n\n /** Order by an `alias.column` reference. */\n orderBy(ref: ColRef<S>, direction: SortDirection = \"asc\"): JoinBuilder<S> {\n return new JoinBuilder<S>(\n {\n ...this.node,\n orderBy: [...this.node.orderBy, { ref: ref as string, direction }],\n },\n this.sources,\n );\n }\n\n limit(n: number): JoinBuilder<S> {\n return new JoinBuilder<S>({ ...this.node, limit: n }, this.sources);\n }\n\n offset(n: number): JoinBuilder<S> {\n return new JoinBuilder<S>({ ...this.node, offset: n }, this.sources);\n }\n}\n\n// ---------------------------------------------------------------------------\n// entrypoint\n// ---------------------------------------------------------------------------\n\n/**\n * Start a multi-table query from a base model under `alias`.\n *\n * @param model The base model.\n * @param alias The alias to key the base table's rows under in the result.\n * @returns A `JoinBuilder` with the base source registered.\n */\nexport function join<C extends ModelClass, A extends string>(\n model: C,\n alias: A,\n): JoinBuilder<{ [K in A]: InferModel<C> }> {\n return new JoinBuilder(\n {\n kind: \"join_select\",\n base: { table: model.tablename, alias },\n joins: [],\n selections: selectionsFor(alias, model),\n where: undefined,\n orderBy: [],\n limit: undefined,\n offset: undefined,\n names: withAliasNames(undefined, alias, model),\n },\n { [alias]: model },\n );\n}\n","/**\n * tempest-db-js — Phase 7: typed repository + pagination.\n *\n * `BaseRepository<Model>` mirrors the `tempest-fastapi-sdk` repository: a thin,\n * fully-typed CRUD + pagination layer over a model and an async session. The\n * 404-convention is honored — `getById` throws when absent, collection methods\n * return `[]` (never a \"not found\" error for an empty list).\n */\n\nimport type { AsyncSession } from \"./engine.js\";\nimport {\n type InferInsert,\n type InferModel,\n type ModelClass,\n type WhereInput,\n columnsOf,\n del,\n insert,\n select,\n update,\n} from \"./index.js\";\n\n/** Pagination request — 1-indexed page. */\nexport interface PaginationFilter<Row> {\n readonly page?: number;\n readonly pageSize?: number;\n readonly orderBy?: keyof Row & string;\n readonly ascending?: boolean;\n readonly filters?: WhereInput<Row>;\n}\n\n/** A page of results plus metadata (mirrors `BasePaginationSchema`). */\nexport interface PaginationResult<Row> {\n readonly items: Row[];\n readonly total: number;\n readonly page: number;\n readonly pageSize: number;\n readonly pages: number;\n}\n\n/** Raised by single-record lookups (`getById`) when nothing matches (404). */\nexport class RecordNotFound extends Error {\n constructor(table: string, id: unknown) {\n super(`${table} not found for id ${JSON.stringify(id)}`);\n this.name = \"RecordNotFound\";\n }\n}\n\n/** Find the single primary-key column name of a model. */\nfunction primaryKeyOf(model: ModelClass): string {\n for (const [name, col] of Object.entries(columnsOf(model))) {\n if (col.flags.primaryKey) return name;\n }\n throw new Error(`${model.tablename} has no primary key`);\n}\n\n/**\n * A fully-typed CRUD + pagination repository over a model and an async session.\n *\n * @typeParam C - the model class.\n */\nexport class BaseRepository<C extends ModelClass> {\n private readonly pk: string;\n\n constructor(\n protected readonly model: C,\n protected readonly session: AsyncSession,\n ) {\n this.pk = primaryKeyOf(model);\n }\n\n /** All rows matching `filters` (or everything). Empty list when none match. */\n async list(filters?: WhereInput<InferModel<C>>): Promise<InferModel<C>[]> {\n const query = filters ? select(this.model).where(filters) : select(this.model);\n return this.session.execute(query).all();\n }\n\n /** The first row matching `filters`, or `null`. */\n async first(filters?: WhereInput<InferModel<C>>): Promise<InferModel<C> | null> {\n const query = filters ? select(this.model).where(filters) : select(this.model);\n return this.session.execute(query).first();\n }\n\n /** A single row by primary key, or `null`. */\n async getByIdOrNull(id: unknown): Promise<InferModel<C> | null> {\n return this.session\n .execute(select(this.model).where({ [this.pk]: id } as WhereInput<InferModel<C>>))\n .first();\n }\n\n /** A single row by primary key; throws `RecordNotFound` when absent. */\n async getById(id: unknown): Promise<InferModel<C>> {\n const row = await this.getByIdOrNull(id);\n if (row === null) throw new RecordNotFound(this.model.tablename, id);\n return row;\n }\n\n /** Whether any row matches `filters`. */\n async exists(filters: WhereInput<InferModel<C>>): Promise<boolean> {\n return (await this.first(filters)) !== null;\n }\n\n /** How many rows match `filters` (or the whole table). */\n async count(filters?: WhereInput<InferModel<C>>): Promise<number> {\n const query = filters\n ? select(this.model, [this.pk as keyof InferModel<C> & string]).where(filters)\n : select(this.model, [this.pk as keyof InferModel<C> & string]);\n return (await this.session.execute(query).all()).length;\n }\n\n /** Insert one row, returning the created row. */\n async create(data: InferInsert<C>): Promise<InferModel<C>> {\n return this.session.execute(insert(this.model).values(data).returning()).one();\n }\n\n /** Insert many rows, returning the created rows. */\n async createMany(data: readonly InferInsert<C>[]): Promise<InferModel<C>[]> {\n if (data.length === 0) return [];\n return this.session.execute(insert(this.model).values(data).returning()).all();\n }\n\n /** Update rows matching `filters`; returns the number of rows affected. */\n async update(\n filters: WhereInput<InferModel<C>>,\n set: Partial<InferModel<C>>,\n ): Promise<number> {\n return this.session\n .execute(update(this.model).set(set).where(filters))\n .rowsAffected();\n }\n\n /** Delete rows matching `filters`; returns the number of rows affected. */\n async delete(filters: WhereInput<InferModel<C>>): Promise<number> {\n return this.session.execute(del(this.model).where(filters)).rowsAffected();\n }\n\n /**\n * A page of rows plus metadata. `total` counts all matching rows.\n *\n * @param filter Page, size, ordering and filters.\n * @returns The page and pagination metadata.\n */\n async paginate(\n filter: PaginationFilter<InferModel<C>> = {},\n ): Promise<PaginationResult<InferModel<C>>> {\n const page = Math.max(1, filter.page ?? 1);\n const pageSize = Math.max(1, filter.pageSize ?? 20);\n const where = filter.filters;\n\n let query = where ? select(this.model).where(where) : select(this.model);\n if (filter.orderBy) {\n query = query.orderBy(filter.orderBy, filter.ascending === false ? \"desc\" : \"asc\");\n }\n query = query.limit(pageSize).offset((page - 1) * pageSize);\n\n const items = await this.session.execute(query).all();\n const total = await this.count(where);\n return {\n items,\n total,\n page,\n pageSize,\n pages: Math.max(1, Math.ceil(total / pageSize)),\n };\n }\n}\n","/**\n * tempest-db-js — opt-in active-record layer.\n *\n * The library's default return shape is a plain inferred object (a locked design\n * decision — see the roadmap). This module adds an **opt-in** wrapper for code\n * that prefers instance methods: `ActiveRecord` holds the plain row on `.data`\n * and exposes `save` / `update` / `delete` / `reload` over an async session. It\n * never replaces the default plain-object return — you reach for it explicitly.\n */\n\nimport type { AsyncSession } from \"./engine.js\";\nimport {\n type InferInsert,\n type InferModel,\n type ModelClass,\n columnsOf,\n} from \"./index.js\";\nimport { insert } from \"./mutations.js\";\nimport { del, update } from \"./mutations.js\";\nimport { type WhereInput, select } from \"./query.js\";\n\n/** Find the single primary-key column name of a model. */\nfunction primaryKeyOf(model: ModelClass): string {\n for (const [name, col] of Object.entries(columnsOf(model))) {\n if (col.flags.primaryKey) return name;\n }\n throw new Error(`${model.tablename} has no primary key`);\n}\n\n/**\n * An opt-in active-record wrapper around a single row.\n *\n * The current field values live on {@link data} (a plain, typed row object).\n * Mutating methods persist through the bound session and refresh `data`.\n *\n * @typeParam C - the model class.\n */\nexport class ActiveRecord<C extends ModelClass> {\n private readonly pk: string;\n\n constructor(\n private readonly model: C,\n private readonly session: AsyncSession,\n /** The current field values (a plain, typed row). */\n public data: InferModel<C>,\n ) {\n this.pk = primaryKeyOf(model);\n }\n\n /** The primary-key value of the wrapped row. */\n private pkValue(): unknown {\n return (this.data as Record<string, unknown>)[this.pk];\n }\n\n private pkFilter(): WhereInput<InferModel<C>> {\n return { [this.pk]: this.pkValue() } as WhereInput<InferModel<C>>;\n }\n\n /**\n * Persist the current `data` — insert if new, otherwise overwrite the existing\n * row (upsert on the primary key). Refreshes `data` from the returned row.\n *\n * @returns This wrapper, for chaining.\n */\n async save(): Promise<this> {\n // Overwrite only the columns actually present in `data` (an absent column\n // would otherwise be set to null and could violate NOT NULL / clobber a\n // DB-side default).\n const cols = columnsOf(this.model);\n const rowData = this.data as Record<string, unknown>;\n const setPatch: Record<string, unknown> = {};\n for (const c of Object.keys(rowData)) {\n if (c !== this.pk && c in cols) setPatch[c] = rowData[c];\n }\n const saved = await this.session\n .execute(\n insert(this.model)\n .values(this.data as InferInsert<C>)\n .onConflictDoUpdate(\n [this.pk] as (keyof InferModel<C> & string)[],\n setPatch as Partial<InferModel<C>>,\n )\n .returning(),\n )\n .one();\n this.data = saved as InferModel<C>;\n return this;\n }\n\n /**\n * Update the given columns for this row and merge them into `data`.\n *\n * @param patch The columns to change.\n * @returns This wrapper, for chaining.\n */\n async update(patch: Partial<InferModel<C>>): Promise<this> {\n await this.session.execute(update(this.model).set(patch).where(this.pkFilter()));\n this.data = { ...this.data, ...patch };\n return this;\n }\n\n /**\n * Delete this row.\n *\n * @returns The number of rows affected (0 or 1).\n */\n async delete(): Promise<number> {\n return this.session.execute(del(this.model).where(this.pkFilter())).rowsAffected();\n }\n\n /**\n * Re-fetch this row by primary key and refresh `data`.\n *\n * @returns This wrapper, for chaining.\n * @throws When the row no longer exists.\n */\n async reload(): Promise<this> {\n const fresh = await this.session\n .execute(select(this.model).where(this.pkFilter()))\n .first();\n if (fresh === null) {\n throw new Error(\n `${this.model.tablename} row ${JSON.stringify(this.pkValue())} not found on reload`,\n );\n }\n this.data = fresh as InferModel<C>;\n return this;\n }\n}\n\n/** A small factory binding a model + session for producing {@link ActiveRecord}s. */\nexport interface ActiveRecordManager<C extends ModelClass> {\n /** Wrap an existing row (already loaded) as an active record. */\n wrap(row: InferModel<C>): ActiveRecord<C>;\n /** Build an unsaved active record from insert data; call `.save()` to persist. */\n create(data: InferInsert<C>): ActiveRecord<C>;\n /** Fetch a row by primary key and wrap it, or `null` if absent. */\n get(id: unknown): Promise<ActiveRecord<C> | null>;\n}\n\n/**\n * Create an {@link ActiveRecordManager} for a model over a session.\n *\n * @param model The model class.\n * @param session The async session to persist through.\n * @returns A manager that wraps/fetches rows as active records.\n *\n * @example\n * ```ts\n * const users = activeRecord(User, engine.session());\n * const u = users.create({ name: \"Ana\", age: 30 });\n * await u.save();\n * await u.update({ age: 31 });\n * await u.delete();\n * ```\n */\nexport function activeRecord<C extends ModelClass>(\n model: C,\n session: AsyncSession,\n): ActiveRecordManager<C> {\n const pk = primaryKeyOf(model);\n return {\n wrap: (row) => new ActiveRecord(model, session, row),\n create: (data) => new ActiveRecord(model, session, data as unknown as InferModel<C>),\n async get(id) {\n const row = await session\n .execute(select(model).where({ [pk]: id } as WhereInput<InferModel<C>>))\n .first();\n return row === null ? null : new ActiveRecord(model, session, row as InferModel<C>);\n },\n };\n}\n","/**\n * tempest-db-js — typed relations (hasMany / belongsTo) with eager loading.\n *\n * Relations are plain descriptors that reference another model plus the local /\n * foreign key. `loadRelations` fetches the related rows in **one query per\n * relation** (no N+1), groups them, and attaches them to the base rows — with\n * the result type widened so each relation key is typed (`Row[]` for hasMany,\n * `Row | null` for belongsTo).\n */\n\nimport type { AsyncSession } from \"./engine.js\";\nimport { type InferModel, type ModelClass, type WhereInput, select } from \"./index.js\";\n\n/** A one-to-many relation: each base row owns many target rows. */\nexport interface HasMany<C extends ModelClass> {\n readonly kind: \"hasMany\";\n readonly target: () => C;\n /** Column on the base row (usually its primary key). */\n readonly localKey: string;\n /** Column on the target row pointing back to the base row. */\n readonly foreignKey: string;\n}\n\n/** A many-to-one relation: each base row points to one target row. */\nexport interface BelongsTo<C extends ModelClass> {\n readonly kind: \"belongsTo\";\n readonly target: () => C;\n /** Column on the base row holding the foreign key. */\n readonly localKey: string;\n /** Column on the target row (usually its primary key). */\n readonly foreignKey: string;\n}\n\n/* biome-ignore lint/suspicious/noExplicitAny: a relation map mixes target models. */\nexport type Relation = HasMany<any> | BelongsTo<any>;\n\n/** Declare a one-to-many relation. */\nexport function hasMany<C extends ModelClass>(\n target: () => C,\n keys: { localKey: string; foreignKey: string },\n): HasMany<C> {\n return {\n kind: \"hasMany\",\n target,\n localKey: keys.localKey,\n foreignKey: keys.foreignKey,\n };\n}\n\n/** Declare a many-to-one relation. */\nexport function belongsTo<C extends ModelClass>(\n target: () => C,\n keys: { localKey: string; foreignKey: string },\n): BelongsTo<C> {\n return {\n kind: \"belongsTo\",\n target,\n localKey: keys.localKey,\n foreignKey: keys.foreignKey,\n };\n}\n\n/** The value a relation contributes to a loaded row. */\nexport type RelationValue<R> = R extends HasMany<infer C>\n ? InferModel<C>[]\n : R extends BelongsTo<infer C>\n ? InferModel<C> | null\n : never;\n\n/** A base row augmented with its loaded relations. */\nexport type WithRelations<Row, Spec extends Record<string, Relation>> = Row & {\n [K in keyof Spec]: RelationValue<Spec[K]>;\n};\n\n/**\n * Eager-load relations onto a set of base rows. One query per relation.\n *\n * @param session The async session to query through.\n * @param rows The already-loaded base rows.\n * @param spec A map of relation name → relation descriptor.\n * @returns The base rows, each augmented with its relation values.\n */\nexport async function loadRelations<\n Row extends Record<string, unknown>,\n Spec extends Record<string, Relation>,\n>(session: AsyncSession, rows: Row[], spec: Spec): Promise<WithRelations<Row, Spec>[]> {\n const out = rows.map((r) => ({ ...r })) as Record<string, unknown>[];\n\n for (const [name, rel] of Object.entries(spec)) {\n const target = rel.target();\n const localValues = [...new Set(rows.map((r) => r[rel.localKey]))];\n const related =\n localValues.length > 0\n ? await session\n .execute(\n select(target).where({\n [rel.foreignKey]: { in: localValues },\n } as WhereInput<InferModel<typeof target>>),\n )\n .all()\n : [];\n\n if (rel.kind === \"hasMany\") {\n const grouped = new Map<unknown, Record<string, unknown>[]>();\n for (const row of related as Record<string, unknown>[]) {\n const key = row[rel.foreignKey];\n const list = grouped.get(key) ?? [];\n list.push(row);\n grouped.set(key, list);\n }\n out.forEach((r, i) => {\n r[name] = grouped.get(rows[i]?.[rel.localKey]) ?? [];\n });\n } else {\n const byKey = new Map<unknown, Record<string, unknown>>();\n for (const row of related as Record<string, unknown>[]) {\n byKey.set(row[rel.foreignKey], row);\n }\n out.forEach((r, i) => {\n r[name] = byKey.get(rows[i]?.[rel.localKey]) ?? null;\n });\n }\n }\n\n return out as WithRelations<Row, Spec>[];\n}\n","/**\n * tempest-db-js — Phase 4b: engine, session, real execution.\n *\n * Async by default (`createEngine`), with an optional sync engine for SQLite\n * (`createSyncEngine`). The database is identified by its URL (Phase 4a's\n * `parseDatabaseUrl`); the dialect compiles the builder AST to `{ sql, params }`\n * (Phase 4a's `getDialect`); a driver runs it; rows are coerced back to native\n * types via `coerceRow` (the serialization layer).\n *\n * SQLite execution is real and tested here through Node's built-in `node:sqlite`.\n * `better-sqlite3` and `postgres` (postgres.js) are lazy-loaded peer drivers.\n */\n\nimport { createRequire } from \"node:module\";\nimport { col, fn } from \"./conditions.js\";\nimport { type BaseDialect, getDialect } from \"./dialect.js\";\nimport { type ModelClass, columnNamesOf, columnsOf } from \"./index.js\";\nimport type { JoinBuilder, JoinNode } from \"./join.js\";\nimport type { InsertBuilder, InsertNode, UpdateBuilder } from \"./mutations.js\";\nimport { type SelectBuilder, select } from \"./query.js\";\nimport { coerceRow } from \"./serialize.js\";\nimport { type Dialect, type ParsedDatabaseUrl, parseDatabaseUrl } from \"./url.js\";\n\n/** A synchronous `require`, usable from both ESM and CJS builds. */\nconst nodeRequire = createRequire(import.meta.url);\n\n// ---------------------------------------------------------------------------\n// driver layer\n// ---------------------------------------------------------------------------\n\n/** The outcome of running one statement. */\nexport interface DriverResult {\n /** Returned rows (SELECT or `RETURNING`); empty otherwise. */\n readonly rows: Record<string, unknown>[];\n /** Rows affected by an INSERT/UPDATE/DELETE. */\n readonly changes: number;\n}\n\n/** A synchronous driver (SQLite). */\nexport interface SyncDriver {\n execute(sql: string, params: readonly unknown[]): DriverResult;\n /** Lazily iterate rows (for `.stream()`), if the driver supports it. */\n iterate?(\n sql: string,\n params: readonly unknown[],\n ): IterableIterator<Record<string, unknown>>;\n close(): void;\n}\n\n/** An asynchronous driver (PostgreSQL, or an async-wrapped SQLite). */\nexport interface AsyncDriver {\n execute(sql: string, params: readonly unknown[]): Promise<DriverResult>;\n /** Lazily iterate rows (for `.stream()`), if the driver supports it. */\n iterate?(\n sql: string,\n params: readonly unknown[],\n ): AsyncIterableIterator<Record<string, unknown>>;\n /**\n * Reserve a single pinned connection for the duration of a transaction.\n * Pooled drivers (PostgreSQL) MUST implement this so `BEGIN`/`COMMIT` and the\n * statements between them all run on the same connection. Single-connection\n * drivers (SQLite) may omit it — `transaction` then runs on the shared handle.\n */\n reserve?(): Promise<ReservedAsyncDriver>;\n close(): Promise<void>;\n}\n\n/** An {@link AsyncDriver} pinned to one connection, used inside a transaction. */\nexport interface ReservedAsyncDriver extends AsyncDriver {\n /** Return the pinned connection to the pool. */\n release(): Promise<void>;\n}\n\n/** Encode a JS value into something a SQLite driver can bind. */\nfunction encodeSqliteParam(value: unknown): unknown {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Uint8Array) return value;\n if (typeof value === \"object\") return JSON.stringify(value);\n return value; // number, bigint, string\n}\n\n/** SQLite driver backed by Node's built-in `node:sqlite` (zero install). */\nexport class NodeSqliteDriver implements SyncDriver {\n // biome-ignore lint/suspicious/noExplicitAny: node:sqlite DatabaseSync has no shipped types here.\n private readonly db: any;\n /**\n * Prepared-statement cache keyed by SQL text. tempest-db-js always\n * parameterizes, so a query shape maps to one stable SQL string — reusing the\n * compiled statement avoids re-`prepare()` on every call (the dominant cost of\n * per-row inserts and point lookups).\n */\n // biome-ignore lint/suspicious/noExplicitAny: node:sqlite StatementSync has no shipped types here.\n private readonly statements = new Map<string, any>();\n\n // biome-ignore lint/suspicious/noExplicitAny: accept an already-open DatabaseSync handle.\n constructor(database: any) {\n this.db = database;\n }\n\n /**\n * Open a `node:sqlite` database at the given path (or `:memory:`).\n *\n * @param path The database file, or `\":memory:\"`.\n * @param options Passed straight to `DatabaseSync` (`readOnly`, `timeout`, …).\n * @returns A driver over the open handle.\n */\n static open(\n path: string,\n options?: Readonly<Record<string, unknown>>,\n ): NodeSqliteDriver {\n // Lazy require so importing tempest-db-js never forces the built-in module to load.\n const { DatabaseSync } = nodeRequire(\"node:sqlite\") as {\n DatabaseSync: new (path: string, options?: Record<string, unknown>) => unknown;\n };\n return new NodeSqliteDriver(\n options ? new DatabaseSync(path, { ...options }) : new DatabaseSync(path),\n );\n }\n\n /** Return the cached prepared statement for `sql`, preparing it on first use. */\n // biome-ignore lint/suspicious/noExplicitAny: statement type is unavailable here.\n private prepare(sql: string): any {\n const cached = this.statements.get(sql);\n if (cached) return cached;\n const stmt = this.db.prepare(sql);\n this.statements.set(sql, stmt);\n return stmt;\n }\n\n execute(sql: string, params: readonly unknown[]): DriverResult {\n const stmt = this.prepare(sql);\n const bound = params.map(encodeSqliteParam);\n if (returnsRows(sql)) {\n return { rows: stmt.all(...bound) as Record<string, unknown>[], changes: 0 };\n }\n const info = stmt.run(...bound);\n return { rows: [], changes: Number(info.changes ?? 0) };\n }\n\n *iterate(\n sql: string,\n params: readonly unknown[],\n ): IterableIterator<Record<string, unknown>> {\n const stmt = this.prepare(sql);\n const bound = params.map(encodeSqliteParam);\n yield* stmt.iterate(...bound) as IterableIterator<Record<string, unknown>>;\n }\n\n close(): void {\n this.statements.clear();\n this.db.close();\n }\n}\n\n/**\n * SQLite driver backed by the `better-sqlite3` peer dependency.\n *\n * Selected with `{ driver: \"better-sqlite3\" }` or the URL suffix\n * `sqlite+better-sqlite3://…`; the built-in `node:sqlite` stays the default, so\n * nothing has to be installed to use SQLite. Pick this one when the service\n * already runs on better-sqlite3, or needs what it exposes and `node:sqlite`\n * does not — `pragma()`, loadable extensions, its own WAL helpers.\n *\n * Row shape matches {@link NodeSqliteDriver}: plain objects, BLOBs as `Buffer`\n * (a `Uint8Array` subclass), which is what `coerceRow` already expects.\n */\nexport class BetterSqliteDriver implements SyncDriver {\n // biome-ignore lint/suspicious/noExplicitAny: the peer dep's types are optional here.\n private readonly db: any;\n /** Prepared-statement cache keyed by SQL text — see {@link NodeSqliteDriver}. */\n // biome-ignore lint/suspicious/noExplicitAny: see above.\n private readonly statements = new Map<string, any>();\n\n // biome-ignore lint/suspicious/noExplicitAny: accept an already-open Database handle.\n constructor(database: any) {\n this.db = database;\n }\n\n /**\n * Open a `better-sqlite3` database at the given path (or `\":memory:\"`).\n *\n * @param path The database file, or `\":memory:\"`.\n * @param options Passed straight to `new Database()` (`readonly`, `timeout`, …).\n * @returns A driver over the open handle.\n * @throws If `better-sqlite3` is not installed — it is an optional peer\n * dependency, so the error names the package to install.\n */\n static open(\n path: string,\n options?: Readonly<Record<string, unknown>>,\n ): BetterSqliteDriver {\n let Database: new (path: string, options?: Record<string, unknown>) => unknown;\n try {\n const mod = nodeRequire(\"better-sqlite3\") as\n | { default?: typeof Database }\n | typeof Database;\n Database = ((mod as { default?: typeof Database }).default ??\n mod) as typeof Database;\n } catch (cause) {\n throw new Error(\n 'The \"better-sqlite3\" driver requires the better-sqlite3 package: npm install better-sqlite3',\n { cause },\n );\n }\n return new BetterSqliteDriver(\n options ? new Database(path, { ...options }) : new Database(path),\n );\n }\n\n /** Return the cached prepared statement for `sql`, preparing it on first use. */\n // biome-ignore lint/suspicious/noExplicitAny: statement type is optional here.\n private prepare(sql: string): any {\n const cached = this.statements.get(sql);\n if (cached) return cached;\n const stmt = this.db.prepare(sql);\n this.statements.set(sql, stmt);\n return stmt;\n }\n\n execute(sql: string, params: readonly unknown[]): DriverResult {\n const stmt = this.prepare(sql);\n const bound = params.map(encodeSqliteParam);\n // better-sqlite3 throws when all()/run() is called on the wrong statement\n // kind, and it already knows which is which — ask it instead of guessing.\n if (stmt.reader) {\n return { rows: stmt.all(...bound) as Record<string, unknown>[], changes: 0 };\n }\n const info = stmt.run(...bound);\n return { rows: [], changes: Number(info.changes ?? 0) };\n }\n\n *iterate(\n sql: string,\n params: readonly unknown[],\n ): IterableIterator<Record<string, unknown>> {\n const stmt = this.prepare(sql);\n const bound = params.map(encodeSqliteParam);\n yield* stmt.iterate(...bound) as IterableIterator<Record<string, unknown>>;\n }\n\n close(): void {\n this.statements.clear();\n this.db.close();\n }\n}\n\n/** True when a statement yields rows (SELECT, PRAGMA, or any `RETURNING`). */\nfunction returnsRows(sql: string): boolean {\n return /^\\s*(select|pragma)/i.test(sql) || /\\breturning\\b/i.test(sql);\n}\n\n// ---------------------------------------------------------------------------\n// executable builders & row extraction\n// ---------------------------------------------------------------------------\n\n/* biome-ignore lint/suspicious/noExplicitAny: builder generics are irrelevant to execution dispatch. */\ntype AnySelect = SelectBuilder<any, any, any>;\n/* biome-ignore lint/suspicious/noExplicitAny: see above. */\ntype AnyInsert = InsertBuilder<any, any, any>;\n/* biome-ignore lint/suspicious/noExplicitAny: only the guarded flag matters. */\ntype GuardedUpdate = UpdateBuilder<any, true, any>;\n/* biome-ignore lint/suspicious/noExplicitAny: only the guarded flag matters. */\ntype GuardedDelete = import(\"./mutations.js\").DeleteBuilder<any, true, any>;\n/* biome-ignore lint/suspicious/noExplicitAny: join sources are irrelevant to dispatch. */\ntype AnyJoin = JoinBuilder<any>;\n\n/**\n * A builder that is safe to execute. UPDATE/DELETE are accepted only once\n * guarded (after `.where()` or `.unguarded()`) — an unguarded full-table write\n * is a compile error at the execution boundary.\n */\nexport type Executable = AnySelect | AnyInsert | GuardedUpdate | GuardedDelete | AnyJoin;\n\n/** The element type a builder yields on execution. */\nexport type RowOf<B> = B extends { readonly __row: infer R } ? R : never;\n\n/** Internals shared between single-table builders, read structurally at runtime. */\ninterface SingleBuilder {\n readonly node: Parameters<BaseDialect[\"compile\"]>[0];\n readonly source: ModelClass;\n}\n\n/** Internals of a join builder, read structurally at runtime. */\ninterface JoinRunnable {\n readonly node: JoinNode;\n readonly sources: Readonly<Record<string, ModelClass>>;\n}\n\n/** Split one flat `alias.column` row into a coerced composite `{ alias: {...} }`. */\nfunction splitJoinRow(\n node: JoinNode,\n sources: Readonly<Record<string, ModelClass>>,\n raw: Record<string, unknown>,\n): Record<string, unknown> {\n const leftAliases = new Set(\n node.joins.filter((j) => j.kind === \"left\").map((j) => j.alias),\n );\n const out: Record<string, unknown> = {};\n for (const [alias, model] of Object.entries(sources)) {\n const sub: Record<string, unknown> = {};\n const names = columnNamesOf(model);\n let allNull = true;\n for (const colName of Object.keys(columnsOf(model))) {\n const value = raw[`${alias}.${colName}`];\n if (value !== null && value !== undefined) allNull = false;\n sub[names?.[colName] ?? colName] = value;\n }\n out[alias] = leftAliases.has(alias) && allNull ? null : coerceRow(model, sub);\n }\n return out;\n}\n\n/** Coerce one raw driver row into the builder's native row shape. */\nfunction coerceOne(builder: unknown, raw: Record<string, unknown>): unknown {\n const node = (builder as { node: { kind: string } }).node;\n if (node.kind === \"join_select\") {\n const b = builder as unknown as JoinRunnable;\n return splitJoinRow(b.node, b.sources, raw);\n }\n const b = builder as unknown as SingleBuilder;\n return coerceRow(b.source, raw);\n}\n\n/** Coerce raw driver rows into the builder's native row shape. */\nfunction mapRows(builder: unknown, raw: Record<string, unknown>[]): unknown[] {\n return raw.map((r) => coerceOne(builder, r));\n}\n\n// ---------------------------------------------------------------------------\n// results\n// ---------------------------------------------------------------------------\n\n/** Raised by `.one()` when the row count is not exactly one. */\nexport class NoResultError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NoResultError\";\n }\n}\n\n/** A short, safe preview of a bound parameter for an error message. */\nfunction previewParam(value: unknown): string {\n if (value === null || value === undefined) return \"null\";\n if (value instanceof Uint8Array) return `<${value.length} bytes>`;\n const text = typeof value === \"string\" ? value : String(value);\n return text.length > 64 ? `${text.slice(0, 61)}...` : text;\n}\n\n/**\n * Raised when the driver rejects a statement. Wraps the original driver error\n * and attaches the offending SQL and its bound parameters, so a failure points\n * at the exact query instead of an opaque driver message.\n */\nexport class QueryExecutionError extends Error {\n constructor(\n /** The original error thrown by the driver. */\n override readonly cause: unknown,\n /** The SQL that failed. */\n readonly sql: string,\n /** The bound parameters, in order. */\n readonly params: readonly unknown[],\n ) {\n const reason = cause instanceof Error ? cause.message : String(cause);\n super(\n `Query failed: ${reason}\\n SQL: ${sql}\\n params: [${params\n .map(previewParam)\n .join(\", \")}]`,\n );\n this.name = \"QueryExecutionError\";\n }\n}\n\n/**\n * A hook invoked for every statement a session runs (query logging / tracing).\n * Errors thrown by the logger are ignored so logging never breaks execution.\n */\nexport type QueryLogger = (event: {\n readonly sql: string;\n readonly params: readonly unknown[];\n}) => void;\n\n/** Invoke a query logger, swallowing any error it throws. */\nfunction emitLog(\n logger: QueryLogger | undefined,\n sql: string,\n params: readonly unknown[],\n): void {\n if (!logger) return;\n try {\n logger({ sql, params });\n } catch {\n // logging must never break execution\n }\n}\n\nfunction firstScalar(row: Record<string, unknown> | undefined): unknown {\n if (!row) return null;\n const keys = Object.keys(row);\n return keys.length > 0 ? row[keys[0] as string] : null;\n}\n\n/** Synchronous result view over already-fetched rows. */\nexport class SyncResult<Row> {\n constructor(\n private readonly rows: Row[],\n private readonly changes: number,\n ) {}\n\n all(): Row[] {\n return this.rows;\n }\n first(): Row | null {\n return this.rows[0] ?? null;\n }\n one(): Row {\n if (this.rows.length !== 1) {\n throw new NoResultError(`expected exactly one row, got ${this.rows.length}`);\n }\n return this.rows[0] as Row;\n }\n oneOrNull(): Row | null {\n if (this.rows.length > 1) {\n throw new NoResultError(`expected at most one row, got ${this.rows.length}`);\n }\n return this.rows[0] ?? null;\n }\n scalar(): unknown {\n return firstScalar(this.rows[0] as Record<string, unknown> | undefined);\n }\n scalars(): unknown[] {\n return this.rows.map((r) => firstScalar(r as Record<string, unknown>));\n }\n rowsAffected(): number {\n return this.changes;\n }\n}\n\n/** Asynchronous result view (terminals return Promises). */\nexport class AsyncResult<Row> {\n constructor(private readonly inner: Promise<SyncResult<Row>>) {}\n\n async all(): Promise<Row[]> {\n return (await this.inner).all();\n }\n async first(): Promise<Row | null> {\n return (await this.inner).first();\n }\n async one(): Promise<Row> {\n return (await this.inner).one();\n }\n async oneOrNull(): Promise<Row | null> {\n return (await this.inner).oneOrNull();\n }\n async scalar(): Promise<unknown> {\n return (await this.inner).scalar();\n }\n async scalars(): Promise<unknown[]> {\n return (await this.inner).scalars();\n }\n async rowsAffected(): Promise<number> {\n return (await this.inner).rowsAffected();\n }\n}\n\n// ---------------------------------------------------------------------------\n// sessions\n// ---------------------------------------------------------------------------\n\nlet savepointCounter = 0;\n\n/**\n * True when a builder asks for `RETURNING` on a dialect that has none, so the\n * session must insert and read the row back instead of compiling one statement.\n */\nfunction needsInsertReadBack(\n dialect: BaseDialect,\n node: Parameters<BaseDialect[\"compile\"]>[0],\n): node is InsertNode {\n return dialect.name === \"mysql\" && node.kind === \"insert\" && node.returning !== null;\n}\n\n/** The model's single primary-key property name, for the insert read-back. */\nfunction singlePrimaryKey(model: ModelClass): string {\n const keys = Object.entries(columnsOf(model))\n .filter(([, column]) => column.flags.primaryKey)\n .map(([name]) => name);\n if (keys.length !== 1) {\n throw new Error(\n `${model.tablename} needs exactly one primary key to read an insert back on a dialect without RETURNING; found ${keys.length}.`,\n );\n }\n return keys[0] as string;\n}\n\n/** Reject a `raw()` call whose parameters are not an array. */\nfunction assertRawParams(params: readonly unknown[]): void {\n if (!Array.isArray(params)) {\n throw new TypeError(\n \"session.raw(sql, params) takes an array of bound parameters — never interpolate values into the SQL string.\",\n );\n }\n}\n\n/** A synchronous unit of work (SQLite). */\nexport class SyncSession {\n constructor(\n private readonly driver: SyncDriver,\n private readonly dialect: BaseDialect,\n /** Optional per-statement logger (query tracing). */\n private readonly logger?: QueryLogger,\n ) {}\n\n /** Log, run, and error-wrap one raw statement. */\n private exec(sql: string, params: readonly unknown[]): DriverResult {\n emitLog(this.logger, sql, params);\n try {\n return this.driver.execute(sql, params);\n } catch (error) {\n throw new QueryExecutionError(error, sql, params);\n }\n }\n\n /**\n * Run a raw, parameterized SQL statement (synchronous) — the runtime counterpart of the\n * migrations' `Op.execute`.\n *\n * A query builder never covers all of SQL, and without an escape hatch a single\n * unsupported query forces a whole second database stack alongside this one. Use\n * it for what the builder cannot yet express, and keep everything else typed.\n *\n * The statement goes through the same path as a compiled one: it is logged via\n * `onQuery`, wrapped in {@link QueryExecutionError} on failure, and runs on the\n * reserved connection inside `transaction()`.\n *\n * @param sql The statement text. Placeholders only (`$1` / `?` per dialect) —\n * never interpolate a value into this string.\n * @param params The bound parameters, in placeholder order.\n * @param options Pass `as` to coerce the returned rows with a model's column\n * types (and its column-name mapping).\n * @returns The result view over the returned rows.\n * @throws Error When `params` is not an array — the guard against calling this\n * with an interpolated string and no parameters by mistake.\n *\n * @example\n * ```ts\n * const claimed = await session.raw<OutboundRow>(\n * `UPDATE outbound_messages SET status = 'sending'\n * WHERE id = ANY($1) RETURNING *`,\n * [ids],\n * { as: Outbound },\n * ).all();\n * ```\n */\n raw<Row = Record<string, unknown>>(\n sql: string,\n params: readonly unknown[] = [],\n options?: { readonly as?: ModelClass },\n ): SyncResult<Row> {\n assertRawParams(params);\n const result = this.exec(sql, params);\n const model = options?.as;\n const rows = (\n model ? result.rows.map((row) => coerceRow(model, row)) : result.rows\n ) as Row[];\n return new SyncResult<Row>(rows, result.changes);\n }\n\n /** Compile, run, and coerce a builder into a result. */\n execute<B extends Executable>(builder: B): SyncResult<RowOf<B>> {\n const node = (builder as unknown as { node: Parameters<BaseDialect[\"compile\"]>[0] })\n .node;\n const { sql, params } = this.dialect.compile(node);\n const result = this.exec(sql, params);\n const rows = mapRows(builder, result.rows) as RowOf<B>[];\n return new SyncResult<RowOf<B>>(rows, result.changes);\n }\n\n /** Run `fn` inside a transaction: commit on success, rollback on throw. */\n transaction<T>(fn: (tx: SyncSession) => T): T {\n this.exec(\"BEGIN\", []);\n try {\n const out = fn(this);\n this.exec(\"COMMIT\", []);\n return out;\n } catch (error) {\n this.exec(\"ROLLBACK\", []);\n throw error;\n }\n }\n\n /** Run `fn` inside a SAVEPOINT (nested transaction). */\n beginNested<T>(fn: (sp: SyncSession) => T): T {\n savepointCounter += 1;\n const name = `qsp_${savepointCounter}`;\n this.exec(`SAVEPOINT ${name}`, []);\n try {\n const out = fn(this);\n this.exec(`RELEASE ${name}`, []);\n return out;\n } catch (error) {\n this.exec(`ROLLBACK TO ${name}`, []);\n throw error;\n }\n }\n\n /**\n * Lazily iterate result rows without materializing them all. Falls back to a\n * buffered fetch when the driver has no native iteration.\n */\n *stream<B extends Executable>(builder: B): IterableIterator<RowOf<B>> {\n const node = (builder as unknown as { node: Parameters<BaseDialect[\"compile\"]>[0] })\n .node;\n const { sql, params } = this.dialect.compile(node);\n emitLog(this.logger, sql, params);\n if (this.driver.iterate) {\n try {\n for (const raw of this.driver.iterate(sql, params)) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n } catch (error) {\n throw new QueryExecutionError(error, sql, params);\n }\n return;\n }\n for (const raw of this.exec(sql, params).rows) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n }\n\n close(): void {\n this.driver.close();\n }\n\n /** `using session = ...` closes the driver when the scope exits. */\n [Symbol.dispose](): void {\n this.close();\n }\n}\n\n/** An asynchronous unit of work. */\nexport class AsyncSession {\n constructor(\n private readonly driver: AsyncDriver,\n private readonly dialect: BaseDialect,\n /** Optional per-statement logger (query tracing). */\n private readonly logger?: QueryLogger,\n ) {}\n\n /** Log, run, and error-wrap one raw statement. */\n private async exec(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n emitLog(this.logger, sql, params);\n try {\n return await this.driver.execute(sql, params);\n } catch (error) {\n throw new QueryExecutionError(error, sql, params);\n }\n }\n\n /**\n * Run a raw, parameterized SQL statement — the runtime counterpart of the\n * migrations' `Op.execute`.\n *\n * A query builder never covers all of SQL, and without an escape hatch a single\n * unsupported query forces a whole second database stack alongside this one. Use\n * it for what the builder cannot yet express, and keep everything else typed.\n *\n * The statement goes through the same path as a compiled one: it is logged via\n * `onQuery`, wrapped in {@link QueryExecutionError} on failure, and runs on the\n * reserved connection inside `transaction()`.\n *\n * @param sql The statement text. Placeholders only (`$1` / `?` per dialect) —\n * never interpolate a value into this string.\n * @param params The bound parameters, in placeholder order.\n * @param options Pass `as` to coerce the returned rows with a model's column\n * types (and its column-name mapping).\n * @returns The result view over the returned rows.\n * @throws Error When `params` is not an array — the guard against calling this\n * with an interpolated string and no parameters by mistake.\n *\n * @example\n * ```ts\n * const claimed = await session.raw<OutboundRow>(\n * `UPDATE outbound_messages SET status = 'sending'\n * WHERE id = ANY($1) RETURNING *`,\n * [ids],\n * { as: Outbound },\n * ).all();\n * ```\n */\n raw<Row = Record<string, unknown>>(\n sql: string,\n params: readonly unknown[] = [],\n options?: { readonly as?: ModelClass },\n ): AsyncResult<Row> {\n assertRawParams(params);\n const model = options?.as;\n const inner = this.exec(sql, params).then((result) => {\n const rows = (\n model ? result.rows.map((row) => coerceRow(model, row)) : result.rows\n ) as Row[];\n return new SyncResult<Row>(rows, result.changes);\n });\n return new AsyncResult<Row>(inner);\n }\n\n execute<B extends Executable>(builder: B): AsyncResult<RowOf<B>> {\n const node = (builder as unknown as { node: Parameters<BaseDialect[\"compile\"]>[0] })\n .node;\n if (needsInsertReadBack(this.dialect, node)) {\n return new AsyncResult<RowOf<B>>(\n this.insertAndReadBack(builder as unknown as SingleBuilder, node),\n );\n }\n const { sql, params } = this.dialect.compile(node);\n const inner = this.exec(sql, params).then((result) => {\n const rows = mapRows(builder, result.rows) as RowOf<B>[];\n return new SyncResult<RowOf<B>>(rows, result.changes);\n });\n return new AsyncResult<RowOf<B>>(inner);\n }\n\n /**\n * Honor `.returning()` on a dialect without `RETURNING`, by inserting and then\n * reading the row back by key.\n *\n * Both statements must run on **one** connection, because `LAST_INSERT_ID()` is\n * per-connection: outside a transaction the pooled driver is reserved for the\n * pair; inside one, the session already holds a pinned connection (a reserved\n * driver exposes no `reserve`), so it runs there directly.\n *\n * @param builder The insert builder, for its source model.\n * @param node The insert AST, whose `returning` drives the read-back.\n * @returns The result view over the read-back row.\n * @throws Error When the insert writes more than one row — `LAST_INSERT_ID()`\n * identifies only the first, and the rest are consecutive only under some\n * auto-increment lock modes.\n */\n private async insertAndReadBack<Row>(\n builder: SingleBuilder,\n node: InsertNode,\n ): Promise<SyncResult<Row>> {\n if (node.values.length !== 1) {\n throw new Error(\n `${this.dialect.name} has no RETURNING, and reading back a multi-row insert is not reliable — insert one row at a time, or drop .returning().`,\n );\n }\n const model = builder.source;\n const pk = singlePrimaryKey(model);\n const supplied = (node.values[0] as Record<string, unknown>)[pk];\n const readBack = select(model).where(\n supplied === undefined || supplied === null\n ? col(pk).eq(fn.call(\"LAST_INSERT_ID\"))\n : { [pk]: supplied },\n );\n const insertSql = this.dialect.compile({ ...node, returning: null });\n const selectSql = this.dialect.compile(\n node.returning === \"*\" || node.returning === null\n ? readBack.node\n : { ...readBack.node, columns: node.returning },\n );\n const run = async (driver: AsyncDriver): Promise<SyncResult<Row>> => {\n const scoped = new AsyncSession(driver, this.dialect, this.logger);\n const written = await scoped.exec(insertSql.sql, insertSql.params);\n const read = await scoped.exec(selectSql.sql, selectSql.params);\n const rows = read.rows.map((row) => coerceRow(model, row)) as Row[];\n return new SyncResult<Row>(rows, written.changes);\n };\n if (!this.driver.reserve) return run(this.driver);\n const reserved = await this.driver.reserve();\n try {\n return await run(reserved);\n } finally {\n await reserved.release();\n }\n }\n\n /** Lazily iterate result rows. Uses driver streaming when available. */\n async *stream<B extends Executable>(builder: B): AsyncIterableIterator<RowOf<B>> {\n const node = (builder as unknown as { node: Parameters<BaseDialect[\"compile\"]>[0] })\n .node;\n const { sql, params } = this.dialect.compile(node);\n emitLog(this.logger, sql, params);\n if (this.driver.iterate) {\n try {\n for await (const raw of this.driver.iterate(sql, params)) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n } catch (error) {\n throw new QueryExecutionError(error, sql, params);\n }\n return;\n }\n const result = await this.exec(sql, params);\n for (const raw of result.rows) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n }\n\n async transaction<T>(fn: (tx: AsyncSession) => Promise<T>): Promise<T> {\n // Pooled drivers (PostgreSQL) must pin one connection: BEGIN/COMMIT and every\n // statement between them have to run on the same connection, or postgres.js\n // rejects the raw transaction. Single-connection drivers (SQLite) skip this.\n if (this.driver.reserve) {\n const reserved = await this.driver.reserve();\n const scoped = new AsyncSession(reserved, this.dialect, this.logger);\n try {\n await scoped.exec(\"BEGIN\", []);\n const out = await fn(scoped);\n await scoped.exec(\"COMMIT\", []);\n return out;\n } catch (error) {\n await scoped.exec(\"ROLLBACK\", []);\n throw error;\n } finally {\n await reserved.release();\n }\n }\n await this.exec(\"BEGIN\", []);\n try {\n const out = await fn(this);\n await this.exec(\"COMMIT\", []);\n return out;\n } catch (error) {\n await this.exec(\"ROLLBACK\", []);\n throw error;\n }\n }\n\n async close(): Promise<void> {\n await this.driver.close();\n }\n\n /** `await using session = ...` closes the driver when the scope exits. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// engines\n// ---------------------------------------------------------------------------\n\n/** Connection-pool tuning (PostgreSQL; ignored by SQLite). */\nexport interface PoolOptions {\n /** Max connections in the pool. */\n readonly size?: number;\n /** Close a connection after it sits idle this long (ms). */\n readonly idleTimeoutMs?: number;\n /** Give up acquiring a connection after this long (ms). */\n readonly connectTimeoutMs?: number;\n}\n\n/**\n * A server-side notice (a PostgreSQL `NOTICE`). The shape is the driver's own —\n * passed through untouched rather than normalized, since what is useful in it\n * differs per database.\n */\nexport type NoticeLogger = (notice: Record<string, unknown>) => void;\n\n/** Options shared by both engine flavors. */\nexport interface EngineOptions {\n /**\n * Override the driver detected from the URL.\n *\n * SQLite ships two: `\"node:sqlite\"` (the built-in, default — nothing to\n * install) and `\"better-sqlite3\"` (the optional peer dependency). PostgreSQL\n * runs on `\"postgres\"` (postgres.js) and MySQL on `\"mysql2\"`; naming those is\n * a no-op today, kept so the option means the same thing everywhere.\n *\n * A name this dialect does not have throws — passing `{ driver: \"sqlite3\" }`\n * is a decision that would otherwise be silently ignored.\n *\n * The `+suffix` in the URL (`sqlite+better-sqlite3:///app.db`) selects the same\n * way, with one difference: a suffix naming a driver from another ecosystem\n * (`sqlite+aiosqlite`, `postgresql+asyncpg`) is ignored rather than rejected,\n * so a URL copied from a Python service still connects.\n */\n readonly driver?: string;\n /** Connection-pool tuning (PostgreSQL only). */\n readonly pool?: PoolOptions;\n /**\n * Called for every statement a session runs — SQL + bound params. Use for\n * query logging/tracing. Thrown errors are swallowed so it never breaks a query.\n */\n readonly onQuery?: QueryLogger;\n /**\n * Called for every server-side notice (`CREATE TABLE IF NOT EXISTS` on an\n * existing table, `DROP ... IF EXISTS` on a missing one, and so on).\n *\n * **Without this, notices are silenced.** postgres.js defaults to printing them\n * with `console.log`, which drops a nine-line object into the host service's\n * stdout in the middle of its structured log — on every boot, since a migration\n * runner is usually the first thing to run. Writing to the host's stdout is the\n * application's decision, not a library's, so the default is to say nothing and\n * let you route them:\n *\n * ```ts\n * createEngine(url, { onNotice: (n) => logger.debug({ pg: n }, \"postgres notice\") });\n * ```\n *\n * Thrown errors are swallowed, like `onQuery`.\n */\n readonly onNotice?: NoticeLogger;\n /**\n * Options passed straight to the underlying driver, applied **last** so they\n * win over everything this layer derives (`pool`, `onNotice`).\n *\n * The escape hatch for what the typed surface does not model and is not going\n * to — postgres.js `connection`/`types`/`transform`/`ssl`, mysql2's own\n * settings, `node:sqlite`'s `readOnly` — so a gap need not become a feature\n * request.\n */\n readonly driverOptions?: Readonly<Record<string, unknown>>;\n}\n\n/** Invoke a notice logger, swallowing any error it throws. */\nfunction emitNotice(logger: NoticeLogger | undefined, notice: unknown): void {\n if (!logger) return;\n try {\n logger(notice as Record<string, unknown>);\n } catch {\n // logging must never break a connection\n }\n}\n\n/** A synchronous engine (SQLite only). */\nexport class SyncEngine {\n readonly dialect: Dialect = \"sqlite\";\n\n constructor(\n private readonly driver: SyncDriver,\n private readonly logger?: QueryLogger,\n ) {}\n\n session(): SyncSession {\n return new SyncSession(this.driver, getDialect(\"sqlite\"), this.logger);\n }\n\n transaction<T>(fn: (tx: SyncSession) => T): T {\n return this.session().transaction(fn);\n }\n\n close(): void {\n this.driver.close();\n }\n\n /** `using engine = createSyncEngine(...)` closes the pool when the scope exits. */\n [Symbol.dispose](): void {\n this.close();\n }\n}\n\n/** An asynchronous engine. */\nexport class AsyncEngine {\n constructor(\n private readonly driver: AsyncDriver,\n readonly dialect: Dialect,\n private readonly logger?: QueryLogger,\n ) {}\n\n session(): AsyncSession {\n return new AsyncSession(this.driver, getDialect(this.dialect), this.logger);\n }\n\n transaction<T>(fn: (tx: AsyncSession) => Promise<T>): Promise<T> {\n return this.session().transaction(fn);\n }\n\n async close(): Promise<void> {\n await this.driver.close();\n }\n\n /** `await using engine = createEngine(...)` closes the pool when the scope exits. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n}\n\n/**\n * Adapt a sync **or** async driver to the async interface.\n *\n * `await` normalizes both: a sync driver returns a plain value, an async one a\n * promise, and awaiting either yields the result. That is what lets the migration\n * CLI take one code path instead of branching on a difference it cannot detect\n * from the object's shape.\n *\n * @param driver Either driver flavor.\n * @returns An async driver delegating to it.\n */\nexport function toAsyncDriver(driver: SyncDriver | AsyncDriver): AsyncDriver {\n return {\n async execute(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n return await driver.execute(sql, params);\n },\n async close(): Promise<void> {\n await driver.close();\n },\n };\n}\n\n/** Wrap a sync driver so it satisfies the async interface (SQLite async path). */\nfunction asAsync(driver: SyncDriver): AsyncDriver {\n const syncIterate = driver.iterate?.bind(driver);\n return {\n execute: (sql, params) => Promise.resolve(driver.execute(sql, params)),\n close: () => Promise.resolve(driver.close()),\n ...(syncIterate\n ? {\n iterate: async function* (sql: string, params: readonly unknown[]) {\n yield* syncIterate(sql, params);\n },\n }\n : {}),\n };\n}\n\n/** The SQLite drivers this package can open. */\ntype SqliteDriverName = \"node:sqlite\" | \"better-sqlite3\";\n\n/** Accepted spellings of each SQLite driver, lowercased. */\nconst SQLITE_DRIVER_ALIASES: Readonly<Record<string, SqliteDriverName>> = {\n \"node:sqlite\": \"node:sqlite\",\n \"node-sqlite\": \"node:sqlite\",\n node: \"node:sqlite\",\n \"better-sqlite3\": \"better-sqlite3\",\n better_sqlite3: \"better-sqlite3\",\n bettersqlite3: \"better-sqlite3\",\n};\n\n/** Accepted spellings of the one driver each server dialect runs on. */\nconst SERVER_DRIVER_ALIASES: Readonly<Record<string, readonly string[]>> = {\n postgresql: [\"postgres\", \"postgres.js\", \"postgresjs\", \"pg\"],\n mysql: [\"mysql\", \"mysql2\"],\n};\n\n/**\n * Validate an explicit `options.driver` against a server dialect.\n *\n * PostgreSQL and MySQL each have exactly one driver here, so the option can only\n * confirm it. Confirming is allowed; naming something else is the error the\n * silent no-op used to hide.\n *\n * @param dialect The dialect parsed from the URL.\n * @param driver The explicit override, if any.\n * @throws If `driver` is not a spelling of that dialect's driver.\n */\nfunction checkServerDriver(dialect: Dialect, driver: string | undefined): void {\n if (!driver) return;\n const accepted = SERVER_DRIVER_ALIASES[dialect] ?? [];\n if (accepted.includes(driver.toLowerCase())) return;\n throw new Error(\n `Unknown ${dialect} driver ${JSON.stringify(driver)}; tempest-db-js runs ${dialect} on ${JSON.stringify(accepted[0])}.`,\n );\n}\n\n/**\n * Decide which SQLite driver to open: the explicit option first, then the URL\n * suffix, then the built-in.\n *\n * @param parsed The parsed URL, for its `+suffix`.\n * @param options Engine options, for an explicit `driver`.\n * @returns The driver to open.\n * @throws If `options.driver` names a driver this package does not ship. An\n * unrecognized URL suffix does not throw — `sqlite+aiosqlite:///app.db` comes\n * from a Python service and means \"SQLite\", so it falls through to the default.\n */\nfunction resolveSqliteDriver(\n parsed: ParsedDatabaseUrl,\n options?: EngineOptions,\n): SqliteDriverName {\n const explicit = options?.driver;\n if (explicit) {\n const resolved = SQLITE_DRIVER_ALIASES[explicit.toLowerCase()];\n if (!resolved) {\n throw new Error(\n `Unknown SQLite driver ${JSON.stringify(explicit)}; supported: \"node:sqlite\" (built-in, default) and \"better-sqlite3\".`,\n );\n }\n return resolved;\n }\n const fromUrl = parsed.driver\n ? SQLITE_DRIVER_ALIASES[parsed.driver.toLowerCase()]\n : undefined;\n return fromUrl ?? \"node:sqlite\";\n}\n\n/** Open a SQLite sync driver from a parsed URL, passing driver options through. */\nfunction openSqliteDriver(\n parsed: ParsedDatabaseUrl,\n options?: EngineOptions,\n): SyncDriver {\n const path = parsed.database ?? \":memory:\";\n return resolveSqliteDriver(parsed, options) === \"better-sqlite3\"\n ? BetterSqliteDriver.open(path, options?.driverOptions)\n : NodeSqliteDriver.open(path, options?.driverOptions);\n}\n\n/**\n * Create a **synchronous** engine from a database URL. SQLite only — PostgreSQL\n * has no sane synchronous driver in Node, so a Postgres URL throws, pointing at\n * the async `createEngine`.\n *\n * @param url A SQLite URL, e.g. `\"sqlite:///app.db\"` or `\"sqlite://:memory:\"`.\n * @param options Engine options.\n * @returns A `SyncEngine`.\n */\nexport function createSyncEngine(url: string, options?: EngineOptions): SyncEngine {\n const parsed = parseDatabaseUrl(url);\n if (parsed.dialect !== \"sqlite\") {\n throw new Error(\n `createSyncEngine supports only SQLite; ${parsed.dialect} is async-only — use createEngine.`,\n );\n }\n return new SyncEngine(openSqliteDriver(parsed, options), options?.onQuery);\n}\n\n/**\n * Create an **asynchronous** engine from a database URL (the default). Works for\n * both SQLite (sync driver wrapped as async) and PostgreSQL (postgres.js,\n * lazy-loaded).\n *\n * @param url A database URL, e.g. `\"postgresql://app@localhost/app\"` or\n * `\"sqlite:///app.db\"`.\n * @param options Engine options.\n * @returns An `AsyncEngine`.\n */\nexport function createEngine(url: string, options?: EngineOptions): AsyncEngine {\n const parsed = parseDatabaseUrl(url);\n if (parsed.dialect === \"sqlite\") {\n return new AsyncEngine(\n asAsync(openSqliteDriver(parsed, options)),\n \"sqlite\",\n options?.onQuery,\n );\n }\n if (parsed.dialect === \"mysql\") {\n checkServerDriver(\"mysql\", options?.driver);\n // MySQL: mysql2 is lazy-loaded the first time a query runs.\n return new AsyncEngine(\n createMysqlDriver(parsed.raw, options),\n \"mysql\",\n options?.onQuery,\n );\n }\n checkServerDriver(\"postgresql\", options?.driver);\n // PostgreSQL: postgres.js is lazy-loaded the first time a query runs.\n return new AsyncEngine(\n createPostgresDriver(parsed.raw, options),\n \"postgresql\",\n options?.onQuery,\n );\n}\n\n/** Encode a JS value into something the MySQL driver (mysql2) can bind. */\nfunction encodeMysqlParam(value: unknown): unknown {\n if (value === undefined || value === null) return null;\n if (typeof value === \"boolean\") return value ? 1 : 0;\n if (value instanceof Uint8Array) return value;\n if (value instanceof Date) return value;\n if (typeof value === \"object\") return JSON.stringify(value);\n return value; // number, bigint, string\n}\n\n/** Shape a mysql2 result into our `DriverResult`. */\nfunction toMysqlResult(rows: unknown): DriverResult {\n if (Array.isArray(rows)) {\n return { rows: rows as Record<string, unknown>[], changes: 0 };\n }\n // A ResultSetHeader (INSERT/UPDATE/DELETE): no rows, affectedRows is the count.\n const header = rows as { affectedRows?: number };\n return { rows: [], changes: header.affectedRows ?? 0 };\n}\n\n/**\n * MySQL driver backed by mysql2/promise (lazy-loaded peer dependency).\n *\n * Transactions reserve a single pooled connection via {@link AsyncDriver.reserve}\n * so `BEGIN`/`COMMIT` and the statements between them run on one connection.\n * MySQL has no `RETURNING`; the dialect throws if it is requested.\n */\nfunction createMysqlDriver(url: string, options?: EngineOptions): AsyncDriver {\n const pool = options?.pool;\n // biome-ignore lint/suspicious/noExplicitAny: mysql2 pool typed at call site.\n let poolHandle: any;\n const ensure = async (): Promise<void> => {\n if (poolHandle) return;\n const moduleName = \"mysql2/promise\";\n // biome-ignore lint/suspicious/noExplicitAny: dynamic import of the peer dep.\n const mod = (await import(/* @vite-ignore */ moduleName)) as any;\n const opts: Record<string, unknown> = { uri: url };\n if (pool?.size !== undefined) opts.connectionLimit = pool.size;\n if (pool?.idleTimeoutMs !== undefined) opts.idleTimeout = pool.idleTimeoutMs;\n if (pool?.connectTimeoutMs !== undefined) opts.connectTimeout = pool.connectTimeoutMs;\n Object.assign(opts, options?.driverOptions ?? {});\n poolHandle = mod.createPool(opts);\n };\n const runOn = async (\n // biome-ignore lint/suspicious/noExplicitAny: mysql2 queryable (pool or connection).\n queryable: any,\n sql: string,\n params: readonly unknown[],\n ): Promise<DriverResult> => {\n const [rows] = await queryable.query(sql, params.map(encodeMysqlParam));\n return toMysqlResult(rows);\n };\n return {\n async execute(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n await ensure();\n return runOn(poolHandle, sql, params);\n },\n async reserve(): Promise<ReservedAsyncDriver> {\n await ensure();\n // biome-ignore lint/suspicious/noExplicitAny: reserved connection from mysql2.\n const conn: any = await poolHandle.getConnection();\n return {\n execute: (sql, params) => runOn(conn, sql, params),\n async release(): Promise<void> {\n conn.release();\n },\n async close(): Promise<void> {\n conn.release();\n },\n };\n },\n async close(): Promise<void> {\n if (poolHandle) await poolHandle.end();\n },\n };\n}\n\n/** Shape a postgres.js result array into our `DriverResult`. */\nfunction toPostgresResult(rows: unknown): DriverResult {\n const arr = rows as Record<string, unknown>[] & { count?: number };\n return { rows: Array.from(arr), changes: arr.count ?? arr.length };\n}\n\n/**\n * PostgreSQL driver backed by postgres.js (lazy-loaded peer dependency).\n *\n * Transactions reserve a single connection via {@link AsyncDriver.reserve} —\n * postgres.js pools connections, so a raw `BEGIN` on the shared client would run\n * on a different connection than the statements that follow (and is rejected with\n * `UNSAFE_TRANSACTION`). The reserved connection runs `BEGIN`/`COMMIT`/`ROLLBACK`\n * and every statement between them on one socket, then is released back.\n */\nfunction createPostgresDriver(url: string, options?: EngineOptions): AsyncDriver {\n const pool = options?.pool;\n // biome-ignore lint/suspicious/noExplicitAny: postgres.js client typed at call site.\n let client: any;\n const ensure = async (): Promise<void> => {\n if (client) return;\n // Non-literal specifier so the optional peer dep is not type-resolved at build.\n const moduleName = \"postgres\";\n // biome-ignore lint/suspicious/noExplicitAny: dynamic import of the peer dep.\n const mod = (await import(/* @vite-ignore */ moduleName)) as any;\n // Map our PoolOptions onto postgres.js's option names (seconds, not ms).\n const opts: Record<string, unknown> = {};\n if (pool?.size !== undefined) opts.max = pool.size;\n if (pool?.idleTimeoutMs !== undefined)\n opts.idle_timeout = Math.ceil(pool.idleTimeoutMs / 1000);\n if (pool?.connectTimeoutMs !== undefined) {\n opts.connect_timeout = Math.ceil(pool.connectTimeoutMs / 1000);\n }\n opts.onnotice = (notice: unknown): void => emitNotice(options?.onNotice, notice);\n Object.assign(opts, options?.driverOptions ?? {});\n client = (mod.default ?? mod)(url, opts);\n };\n return {\n async execute(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n await ensure();\n // postgres.js `unsafe` runs a parameterized string with positional params.\n return toPostgresResult(await client.unsafe(sql, params as unknown[]));\n },\n async reserve(): Promise<ReservedAsyncDriver> {\n await ensure();\n // biome-ignore lint/suspicious/noExplicitAny: reserved connection from postgres.js.\n const conn: any = await client.reserve();\n return {\n async execute(sql: string, params: readonly unknown[]): Promise<DriverResult> {\n return toPostgresResult(await conn.unsafe(sql, params as unknown[]));\n },\n async release(): Promise<void> {\n conn.release();\n },\n async close(): Promise<void> {\n conn.release();\n },\n };\n },\n async close(): Promise<void> {\n if (client) await client.end();\n },\n };\n}\n","/**\n * tempest-db-js — feasibility spike for Phase 1.\n *\n * Proves the central design claim: a class-based, SQLAlchemy-style model whose\n * fields are runtime column-builders can drive full static row-type inference in\n * TypeScript, despite TS erasing types at runtime.\n *\n * This is a SPIKE, not the final API. It validates the type machinery only.\n */\n\n/** Phantom marker carrying the static TS type a column maps to. */\ndeclare const TYPE: unique symbol;\n\n/** Column flags that influence the inferred row/insert shape. */\ninterface ColumnFlags {\n readonly primaryKey: boolean;\n readonly notNull: boolean;\n readonly hasDefault: boolean;\n /**\n * A `UNIQUE` constraint on the column. Does NOT influence the inferred type —\n * it is DDL-only metadata (mirrors SQLAlchemy's `mapped_column(unique=True)`).\n */\n readonly unique: boolean;\n}\n\nconst DEFAULT_FLAGS: ColumnFlags = {\n primaryKey: false,\n notNull: false,\n hasDefault: false,\n unique: false,\n};\n\n/**\n * The canonical, dialect-neutral kind of a column type. Mirrors SQLAlchemy's\n * generic types (e.g. `String` → varchar, `Text` → text). Dialect renderers\n * (Phase 4/6) map each kind + meta to concrete SQL per database.\n */\nexport type ColumnTypeKind =\n | \"smallint\"\n | \"integer\"\n | \"bigint\"\n | \"numeric\"\n | \"real\"\n | \"double\"\n | \"varchar\"\n | \"text\"\n | \"char\"\n | \"boolean\"\n | \"date\"\n | \"time\"\n | \"datetime\"\n | \"timestamp\"\n | \"blob\"\n | \"json\"\n | \"uuid\"\n | \"enum\"\n | \"array\";\n\n/** Parameters that refine a column type and feed the migration IR / DDL. */\nexport interface ColumnTypeMeta {\n /** Max length for `varchar`/`char`. */\n readonly length?: number | undefined;\n /** Total digits for `numeric`. */\n readonly precision?: number | undefined;\n /** Digits after the decimal point for `numeric`. */\n readonly scale?: number | undefined;\n /** `WITH TIME ZONE` for `timestamp`/`time`. */\n readonly withTimezone?: boolean | undefined;\n /** Allowed values for `enum`. */\n readonly values?: readonly string[] | undefined;\n /** Render as `JSONB` (PostgreSQL) instead of `JSON`. */\n readonly jsonb?: boolean | undefined;\n /** The element type of an `array` column (`text[]`, `integer[]`). */\n readonly element?: ColumnType | undefined;\n}\n\n/** A structured, dialect-neutral column type descriptor. */\nexport interface ColumnType {\n readonly kind: ColumnTypeKind;\n readonly meta: ColumnTypeMeta;\n}\n\n/**\n * A portable default expression. The token is dialect-neutral; the renderer\n * (Phase 4/6) maps it to the right SQL per database — e.g. `\"now\"` becomes\n * `CURRENT_TIMESTAMP` on SQLite and `now()` on PostgreSQL. Use `{ raw }` as an\n * escape hatch for a verbatim SQL fragment, or `{ parts }` for a parameterized\n * fragment built by the `sql.expr` tagged template (one bound parameter per gap\n * between consecutive parts).\n */\nexport type PortableExpression =\n | \"now\"\n | \"current_date\"\n | \"current_time\"\n | \"uuidv4\"\n | { readonly raw: string }\n | { readonly parts: readonly string[] };\n\n/**\n * A column default. Either a constant literal value or a server-side expression\n * evaluated by the database (mirrors SQLAlchemy's `default` vs `server_default`).\n * Feeds the migration IR (`DefaultIR`).\n */\nexport type DefaultValue =\n | { readonly kind: \"literal\"; readonly value: unknown }\n | { readonly kind: \"expression\"; readonly expression: PortableExpression };\n\n/**\n * Brand marking a value as a SQL expression rather than a bound parameter.\n *\n * A plain object reaching `set()`/`values()` is a mistake (it would be bound as a\n * parameter and silently written as JSON or null); an object carrying this symbol\n * is deliberate, and the dialect renders it inline instead of binding it. Mirrors\n * how `Condition` is branded, so the check is a symbol lookup, not duck typing.\n */\nconst EXPRESSION = Symbol.for(\"tempest-db-js.expression\");\n\n/**\n * A SQL expression, usable both as a column default (`.default(sql.now())`) and\n * as a write value (`.set({ attempts: sql.raw(\"attempts + 1\") })`). The dialect\n * renders `expression` inline and binds `params` in the order of the fragment's\n * gaps.\n */\nexport interface SqlExpression {\n readonly [EXPRESSION]: true;\n readonly kind: \"expression\";\n readonly expression: PortableExpression;\n /** Parameters bound into the fragment's gaps, in order (empty for a token). */\n readonly params: readonly unknown[];\n}\n\n/** Build a branded {@link SqlExpression} from a portable token or fragment. */\nfunction expression(\n token: PortableExpression,\n params: readonly unknown[] = [],\n): SqlExpression {\n return { [EXPRESSION]: true, kind: \"expression\", expression: token, params };\n}\n\n/**\n * Runtime guard: is this value a branded {@link SqlExpression}?\n *\n * @param value Any value handed to `set()`, `values()` or `.default()`.\n * @returns True when the value carries the expression brand.\n */\nexport function isSqlExpression(value: unknown): value is SqlExpression {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as Record<PropertyKey, unknown>)[EXPRESSION] === true\n );\n}\n\n/**\n * Portable server-side expressions, à la SQLAlchemy's `func`.\n *\n * Every entry doubles as a column default and as a write value, so\n * `.default(sql.now())` and `.set({ updatedAt: sql.now() })` both work.\n */\nexport const sql = {\n /** Current timestamp at insert (`CURRENT_TIMESTAMP` / `now()`). */\n now: (): SqlExpression => expression(\"now\"),\n /** Current date. */\n currentDate: (): SqlExpression => expression(\"current_date\"),\n /** Current time. */\n currentTime: (): SqlExpression => expression(\"current_time\"),\n /** A freshly generated UUID v4 (`gen_random_uuid()` / portable fallback). */\n uuidv4: (): SqlExpression => expression(\"uuidv4\"),\n /**\n * Escape hatch: a verbatim SQL expression rendered as-is, with no parameters.\n *\n * The fragment is interpolated into the statement untouched, so it must never\n * carry user input — use {@link sql.expr} when a value has to be bound.\n *\n * @param fragment The SQL text (e.g. `\"attempts + 1\"`).\n * @returns The expression, usable as a default and as a write value.\n */\n raw: (fragment: string): SqlExpression => expression({ raw: fragment }),\n /**\n * A parameterized SQL expression, written as a tagged template. Static text is\n * SQL; every `${...}` interpolation becomes a bound parameter, so the fragment\n * is injection-safe by construction.\n *\n * Cannot be used as a column default — a `DEFAULT` clause has nowhere to bind\n * parameters; use {@link sql.raw} there.\n *\n * @param parts The static SQL segments supplied by the template tag.\n * @param values The interpolated values, bound in order.\n * @returns The expression, usable as a write value.\n *\n * @example\n * ```ts\n * update(Account).set({ balance: sql.expr`balance - ${amount}` }).where({ id });\n * // UPDATE \"accounts\" SET \"balance\" = balance - $1 WHERE \"id\" = $2\n * ```\n */\n expr: (parts: TemplateStringsArray, ...values: unknown[]): SqlExpression =>\n expression({ parts: Array.from(parts) }, values),\n} as const;\n\n/** Narrow a `.default()` argument to a `DefaultValue` expression/literal marker. */\nfunction isDefaultValue(value: unknown): value is DefaultValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"kind\" in value &&\n ((value as { kind: unknown }).kind === \"literal\" ||\n (value as { kind: unknown }).kind === \"expression\")\n );\n}\n\n/** True when an expression carries bound parameters (illegal in a DDL default). */\nfunction bindsParameters(value: DefaultValue): boolean {\n return (\n value.kind === \"expression\" &&\n typeof value.expression === \"object\" &&\n \"parts\" in value.expression\n );\n}\n\n/**\n * A referential action for a foreign key's `ON DELETE` / `ON UPDATE` clause.\n * Dialect-neutral tokens rendered uppercase at the DDL edge (mirrors\n * SQLAlchemy's `ForeignKey(ondelete=..., onupdate=...)`).\n */\nexport type FkAction = \"cascade\" | \"restrict\" | \"set null\" | \"set default\" | \"no action\";\n\n/**\n * A resolved foreign-key reference: the target `table.column` plus optional\n * referential actions. Produced by `Column.references(\"table.column\", ...)`.\n */\nexport interface ForeignKeyRef {\n readonly table: string;\n readonly column: string;\n readonly onDelete?: FkAction | undefined;\n readonly onUpdate?: FkAction | undefined;\n}\n\n/** Options for a foreign-key reference (referential actions). */\nexport interface ForeignKeyOptions {\n readonly onDelete?: FkAction | undefined;\n readonly onUpdate?: FkAction | undefined;\n}\n\n/** Parse a `\"table.column\"` reference string into a {@link ForeignKeyRef}. */\nfunction parseReference(ref: string, options?: ForeignKeyOptions): ForeignKeyRef {\n const dot = ref.lastIndexOf(\".\");\n if (dot <= 0 || dot === ref.length - 1) {\n throw new Error(`Invalid foreign key reference \"${ref}\"; expected \"table.column\".`);\n }\n return {\n table: ref.slice(0, dot),\n column: ref.slice(dot + 1),\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n };\n}\n\n/**\n * A typed column builder. Holds runtime metadata (structured `type`, `flags`,\n * `default`, `onUpdate`, foreign-key `reference`) and a phantom static type `T`\n * used purely for inference.\n */\nclass Column<T, F extends ColumnFlags = ColumnFlags> {\n /** Phantom: never read at runtime, only inspected by the type system. */\n declare readonly [TYPE]: T;\n\n constructor(\n readonly type: ColumnType,\n readonly flags: F,\n /** The default applied on insert, or `null` for none. */\n readonly defaultValue: DefaultValue | null = null,\n /** The value re-applied on update (e.g. `updated_at`), or `null`. */\n readonly onUpdateValue: DefaultValue | null = null,\n /** The foreign-key reference this column points to, or `null` for none. */\n readonly reference: ForeignKeyRef | null = null,\n /** An explicit database column name overriding the property name, or `null`. */\n readonly dbName: string | null = null,\n ) {}\n\n /** Clone this column with one facet replaced, carrying every other over. */\n private derive<F2 extends ColumnFlags>(patch: {\n flags?: F2;\n defaultValue?: DefaultValue | null;\n onUpdateValue?: DefaultValue | null;\n reference?: ForeignKeyRef | null;\n dbName?: string | null;\n }): Column<T, F2> {\n return new Column<T, F2>(\n this.type,\n (patch.flags ?? this.flags) as F2,\n patch.defaultValue !== undefined ? patch.defaultValue : this.defaultValue,\n patch.onUpdateValue !== undefined ? patch.onUpdateValue : this.onUpdateValue,\n patch.reference !== undefined ? patch.reference : this.reference,\n patch.dbName !== undefined ? patch.dbName : this.dbName,\n );\n }\n\n primaryKey(): Column<T, F & { primaryKey: true; hasDefault: true }> {\n return this.derive({ flags: { ...this.flags, primaryKey: true, hasDefault: true } });\n }\n\n notNull(): Column<T, F & { notNull: true }> {\n return this.derive({ flags: { ...this.flags, notNull: true } });\n }\n\n /**\n * Add a `UNIQUE` constraint to the column (mirrors SQLAlchemy's\n * `mapped_column(unique=True)`). DDL-only — does not change the inferred type.\n */\n unique(): Column<T, F & { unique: true }> {\n return this.derive({ flags: { ...this.flags, unique: true } });\n }\n\n /**\n * Map this property to a differently-named database column, à la SQLAlchemy's\n * `mapped_column(\"consumer_name\")` (Django's `db_column`, Prisma's `@map`).\n *\n * The override applies everywhere the name reaches SQL — select, insert,\n * update, delete, where, order by, group by, returning, conflict targets, the\n * migration IR and the drift check — while the TypeScript row keeps the\n * property name. Use it to keep a `snake_case` schema behind a `camelCase`\n * model; {@link Model.naming} does the same for a whole table at once.\n *\n * @param dbName The real column name in the database.\n * @returns A new column bound to that name.\n * @throws Error When `dbName` is empty.\n *\n * @example\n * ```ts\n * class ApiKey extends Model {\n * static tablename = \"api_keys\";\n * consumerName = column.text().name(\"consumer_name\").notNull();\n * }\n * ```\n */\n name(dbName: string): Column<T, F> {\n if (dbName.length === 0) {\n throw new Error(\"column.name() requires a non-empty database column name.\");\n }\n return this.derive({ dbName });\n }\n\n /**\n * Declare a foreign-key reference to another table's column, à la SQLAlchemy's\n * `mapped_column(ForeignKey(\"table.column\", ondelete=...))`. DDL-only — does\n * not change the inferred type.\n *\n * @param ref The target as `\"table.column\"` (e.g. `\"users.id\"`).\n * @param options Optional `onDelete` / `onUpdate` referential actions.\n * @returns A new column carrying the reference.\n * @throws Error When `ref` is not a valid `\"table.column\"` string.\n */\n references(ref: string, options?: ForeignKeyOptions): Column<T, F> {\n return this.derive({ reference: parseReference(ref, options) });\n }\n\n /**\n * Set the insert-time default: a constant value of type `T`, or a portable\n * server-side expression from {@link sql} (e.g. `sql.now()`, `sql.uuidv4()`).\n *\n * @param value The literal default, or a {@link sql} expression.\n * @returns A new column carrying the default.\n * @throws Error When given a `sql.expr` fragment — a `DEFAULT` clause has\n * nowhere to bind parameters; use `sql.raw()` for a verbatim expression.\n */\n default(value: T | DefaultValue): Column<T, F & { hasDefault: true }> {\n const resolved: DefaultValue = isDefaultValue(value)\n ? value\n : { kind: \"literal\", value };\n if (bindsParameters(resolved)) {\n throw new Error(\n \"sql.expr`...` binds parameters and cannot be a column default — use sql.raw() for a verbatim DEFAULT expression.\",\n );\n }\n return this.derive({\n flags: { ...this.flags, hasDefault: true },\n defaultValue: resolved,\n });\n }\n\n /**\n * Re-apply a value whenever the row is updated (e.g. an `updated_at` column\n * with `sql.now()`). Mirrors SQLAlchemy's `onupdate`.\n *\n * @param value The literal value, or a {@link sql} expression.\n * @returns A new column carrying the on-update value.\n * @throws Error When given a `sql.expr` fragment (see {@link Column.default}).\n */\n onUpdate(value: T | DefaultValue): Column<T, F> {\n const resolved: DefaultValue = isDefaultValue(value)\n ? value\n : { kind: \"literal\", value };\n if (bindsParameters(resolved)) {\n throw new Error(\n \"sql.expr`...` binds parameters and cannot be an onUpdate default — use sql.raw() for a verbatim expression.\",\n );\n }\n return this.derive({ onUpdateValue: resolved });\n }\n}\n\n/** Build a `Column` of static type `T` from a kind + optional meta. */\nfunction makeColumn<T>(\n kind: ColumnTypeKind,\n meta: ColumnTypeMeta = {},\n): Column<T, ColumnFlags> {\n return new Column<T, ColumnFlags>({ kind, meta }, DEFAULT_FLAGS);\n}\n\n/**\n * Column factory mirroring SQLAlchemy's typed column constructors. Each entry\n * pairs a distinct SQL type with the TypeScript type it maps to.\n *\n * Notable mappings:\n * - `varchar(n)` (`VARCHAR(n)`) is distinct from `text` (`TEXT`).\n * - `bigInteger` maps to `bigint` (not `number`) to keep 64-bit precision.\n * - `numeric`/`decimal` map to `string` — JavaScript has no exact decimal, and\n * stringifying preserves precision instead of losing it to a float.\n * - `json<T>()` carries the parsed value type; `jsonb` is the PostgreSQL variant.\n * - `enum(...)` infers a string-literal union from its values.\n */\nexport const column = {\n /** `SMALLINT` → `number`. */\n smallInteger: (): Column<number, ColumnFlags> => makeColumn<number>(\"smallint\"),\n /** `INTEGER` → `number`. */\n integer: (): Column<number, ColumnFlags> => makeColumn<number>(\"integer\"),\n /** `BIGINT` → `bigint` (64-bit precision preserved). */\n bigInteger: (): Column<bigint, ColumnFlags> => makeColumn<bigint>(\"bigint\"),\n /** `NUMERIC(precision, scale)` → `string` (exact decimal, no float loss). */\n numeric: (precision?: number, scale?: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"numeric\", { precision, scale }),\n /** Alias of {@link column.numeric}. */\n decimal: (precision?: number, scale?: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"numeric\", { precision, scale }),\n /** `REAL` → `number`. */\n real: (): Column<number, ColumnFlags> => makeColumn<number>(\"real\"),\n /** `DOUBLE PRECISION` → `number`. */\n double: (): Column<number, ColumnFlags> => makeColumn<number>(\"double\"),\n /** `VARCHAR(length)` → `string`. Distinct from {@link column.text}. */\n varchar: (length: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"varchar\", { length }),\n /** Alias of {@link column.varchar} (SQLAlchemy's `String`). */\n string: (length: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"varchar\", { length }),\n /** `CHAR(length)` → `string` (fixed-width). */\n char: (length: number): Column<string, ColumnFlags> =>\n makeColumn<string>(\"char\", { length }),\n /** `TEXT` → `string` (unbounded). Distinct from {@link column.varchar}. */\n text: (): Column<string, ColumnFlags> => makeColumn<string>(\"text\"),\n /** `BOOLEAN` → `boolean`. */\n boolean: (): Column<boolean, ColumnFlags> => makeColumn<boolean>(\"boolean\"),\n /** `DATE` → `Date`. */\n date: (): Column<Date, ColumnFlags> => makeColumn<Date>(\"date\"),\n /** `TIME` → `string`. Pass `{ timezone: true }` for `WITH TIME ZONE`. */\n time: (options?: { timezone?: boolean }): Column<string, ColumnFlags> =>\n makeColumn<string>(\"time\", { withTimezone: options?.timezone }),\n /**\n * `DATETIME`/`TIMESTAMP` → `Date` (SQLAlchemy's generic `DateTime`). Pass\n * `{ timezone: true }` for `WITH TIME ZONE`. Pair with `.default(sql.now())`\n * and `.onUpdate(sql.now())` for managed `created_at`/`updated_at` columns.\n */\n datetime: (options?: { timezone?: boolean }): Column<Date, ColumnFlags> =>\n makeColumn<Date>(\"datetime\", { withTimezone: options?.timezone }),\n /** `TIMESTAMP` → `Date` (SQL-specific). Pass `{ timezone: true }`. */\n timestamp: (options?: { timezone?: boolean }): Column<Date, ColumnFlags> =>\n makeColumn<Date>(\"timestamp\", { withTimezone: options?.timezone }),\n /** `BLOB`/`BYTEA` → `Uint8Array`. */\n blob: (): Column<Uint8Array, ColumnFlags> => makeColumn<Uint8Array>(\"blob\"),\n /** `JSON` → the given parsed value type `T` (defaults to `unknown`). */\n json: <T = unknown>(): Column<T, ColumnFlags> => makeColumn<T>(\"json\"),\n /** `JSONB` (PostgreSQL) → the given parsed value type `T`. */\n jsonb: <T = unknown>(): Column<T, ColumnFlags> =>\n makeColumn<T>(\"json\", { jsonb: true }),\n /** `UUID` → `string`. */\n uuid: (): Column<string, ColumnFlags> => makeColumn<string>(\"uuid\"),\n /** `ENUM(...values)` → a string-literal union of the given values. */\n enum: <const E extends string>(...values: E[]): Column<E, ColumnFlags> =>\n makeColumn<E>(\"enum\", { values }),\n /**\n * A PostgreSQL array column (`text[]`, `integer[]`) → `T[]`.\n *\n * PostgreSQL only: SQLite and MySQL have no native array type, and rendering\n * one as JSON there would give the same model different semantics per dialect\n * (`@>` and `&&` work on one and not the other), so the DDL renderer throws\n * for those dialects instead of falling back silently.\n *\n * @param element The element column (its type, not its flags, is what is used).\n * @returns A column whose inferred type is an array of the element's type.\n *\n * @example\n * ```ts\n * class ApiKey extends Model {\n * static tablename = \"api_keys\";\n * scopes = column.array(column.text()).notNull().default([\"send\"]);\n * }\n * ```\n */\n array: <T>(element: Column<T, ColumnFlags>): Column<T[], ColumnFlags> =>\n makeColumn<T[]>(\"array\", { element: element.type }),\n} as const;\n\n/**\n * A table-level constraint declared via a model's `static tableArgs`. Mirrors\n * SQLAlchemy's `__table_args__` entries (`UniqueConstraint`, `ForeignKeyConstraint`).\n * Use the {@link unique} and {@link foreignKey} helpers to build these.\n */\nexport type TableConstraint =\n | {\n readonly kind: \"unique\";\n readonly name?: string | undefined;\n readonly columns: readonly string[];\n }\n | {\n readonly kind: \"foreignKey\";\n readonly name?: string | undefined;\n readonly columns: readonly string[];\n readonly refTable: string;\n readonly refColumns: readonly string[];\n readonly onDelete?: FkAction | undefined;\n readonly onUpdate?: FkAction | undefined;\n };\n\n/**\n * Declare a (possibly composite) `UNIQUE` table constraint over the given\n * columns. Mirrors SQLAlchemy's `UniqueConstraint(\"a\", \"b\")`.\n *\n * @param columns The column names covered by the constraint.\n * @returns A unique {@link TableConstraint}.\n * @throws Error When no columns are given.\n */\nexport function unique(...columns: string[]): TableConstraint {\n if (columns.length === 0) {\n throw new Error(\"unique() requires at least one column.\");\n }\n return { kind: \"unique\", columns };\n}\n\n/**\n * Declare a (possibly composite) foreign-key table constraint. Mirrors\n * SQLAlchemy's `ForeignKeyConstraint([...], [...], ondelete=...)`.\n *\n * @param columns The local column names.\n * @param refTable The referenced table name.\n * @param refColumns The referenced column names (same length as `columns`).\n * @param options Optional constraint `name` and referential actions.\n * @returns A foreign-key {@link TableConstraint}.\n * @throws Error When the column arrays are empty or mismatched in length.\n */\nexport function foreignKey(\n columns: string[],\n refTable: string,\n refColumns: string[],\n options?: { name?: string; onDelete?: FkAction; onUpdate?: FkAction },\n): TableConstraint {\n if (columns.length === 0 || columns.length !== refColumns.length) {\n throw new Error(\n \"foreignKey() requires matching, non-empty local and referenced column lists.\",\n );\n }\n return {\n kind: \"foreignKey\",\n name: options?.name,\n columns,\n refTable,\n refColumns,\n onDelete: options?.onDelete,\n onUpdate: options?.onUpdate,\n };\n}\n\n/**\n * How property names map to database column names when a column declares no\n * explicit {@link Column.name}.\n *\n * - `\"preserve\"` (default) — the column name is the property name, verbatim.\n * - `\"snake_case\"` — `consumerName` becomes `consumer_name`.\n */\nexport type NamingStrategy = \"preserve\" | \"snake_case\";\n\n/** Convert a `camelCase` / `PascalCase` identifier to `snake_case`. */\nexport function toSnakeCase(name: string): string {\n return name\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1_$2\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .toLowerCase();\n}\n\n/** Base class every model extends, SQLAlchemy-declarative style. */\n// biome-ignore lint/complexity/noStaticOnlyClass: declarative base users subclass; column fields live on instances.\nexport abstract class Model {\n static tablename: string;\n /**\n * Optional table-level constraints (composite unique / foreign keys), returned\n * by a thunk so forward references resolve lazily. Mirrors SQLAlchemy's\n * `__table_args__`.\n */\n static tableArgs?: () => readonly TableConstraint[];\n /**\n * How to derive column names from property names (default `\"preserve\"`). Set\n * `\"snake_case\"` to keep a `snake_case` schema behind a `camelCase` model\n * without annotating every column; {@link Column.name} overrides it per column.\n */\n static naming?: NamingStrategy;\n}\n\n/** Memoized column maps, keyed by model class (identity is stable per class). */\nconst columnsCache = new WeakMap<ModelClass, Record<string, Column<unknown>>>();\n\n/**\n * Reflect a model class into its column map at runtime, keyed by column name.\n *\n * Instantiates the class once and collects every field that is a `Column`. Used\n * by the serialization layer and (Phase 6) the migration schema reflector.\n *\n * The result is **memoized per class** — a model's columns never change at\n * runtime, and this is called once per row on hot read paths (coercion, joins),\n * so re-instantiating the class every time would dominate large result sets.\n *\n * @param model The model class (subclass of `Model`).\n * @returns A record of column name → `Column` instance (do not mutate).\n */\nexport function columnsOf(model: ModelClass): Record<string, Column<unknown>> {\n const cached = columnsCache.get(model);\n if (cached) return cached;\n const instance = new (model as new () => Model)();\n const out: Record<string, Column<unknown>> = {};\n for (const [key, value] of Object.entries(instance)) {\n if (value instanceof Column) {\n out[key] = value as Column<unknown>;\n }\n }\n columnsCache.set(model, out);\n return out;\n}\n\n/** A mapping between property names and database column names. */\nexport type NameMap = Readonly<Record<string, string>>;\n\n/** Memoized property → column maps (`null` when every name is the identity). */\nconst nameMapCache = new WeakMap<ModelClass, NameMap | null>();\n\n/** Memoized column → property maps (`null` when every name is the identity). */\nconst propMapCache = new WeakMap<ModelClass, NameMap | null>();\n\n/**\n * The property → database-column map for a model, or `null` when every column\n * keeps its property name.\n *\n * `null` is the common case and the fast path: builders and the row coercer skip\n * translation entirely, so a model that renames nothing costs nothing. The map\n * is memoized per class, like {@link columnsOf}.\n *\n * @param model The model class.\n * @returns The name map, or `null` when no column is renamed.\n * @throws Error When two properties resolve to the same column name.\n */\nexport function columnNamesOf(model: ModelClass): NameMap | null {\n const cached = nameMapCache.get(model);\n if (cached !== undefined) return cached;\n const strategy: NamingStrategy = model.naming ?? \"preserve\";\n const map: Record<string, string> = {};\n const seen = new Map<string, string>();\n let renamed = false;\n for (const [prop, col] of Object.entries(columnsOf(model))) {\n const dbName = col.dbName ?? (strategy === \"snake_case\" ? toSnakeCase(prop) : prop);\n const collision = seen.get(dbName);\n if (collision !== undefined) {\n throw new Error(\n `${model.tablename}: properties \"${collision}\" and \"${prop}\" both map to column \"${dbName}\".`,\n );\n }\n seen.set(dbName, prop);\n map[prop] = dbName;\n if (dbName !== prop) renamed = true;\n }\n const result = renamed ? (map as NameMap) : null;\n nameMapCache.set(model, result);\n return result;\n}\n\n/**\n * The database-column → property map for a model, or `null` when every column\n * keeps its property name. The inverse of {@link columnNamesOf}, used to map\n * driver rows back into property space.\n *\n * @param model The model class.\n * @returns The inverse name map, or `null` when no column is renamed.\n */\nexport function columnPropsOf(model: ModelClass): NameMap | null {\n const cached = propMapCache.get(model);\n if (cached !== undefined) return cached;\n const forward = columnNamesOf(model);\n let result: NameMap | null = null;\n if (forward) {\n const inverse: Record<string, string> = {};\n for (const [prop, dbName] of Object.entries(forward)) inverse[dbName] = prop;\n result = inverse as NameMap;\n }\n propMapCache.set(model, result);\n return result;\n}\n\n/** Resolve one property name to its database column name. */\nexport function dbColumn(names: NameMap | null | undefined, prop: string): string {\n return names?.[prop] ?? prop;\n}\n\n/** Pull the static type out of a Column. */\ntype ColType<C> = C extends Column<infer T, infer _F> ? T : never;\n\n/** Keys of the model instance whose values are Columns. */\ntype ColumnKeys<M> = {\n [K in keyof M]: M[K] extends Column<unknown, ColumnFlags> ? K : never;\n}[keyof M];\n\n/** Constructor type for a Model subclass. */\ntype ModelClass = (new () => Model) & {\n tablename: string;\n tableArgs?: () => readonly TableConstraint[];\n naming?: NamingStrategy;\n};\n\n/** Flatten an intersection into a single object literal for clean inference. */\ntype Simplify<T> = { [K in keyof T]: T[K] } & {};\n\n/** The nullability-aware value a column contributes to a row. */\ntype ColValue<Col> = Col extends Column<infer T, infer F>\n ? F extends { notNull: true } | { primaryKey: true }\n ? T\n : T | null\n : never;\n\n/** True when a column has a default (or is a PK) — i.e. optional on insert. */\ntype HasDefault<Col> = Col extends Column<unknown, infer F>\n ? F extends { hasDefault: true }\n ? true\n : false\n : false;\n\n/** True when a column accepts NULL — neither `notNull` nor a primary key. */\ntype IsNullable<Col> = Col extends Column<unknown, infer F>\n ? F extends { notNull: true } | { primaryKey: true }\n ? false\n : true\n : false;\n\n/**\n * Keys of the model whose columns may be omitted on insert.\n *\n * A column is optional when it has a default **or** when it accepts NULL: SQL\n * applies `NULL` to an omitted column that declares no other default, so\n * requiring the caller to write `note: null` adds noise that reads like a\n * deliberate decision to blank the column. Passing `null` explicitly still works.\n */\ntype OptionalInsertKeys<I> = {\n [K in ColumnKeys<I>]: HasDefault<I[K]> extends true\n ? K\n : IsNullable<I[K]> extends true\n ? K\n : never;\n}[ColumnKeys<I>];\n\n/**\n * Infer the SELECT row shape from a model class: every column field becomes its\n * mapped static type. Columns marked notNull/primaryKey are non-nullable; others\n * are `T | null` (SQL semantics — an unconstrained column can be NULL).\n */\nexport type InferModel<C extends ModelClass> = {\n [K in ColumnKeys<InstanceType<C>>]: ColValue<InstanceType<C>[K]>;\n};\n\n/**\n * Infer the INSERT shape: a column is optional when it has a default (or is a PK)\n * **or** when it is nullable — matching SQL, where an omitted column with no\n * `DEFAULT` clause is written as `NULL`. Only `notNull` columns without a default\n * are required. Nullability is preserved on both sides.\n */\nexport type InferInsert<C extends ModelClass> = Simplify<\n {\n [K in OptionalInsertKeys<InstanceType<C>>]?: ColValue<InstanceType<C>[K]>;\n } & {\n [K in Exclude<\n ColumnKeys<InstanceType<C>>,\n OptionalInsertKeys<InstanceType<C>>\n >]: ColValue<InstanceType<C>[K]>;\n }\n>;\n\nexport { Column, type ColType, type ColumnFlags, type ModelClass };\n\nexport {\n and,\n col,\n type CondNode,\n type Condition,\n Expression,\n type ExprNode,\n fn,\n isCondition,\n isExpression,\n not,\n or,\n toCondNode,\n val,\n type WhereArg,\n} from \"./conditions.js\";\n\nexport {\n Agg,\n type AggregateTerm,\n avg,\n count,\n type LockClause,\n type LockOptions,\n max,\n min,\n isSubquery,\n type Operator,\n type OperatorsFor,\n OPERATORS,\n type OrderTerm,\n type SelectNode,\n SelectBuilder,\n select,\n type SortDirection,\n type Subquery,\n sum,\n type WhereInput,\n} from \"./query.js\";\n\nexport {\n DeleteBuilder,\n type DeleteNode,\n del,\n InsertBuilder,\n type InsertNode,\n insert,\n type OnConflict,\n type OnConflictOptions,\n type OnConflictUpdateOptions,\n type Returning,\n type WritePatch,\n type WriteValues,\n UpdateBuilder,\n type UpdateNode,\n update,\n} from \"./mutations.js\";\n\nexport {\n type Dialect,\n detectDialect,\n InvalidDatabaseUrl,\n type ParsedDatabaseUrl,\n parseDatabaseUrl,\n} from \"./url.js\";\n\nexport {\n fromDict,\n parse,\n stringify,\n toDict,\n toJSON,\n ValidationError,\n} from \"./serialize.js\";\n\nexport {\n BaseDialect,\n type CompiledQuery,\n getDialect,\n MysqlDialect,\n Params,\n PostgresDialect,\n type QueryNode,\n SqliteDialect,\n} from \"./dialect.js\";\n\nexport {\n type ColRef,\n join,\n JoinBuilder,\n type JoinClause,\n type JoinNode,\n type JoinOn,\n type JoinSelection,\n type JoinWhereInput,\n type Sources,\n} from \"./join.js\";\n\nexport {\n BaseRepository,\n type PaginationFilter,\n type PaginationResult,\n RecordNotFound,\n} from \"./repository.js\";\n\nexport {\n ActiveRecord,\n type ActiveRecordManager,\n activeRecord,\n} from \"./active-record.js\";\n\nexport {\n type BelongsTo,\n belongsTo,\n type HasMany,\n hasMany,\n loadRelations,\n type Relation,\n type RelationValue,\n type WithRelations,\n} from \"./relations.js\";\n\nexport {\n AsyncEngine,\n AsyncResult,\n AsyncSession,\n type AsyncDriver,\n BetterSqliteDriver,\n createEngine,\n createSyncEngine,\n type DriverResult,\n type EngineOptions,\n type Executable,\n NoResultError,\n NodeSqliteDriver,\n type NoticeLogger,\n type PoolOptions,\n QueryExecutionError,\n type QueryLogger,\n type ReservedAsyncDriver,\n type RowOf,\n type SyncDriver,\n SyncEngine,\n SyncResult,\n SyncSession,\n toAsyncDriver,\n} from \"./engine.js\";\n"]}