tempest-db-js 0.1.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.
- package/LICENSE +21 -0
- package/README.md +54 -0
- package/dist/chunk-F36ZSQAN.js +1360 -0
- package/dist/chunk-F36ZSQAN.js.map +1 -0
- package/dist/index.cjs +1411 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1084 -0
- package/dist/index.d.ts +1084 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/index.cjs +1038 -0
- package/dist/migrations/index.cjs.map +1 -0
- package/dist/migrations/index.d.cts +391 -0
- package/dist/migrations/index.d.ts +391 -0
- package/dist/migrations/index.js +925 -0
- package/dist/migrations/index.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/conditions.ts","../src/query.ts","../src/mutations.ts","../src/url.ts","../src/serialize.ts","../src/dialect.ts","../src/join.ts","../src/repository.ts","../src/relations.ts","../src/engine.ts","../src/index.ts"],"names":["column","sql","b"],"mappings":"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","file":"chunk-F36ZSQAN.js","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 { 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/** 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\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/** 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 type { InferModel, ModelClass } 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/** 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 readonly where: CondNode | undefined;\n readonly orderBy: readonly OrderTerm[];\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n}\n\n// --------------------------------------------------------------------------\n// where input typing (Phase 3 — operators typed per column type)\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 /** One of the given values (`IN`). */\n in?: readonly T[];\n /** None of the given values (`NOT IN`). */\n notIn?: readonly 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). */\n like?: string;\n /** `ILIKE` pattern (case-insensitive). */\n ilike?: string;\n}\n\n/**\n * The operator object allowed for a column of (non-null) type `T`:\n * - `string` → equality, `in`, `like`/`ilike`\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 [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 \"in\",\n \"notIn\",\n \"between\",\n \"isNull\",\n] as const;\n\n/** One supported operator name. */\nexport type Operator = (typeof OPERATORS)[number];\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> {\n /** Phantom: the result element type, read only by the type system. */\n declare readonly __row: Proj;\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> {\n return new SelectBuilder<Full, Proj>({ ...this.node, ...patch }, this.source);\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> {\n return this.with({ where: toCondNode(input as Record<string, unknown>) });\n }\n\n /** Order by a column of `Full`. */\n orderBy(\n column: keyof Full & string,\n direction: SortDirection = \"asc\",\n ): SelectBuilder<Full, Proj> {\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> {\n return this.with({ limit: n });\n }\n\n /** Skip the first `n` rows. */\n offset(n: number): SelectBuilder<Full, Proj> {\n return this.with({ offset: n });\n }\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 where: undefined,\n orderBy: [],\n limit: undefined,\n offset: undefined,\n },\n model,\n );\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 type { InferInsert, InferModel, ModelClass } from \"./index.js\";\nimport type { WhereInput } from \"./query.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// INSERT\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}\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 /** Provide one row or many rows to insert, typed by the insert shape. */\n values(rows: Ins | readonly Ins[]): InsertBuilder<Full, Ins, Ret> {\n const list = (Array.isArray(rows) ? rows : [rows]) as readonly Record<\n string,\n unknown\n >[];\n return this.with<Ret>({ values: list });\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 },\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}\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 /** The columns to write. Partial — only the given columns change. */\n set(values: Partial<Full>): UpdateBuilder<Full, Guarded, Ret> {\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 },\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}\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 },\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\";\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), 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};\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/** Parse a PostgreSQL URL via the WHATWG URL parser (normalize scheme first). */\nfunction parsePostgres(\n raw: string,\n driver: string | null,\n rest: string,\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(`postgresql:${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: \"postgresql\",\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 return dialect === \"sqlite\"\n ? parseSqlite(url, driver, rest)\n : parsePostgres(url, driver, rest);\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 — 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 { type Column, type InferModel, type ModelClass, columnsOf } 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 \"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/**\n * Coerce a raw driver row into native row values, by column type. 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 pass through untouched.\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 columns = columnsOf(model);\n const out: Record<string, unknown> = {};\n for (const [name, value] of Object.entries(raw)) {\n const col = columns[name];\n out[name] = col ? decodeValue(col, value) : value;\n }\n return out as InferModel<C>;\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 } from \"./conditions.js\";\nimport type { JoinNode } from \"./join.js\";\nimport type { DeleteNode, InsertNode, UpdateNode } from \"./mutations.js\";\nimport { OPERATORS, type SelectNode } from \"./query.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/** Collects bound parameters and renders placeholders in dialect style. */\nclass 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 * 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: \"sqlite\" | \"postgresql\";\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 /** Quote an identifier (column/table) for the active dialect. */\n protected quoteId(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\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 /** Render a qualified `alias.column` ref as `\"alias\".\"column\"`. */\n private qualify(ref: string): string {\n const dot = ref.indexOf(\".\");\n if (dot === -1) return this.quoteId(ref);\n return `${this.quoteId(ref.slice(0, dot))}.${this.quoteId(ref.slice(dot + 1))}`;\n }\n\n // ---- statements -------------------------------------------------------\n\n private compileSelect(node: SelectNode, params: Params): string {\n const cols =\n node.columns === \"*\" ? \"*\" : node.columns.map((c) => this.quoteId(c)).join(\", \");\n let sql = `SELECT ${cols} FROM ${this.quoteId(node.table)}`;\n\n const where = this.compileCondition(node.where, params, (k) => this.quoteId(k));\n if (where) sql += ` WHERE ${where}`;\n\n if (node.orderBy.length > 0) {\n const terms = node.orderBy\n .map(\n (t) => `${this.quoteId(t.column)} ${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 private compileInsert(node: InsertNode, params: Params): string {\n const columns = node.values.length > 0 ? Object.keys(node.values[0] as object) : [];\n const colSql = columns.map((c) => this.quoteId(c)).join(\", \");\n const rowsSql = node.values\n .map(\n (row) =>\n `(${columns.map((c) => params.bind((row as Record<string, unknown>)[c] ?? null)).join(\", \")})`,\n )\n .join(\", \");\n let sql = `INSERT INTO ${this.quoteId(node.table)} (${colSql}) VALUES ${rowsSql}`;\n sql += this.compileReturning(node.returning);\n return sql;\n }\n\n private compileUpdate(node: UpdateNode, params: Params): string {\n const sets = Object.entries(node.set)\n .map(([col, value]) => `${this.quoteId(col)} = ${params.bind(value)}`)\n .join(\", \");\n let sql = `UPDATE ${this.quoteId(node.table)} SET ${sets}`;\n const where = this.compileCondition(node.where, params, (k) => this.quoteId(k));\n if (where) sql += ` WHERE ${where}`;\n sql += this.compileReturning(node.returning);\n return sql;\n }\n\n private compileDelete(node: DeleteNode, params: Params): string {\n let sql = `DELETE FROM ${this.quoteId(node.table)}`;\n const where = this.compileCondition(node.where, params, (k) => this.quoteId(k));\n if (where) sql += ` WHERE ${where}`;\n sql += this.compileReturning(node.returning);\n return sql;\n }\n\n private compileJoin(node: JoinNode, params: Params): string {\n const cols = node.selections\n .map((s) => {\n const ref = `${s.alias}.${s.column}`;\n return `${this.qualify(ref)} 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)} = ${this.qualify(r)}`)\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) => this.qualify(k));\n if (where) sql += ` WHERE ${where}`;\n if (node.orderBy.length > 0) {\n const terms = node.orderBy\n .map((t) => `${this.qualify(t.ref)} ${t.direction === \"desc\" ? \"DESC\" : \"ASC\"}`)\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 private compileReturning(returning: readonly string[] | \"*\" | null): string {\n if (returning === null) return \"\";\n if (returning === \"*\") return \" RETURNING *\";\n return ` RETURNING ${returning.map((c) => this.quoteId(c)).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 }\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 \"in\":\n return this.compileIn(id, operand as readonly unknown[], params, false);\n case \"notIn\":\n return this.compileIn(id, operand as readonly unknown[], 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 private compileIn(\n id: string,\n values: readonly unknown[],\n params: Params,\n negate: boolean,\n ): string {\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} ${negate ? \"NOT IN\" : \"IN\"} (${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/** PostgreSQL dialect: `$1` placeholders; native `ILIKE`. */\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\n/** Get a dialect instance by name. */\nexport function getDialect(name: \"sqlite\" | \"postgresql\"): BaseDialect {\n return name === \"sqlite\" ? new SqliteDialect() : new PostgresDialect();\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 { type InferModel, type ModelClass, columnsOf } from \"./index.js\";\nimport type { 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/** `where` filter for a join: keys are `alias.column` refs (object form). */\nexport type JoinWhereInput = Record<string, unknown>;\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}\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 * 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 },\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: Partial<Record<ColRef<S>, unknown>> | 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 },\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 — 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 { type BaseDialect, getDialect } from \"./dialect.js\";\nimport { type ModelClass, columnsOf } from \"./index.js\";\nimport type { JoinBuilder, JoinNode } from \"./join.js\";\nimport type { InsertBuilder, UpdateBuilder } from \"./mutations.js\";\nimport type { SelectBuilder } 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 close(): 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 // biome-ignore lint/suspicious/noExplicitAny: accept an already-open DatabaseSync handle.\n constructor(database: any) {\n this.db = database;\n }\n\n /** Open a `node:sqlite` database at the given path (or `:memory:`). */\n static open(path: string): 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) => unknown;\n };\n return new NodeSqliteDriver(new DatabaseSync(path));\n }\n\n execute(sql: string, params: readonly unknown[]): DriverResult {\n const stmt = this.db.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.db.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.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>;\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 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[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\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/** A synchronous unit of work (SQLite). */\nexport class SyncSession {\n constructor(\n private readonly driver: SyncDriver,\n private readonly dialect: BaseDialect,\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.driver.execute(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.driver.execute(\"BEGIN\", []);\n try {\n const out = fn(this);\n this.driver.execute(\"COMMIT\", []);\n return out;\n } catch (error) {\n this.driver.execute(\"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.driver.execute(`SAVEPOINT ${name}`, []);\n try {\n const out = fn(this);\n this.driver.execute(`RELEASE ${name}`, []);\n return out;\n } catch (error) {\n this.driver.execute(`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 if (this.driver.iterate) {\n for (const raw of this.driver.iterate(sql, params)) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n return;\n }\n for (const raw of this.driver.execute(sql, params).rows) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n }\n\n close(): void {\n this.driver.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 ) {}\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 const { sql, params } = this.dialect.compile(node);\n const inner = this.driver.execute(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 /** 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 if (this.driver.iterate) {\n for await (const raw of this.driver.iterate(sql, params)) {\n yield coerceOne(builder, raw) as RowOf<B>;\n }\n return;\n }\n const result = await this.driver.execute(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 await this.driver.execute(\"BEGIN\", []);\n try {\n const out = await fn(this);\n await this.driver.execute(\"COMMIT\", []);\n return out;\n } catch (error) {\n await this.driver.execute(\"ROLLBACK\", []);\n throw error;\n }\n }\n\n async close(): Promise<void> {\n await this.driver.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/** 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\n/** A synchronous engine (SQLite only). */\nexport class SyncEngine {\n readonly dialect: Dialect = \"sqlite\";\n\n constructor(private readonly driver: SyncDriver) {}\n\n session(): SyncSession {\n return new SyncSession(this.driver, getDialect(\"sqlite\"));\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\n/** An asynchronous engine. */\nexport class AsyncEngine {\n constructor(\n private readonly driver: AsyncDriver,\n readonly dialect: Dialect,\n ) {}\n\n session(): AsyncSession {\n return new AsyncSession(this.driver, getDialect(this.dialect));\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\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. */\nfunction openSqliteDriver(path: string, _options?: EngineOptions): SyncDriver {\n return NodeSqliteDriver.open(path);\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.database ?? \":memory:\", options));\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 );\n }\n // PostgreSQL: postgres.js is lazy-loaded the first time a query runs.\n return new AsyncEngine(createPostgresDriver(parsed.raw, options?.pool), \"postgresql\");\n}\n\n/**\n * PostgreSQL driver backed by postgres.js (lazy-loaded peer dependency). Not\n * exercised by the in-repo test suite (no Postgres in CI), but structurally\n * matches the `AsyncDriver` contract.\n */\nfunction createPostgresDriver(url: string, pool?: PoolOptions): AsyncDriver {\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, number> = {};\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 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 const rows = (await client.unsafe(sql, params as unknown[])) as Record<\n string,\n unknown\n >[];\n return {\n rows: Array.from(rows),\n changes: (rows as { count?: number }).count ?? rows.length,\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\nconst DEFAULT_FLAGS: ColumnFlags = {\n primaryKey: false,\n notNull: false,\n hasDefault: 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\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}\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.\n */\nexport type PortableExpression =\n | \"now\"\n | \"current_date\"\n | \"current_time\"\n | \"uuidv4\"\n | { readonly raw: 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/** Portable server-side default expressions, à la SQLAlchemy's `func`. */\nexport const sql = {\n /** Current timestamp at insert (`CURRENT_TIMESTAMP` / `now()`). */\n now: (): DefaultValue => ({ kind: \"expression\", expression: \"now\" }),\n /** Current date. */\n currentDate: (): DefaultValue => ({ kind: \"expression\", expression: \"current_date\" }),\n /** Current time. */\n currentTime: (): DefaultValue => ({ kind: \"expression\", expression: \"current_time\" }),\n /** A freshly generated UUID v4 (`gen_random_uuid()` / portable fallback). */\n uuidv4: (): DefaultValue => ({ kind: \"expression\", expression: \"uuidv4\" }),\n /** Escape hatch: a verbatim SQL expression rendered as-is. */\n raw: (expression: string): DefaultValue => ({\n kind: \"expression\",\n expression: { raw: expression },\n }),\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/**\n * A typed column builder. Holds runtime metadata (structured `type`, `flags`,\n * `default`, `onUpdate`) and a phantom static type `T` 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 ) {}\n\n primaryKey(): Column<T, F & { primaryKey: true; hasDefault: true }> {\n return new Column(\n this.type,\n { ...this.flags, primaryKey: true, hasDefault: true },\n this.defaultValue,\n this.onUpdateValue,\n );\n }\n\n notNull(): Column<T, F & { notNull: true }> {\n return new Column(\n this.type,\n { ...this.flags, notNull: true },\n this.defaultValue,\n this.onUpdateValue,\n );\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 default(value: T | DefaultValue): Column<T, F & { hasDefault: true }> {\n const resolved: DefaultValue = isDefaultValue(value)\n ? value\n : { kind: \"literal\", value };\n return new Column(\n this.type,\n { ...this.flags, hasDefault: true },\n resolved,\n this.onUpdateValue,\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 onUpdate(value: T | DefaultValue): Column<T, F> {\n const resolved: DefaultValue = isDefaultValue(value)\n ? value\n : { kind: \"literal\", value };\n return new Column(this.type, this.flags, this.defaultValue, 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} as const;\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\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 * @param model The model class (subclass of `Model`).\n * @returns A record of column name → `Column` instance.\n */\nexport function columnsOf(model: ModelClass): Record<string, Column<unknown>> {\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 return out;\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) & { tablename: string };\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/** Keys of the model whose columns are optional on insert. */\ntype OptionalInsertKeys<I> = {\n [K in ColumnKeys<I>]: HasDefault<I[K]> extends true ? K : 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: columns with a default (or PK) are optional; the rest\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 type CondNode,\n type Condition,\n isCondition,\n not,\n or,\n toCondNode,\n type WhereArg,\n} from \"./conditions.js\";\n\nexport {\n type Operator,\n type OperatorsFor,\n OPERATORS,\n type OrderTerm,\n type SelectNode,\n SelectBuilder,\n select,\n type SortDirection,\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 Returning,\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 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 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 PoolOptions,\n type RowOf,\n type SyncDriver,\n SyncEngine,\n SyncResult,\n SyncSession,\n} from \"./engine.js\";\n"]}
|