tempest-db-js 0.3.0 → 0.4.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/README.md +3 -2
- package/dist/bin.cjs +342 -14
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +2 -2
- package/dist/{chunk-OP7FRDI5.js → chunk-43XL66JG.js} +352 -14
- package/dist/chunk-43XL66JG.js.map +1 -0
- package/dist/{chunk-Q32CBI2A.js → chunk-JR4MLFQN.js} +87 -9
- package/dist/chunk-JR4MLFQN.js.map +1 -0
- package/dist/index.cjs +86 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +102 -3
- package/dist/index.d.ts +102 -3
- package/dist/index.js +1 -1
- package/dist/migrations/index.cjs +403 -16
- package/dist/migrations/index.cjs.map +1 -1
- package/dist/migrations/index.d.cts +51 -12
- package/dist/migrations/index.d.ts +51 -12
- package/dist/migrations/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-OP7FRDI5.js.map +0 -1
- package/dist/chunk-Q32CBI2A.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/migrations/operations.ts","../src/migrations/codegen.ts","../src/migrations/ddl.ts","../src/migrations/diff.ts","../src/migrations/graph.ts","../src/migrations/ir.ts","../src/migrations/introspect.ts","../src/migrations/renames.ts","../src/migrations/runner.ts","../src/migrations/replay.ts","../src/migrations/cli.ts"],"names":[],"mappings":"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","file":"chunk-43XL66JG.js","sourcesContent":["/**\n * tempest-db-js — Phase 6: typed migration operations.\n *\n * Every schema change is a typed `Operation` with a known inverse. This is what\n * gives autogenerated, reversible `down()` and dialect-rendered DDL — never a\n * hand-written `.sql` blob (the anti-Drizzle core).\n */\n\nimport type { ColumnIR, NamedConstraint, TableIR } from \"./ir.js\";\n\n/** A single, reversible schema operation. */\nexport type Operation =\n | { readonly kind: \"create_table\"; readonly table: TableIR }\n | { readonly kind: \"drop_table\"; readonly table: TableIR }\n | { readonly kind: \"rename_table\"; readonly from: string; readonly to: string }\n | { readonly kind: \"add_column\"; readonly table: string; readonly column: ColumnIR }\n | { readonly kind: \"drop_column\"; readonly table: string; readonly column: ColumnIR }\n | {\n readonly kind: \"alter_column\";\n readonly table: string;\n readonly name: string;\n readonly from: ColumnIR;\n readonly to: ColumnIR;\n }\n | {\n readonly kind: \"rename_column\";\n readonly table: string;\n readonly from: string;\n readonly to: string;\n }\n | {\n // Rebuild a table from `from` to `to`. On SQLite this is the batch /\n // table-rebuild path (SQLite cannot ALTER COLUMN); on PostgreSQL it is\n // realized as per-column ALTER/ADD/DROP.\n readonly kind: \"recreate_table\";\n readonly from: TableIR;\n readonly to: TableIR;\n }\n | {\n // Add a table-level unique / foreign-key constraint. On SQLite this needs\n // a table-rebuild (recreate_table); PostgreSQL / MySQL use ALTER TABLE ADD.\n readonly kind: \"add_constraint\";\n readonly table: string;\n readonly constraint: NamedConstraint;\n }\n | {\n readonly kind: \"drop_constraint\";\n readonly table: string;\n readonly constraint: NamedConstraint;\n }\n | { readonly kind: \"execute\"; readonly up: string; readonly down: string | null };\n\n/** Raised when an operation has no safe inverse (e.g. a one-way `execute`). */\nexport class IrreversibleMigration extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"IrreversibleMigration\";\n }\n}\n\n/**\n * Compute the inverse of an operation, for autogenerated `down()`.\n *\n * @param op The forward operation.\n * @returns The operation that undoes it.\n * @throws IrreversibleMigration When `op` cannot be safely reversed.\n */\nexport function invert(op: Operation): Operation {\n switch (op.kind) {\n case \"create_table\":\n return { kind: \"drop_table\", table: op.table };\n case \"drop_table\":\n return { kind: \"create_table\", table: op.table };\n case \"rename_table\":\n return { kind: \"rename_table\", from: op.to, to: op.from };\n case \"add_column\":\n return { kind: \"drop_column\", table: op.table, column: op.column };\n case \"drop_column\":\n return { kind: \"add_column\", table: op.table, column: op.column };\n case \"alter_column\":\n return {\n kind: \"alter_column\",\n table: op.table,\n name: op.name,\n from: op.to,\n to: op.from,\n };\n case \"rename_column\":\n return { kind: \"rename_column\", table: op.table, from: op.to, to: op.from };\n case \"recreate_table\":\n return { kind: \"recreate_table\", from: op.to, to: op.from };\n case \"add_constraint\":\n return { kind: \"drop_constraint\", table: op.table, constraint: op.constraint };\n case \"drop_constraint\":\n return { kind: \"add_constraint\", table: op.table, constraint: op.constraint };\n case \"execute\":\n if (op.down === null) {\n throw new IrreversibleMigration(\"execute() operation has no down SQL\");\n }\n return { kind: \"execute\", up: op.down, down: op.up };\n }\n}\n\n/** Invert a list of operations: reverse order, each inverted. */\nexport function invertAll(ops: readonly Operation[]): Operation[] {\n return [...ops].reverse().map(invert);\n}\n","/**\n * tempest-db-js — Phase 6: migration autogeneration.\n *\n * Turns a diff's `Operation[]` into an editable TypeScript migration file with\n * `up()` and an autogenerated, inverted `down()`. Operations are embedded as\n * plain-data literals (they are JSON-serializable), so the file stays readable\n * and hand-editable — never an opaque `.sql` blob.\n */\n\nimport { type Operation, invertAll } from \"./operations.js\";\n\n/** Inputs for one generated migration file. */\nexport interface MigrationDraft {\n readonly revision: string;\n readonly downRevision: readonly string[];\n readonly label: string;\n readonly operations: readonly Operation[];\n}\n\n/** Serialize operations as an indented array literal for the generated file. */\nfunction renderOps(ops: readonly Operation[]): string {\n if (ops.length === 0) return \"[]\";\n const body = ops.map((op) => ` ${JSON.stringify(op)},`).join(\"\\n\");\n return `[\\n${body}\\n ]`;\n}\n\n/**\n * Render a migration file body as TypeScript source.\n *\n * The generated `down()` inverts `up()`; if any operation is irreversible, the\n * generation still succeeds but `down()` throws at run time with a clear message\n * (so reversibility is never silently broken).\n *\n * @param draft The revision id, parents, label, and forward operations.\n * @returns The migration file source.\n */\nexport function generateMigration(draft: MigrationDraft): string {\n let down: string;\n try {\n down = renderOps(invertAll(draft.operations));\n } catch (error) {\n down = `(() => { throw new Error(${JSON.stringify(\n `irreversible migration: ${(error as Error).message}`,\n )}); })()`;\n }\n\n return `import type { Migration, Op } from \"tempest-db-js/migrations\";\n\nexport const revision = ${JSON.stringify(draft.revision)};\nexport const downRevision: string[] = ${JSON.stringify(draft.downRevision)};\nexport const label = ${JSON.stringify(draft.label)};\n\nconst upOps = ${renderOps(draft.operations)};\n\nconst downOps = ${down};\n\nexport const up = (op: Op): void => {\n for (const operation of upOps) op.run(operation);\n};\n\nexport const down = (op: Op): void => {\n for (const operation of downOps) op.run(operation);\n};\n\nexport default { revision, downRevision, label, up, down } satisfies Migration;\n`;\n}\n\n/** Build a short, stable revision id from a label + parent set. */\nexport function makeRevisionId(label: string, parents: readonly string[]): string {\n // Deterministic non-crypto hash (FNV-1a) — no Date/Math.random (build-stable).\n let hash = 0x811c9dc5;\n for (const ch of `${label}|${[...parents].sort().join(\",\")}`) {\n hash ^= ch.charCodeAt(0);\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash.toString(16).padStart(8, \"0\");\n}\n","/**\n * tempest-db-js — Phase 6/9: DDL rendering.\n *\n * Renders the dialect-neutral IR + operations to concrete SQL per dialect. This\n * is the ONLY place migration SQL is produced — the same operation yields the\n * right DDL for SQLite, PostgreSQL or MySQL.\n */\n\nimport type { ColumnType, DefaultValue, FkAction } from \"../index.js\";\nimport type { Dialect } from \"../url.js\";\nimport type {\n ColumnIR,\n ForeignKeyIR,\n NamedConstraint,\n TableIR,\n UniqueConstraintIR,\n} from \"./ir.js\";\nimport type { Operation } from \"./operations.js\";\n\n/** Quote an identifier for the dialect (backticks on MySQL, double-quotes else). */\nfunction quoteId(name: string, dialect: Dialect): string {\n return dialect === \"mysql\"\n ? `\\`${name.replace(/`/g, \"``\")}\\``\n : `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction quoteLiteral(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\n/** Map a column type to its SQL type string for the dialect. */\nexport function renderColumnType(type: ColumnType, dialect: Dialect): string {\n const { kind, meta } = type;\n if (dialect === \"sqlite\") {\n switch (kind) {\n case \"smallint\":\n case \"integer\":\n case \"bigint\":\n case \"boolean\":\n return \"INTEGER\";\n case \"real\":\n case \"double\":\n return \"REAL\";\n case \"numeric\":\n return \"NUMERIC\";\n case \"blob\":\n return \"BLOB\";\n default:\n return \"TEXT\"; // varchar/char/text/uuid/enum/json/date/time/datetime/timestamp\n }\n }\n if (dialect === \"mysql\") {\n switch (kind) {\n case \"smallint\":\n return \"SMALLINT\";\n case \"integer\":\n return \"INT\";\n case \"bigint\":\n return \"BIGINT\";\n case \"numeric\":\n return meta.precision !== undefined\n ? `DECIMAL(${meta.precision}${meta.scale !== undefined ? `, ${meta.scale}` : \"\"})`\n : \"DECIMAL\";\n case \"real\":\n return \"FLOAT\";\n case \"double\":\n return \"DOUBLE\";\n case \"varchar\":\n return `VARCHAR(${meta.length ?? 255})`;\n case \"char\":\n return `CHAR(${meta.length ?? 255})`;\n case \"text\":\n return \"TEXT\";\n case \"boolean\":\n return \"TINYINT(1)\";\n case \"date\":\n return \"DATE\";\n case \"time\":\n return \"TIME\";\n case \"datetime\":\n case \"timestamp\":\n return \"DATETIME\";\n case \"blob\":\n return \"BLOB\";\n case \"json\":\n return \"JSON\";\n case \"uuid\":\n return \"CHAR(36)\";\n case \"enum\":\n return `ENUM(${(meta.values ?? []).map(quoteLiteral).join(\", \")})`;\n }\n }\n // PostgreSQL\n switch (kind) {\n case \"smallint\":\n return \"SMALLINT\";\n case \"integer\":\n return \"INTEGER\";\n case \"bigint\":\n return \"BIGINT\";\n case \"numeric\":\n return meta.precision !== undefined\n ? `NUMERIC(${meta.precision}${meta.scale !== undefined ? `, ${meta.scale}` : \"\"})`\n : \"NUMERIC\";\n case \"real\":\n return \"REAL\";\n case \"double\":\n return \"DOUBLE PRECISION\";\n case \"varchar\":\n return meta.length !== undefined ? `VARCHAR(${meta.length})` : \"VARCHAR\";\n case \"char\":\n return meta.length !== undefined ? `CHAR(${meta.length})` : \"CHAR\";\n case \"text\":\n return \"TEXT\";\n case \"boolean\":\n return \"BOOLEAN\";\n case \"date\":\n return \"DATE\";\n case \"time\":\n return meta.withTimezone ? \"TIME WITH TIME ZONE\" : \"TIME\";\n case \"datetime\":\n case \"timestamp\":\n return meta.withTimezone ? \"TIMESTAMP WITH TIME ZONE\" : \"TIMESTAMP\";\n case \"blob\":\n return \"BYTEA\";\n case \"json\":\n return meta.jsonb ? \"JSONB\" : \"JSON\";\n case \"uuid\":\n return \"UUID\";\n case \"enum\":\n // Named PG enum types are handled in renderCreateTable; fall back to TEXT.\n return \"TEXT\";\n }\n}\n\n/** Render a default value into a SQL `DEFAULT` expression for the dialect. */\nexport function renderDefault(def: DefaultValue, dialect: Dialect): string {\n if (def.kind === \"expression\") {\n const expr = def.expression;\n if (typeof expr === \"object\") return expr.raw;\n switch (expr) {\n case \"now\":\n return dialect === \"postgresql\" ? \"now()\" : \"CURRENT_TIMESTAMP\";\n case \"current_date\":\n return \"CURRENT_DATE\";\n case \"current_time\":\n return \"CURRENT_TIME\";\n case \"uuidv4\":\n if (dialect === \"postgresql\") return \"gen_random_uuid()\";\n if (dialect === \"mysql\") return \"(UUID())\";\n return \"(lower(hex(randomblob(16))))\";\n }\n }\n const value = def.value;\n if (value === null) return \"NULL\";\n if (typeof value === \"boolean\") {\n return dialect === \"postgresql\" ? (value ? \"TRUE\" : \"FALSE\") : value ? \"1\" : \"0\";\n }\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (value instanceof Date) return quoteLiteral(value.toISOString());\n if (typeof value === \"object\") return quoteLiteral(JSON.stringify(value));\n return quoteLiteral(String(value));\n}\n\n/** Render a referential action for an `ON DELETE` / `ON UPDATE` clause. */\nfunction renderFkAction(action: FkAction): string {\n return action.toUpperCase();\n}\n\n/** Render the `[ON DELETE ..] [ON UPDATE ..]` tail shared by inline + table FKs. */\nfunction renderFkActions(fk: {\n onDelete?: FkAction | undefined;\n onUpdate?: FkAction | undefined;\n}): string {\n let sql = \"\";\n if (fk.onDelete) sql += ` ON DELETE ${renderFkAction(fk.onDelete)}`;\n if (fk.onUpdate) sql += ` ON UPDATE ${renderFkAction(fk.onUpdate)}`;\n return sql;\n}\n\n/**\n * The column-level constraint suffix: ` UNIQUE` and/or an inline\n * ` REFERENCES \"table\" (\"column\") [ON DELETE ..] [ON UPDATE ..]`. Appended to\n * every rendered column definition (including the enum/serial branches).\n */\nfunction columnConstraintSuffix(col: ColumnIR, dialect: Dialect): string {\n let sql = \"\";\n if (col.unique) sql += \" UNIQUE\";\n if (col.references) {\n const ref = col.references;\n sql += ` REFERENCES ${quoteId(ref.table, dialect)} (${quoteId(ref.column, dialect)})`;\n sql += renderFkActions(ref);\n }\n return sql;\n}\n\n/** Render a table-level `CONSTRAINT \"name\" UNIQUE (...)` clause. */\nfunction renderUniqueConstraint(uc: UniqueConstraintIR, dialect: Dialect): string {\n const cols = uc.columns.map((c) => quoteId(c, dialect)).join(\", \");\n return `CONSTRAINT ${quoteId(uc.name, dialect)} UNIQUE (${cols})`;\n}\n\n/** Render a table-level `CONSTRAINT \"name\" FOREIGN KEY (...) REFERENCES ...` clause. */\nfunction renderForeignKeyConstraint(fk: ForeignKeyIR, dialect: Dialect): string {\n const cols = fk.columns.map((c) => quoteId(c, dialect)).join(\", \");\n const refCols = fk.refColumns.map((c) => quoteId(c, dialect)).join(\", \");\n return (\n `CONSTRAINT ${quoteId(fk.name, dialect)} FOREIGN KEY (${cols}) ` +\n `REFERENCES ${quoteId(fk.refTable, dialect)} (${refCols})${renderFkActions(fk)}`\n );\n}\n\n/** The table-level constraint clauses (unique + foreign key) for a table. */\nfunction tableConstraintClauses(table: TableIR, dialect: Dialect): string[] {\n return [\n ...table.uniqueConstraints.map((uc) => renderUniqueConstraint(uc, dialect)),\n ...table.foreignKeys.map((fk) => renderForeignKeyConstraint(fk, dialect)),\n ];\n}\n\n/**\n * Render one column definition: `\"name\" TYPE [NOT NULL] [DEFAULT x] [UNIQUE]\n * [REFERENCES ...]`.\n */\nexport function renderColumnDef(col: ColumnIR, dialect: Dialect): string {\n let sql = `${quoteId(col.name, dialect)} ${renderColumnType(col.type, dialect)}`;\n if (col.notNull) sql += \" NOT NULL\";\n if (col.default !== null) sql += ` DEFAULT ${renderDefault(col.default, dialect)}`;\n sql += columnConstraintSuffix(col, dialect);\n return sql;\n}\n\n/** The PostgreSQL named-enum type for a column (`<table>_<column>`). */\nfunction enumTypeName(table: string, column: string): string {\n return `${table}_${column}`;\n}\n\n/** True when a column is the sole integer-family PK with no explicit default. */\nfunction isAutoIncrementPk(table: TableIR, col: ColumnIR): boolean {\n return (\n table.primaryKey.length === 1 &&\n table.primaryKey[0] === col.name &&\n col.default === null &&\n (col.type.kind === \"smallint\" ||\n col.type.kind === \"integer\" ||\n col.type.kind === \"bigint\")\n );\n}\n\n/** The PostgreSQL auto-incrementing serial type for an integer-family kind. */\nfunction postgresSerialType(kind: ColumnType[\"kind\"]): string {\n if (kind === \"bigint\") return \"BIGSERIAL\";\n if (kind === \"smallint\") return \"SMALLSERIAL\";\n return \"SERIAL\";\n}\n\n/**\n * Render a CREATE TABLE (plus, on PostgreSQL, any `CREATE TYPE ... AS ENUM` for\n * enum columns, which must precede the table). Returns the statement list.\n *\n * Auto-increment for a lone integer-family primary key (SQLAlchemy semantics):\n * - SQLite: free via `INTEGER PRIMARY KEY` (rowid alias).\n * - PostgreSQL: `SERIAL`/`BIGSERIAL`.\n * - MySQL: `AUTO_INCREMENT` on the column (which must also be a key).\n */\nfunction renderCreateTable(table: TableIR, dialect: Dialect): string[] {\n const typeStmts: string[] = [];\n const cols = Object.values(table.columns).map((c) => {\n if (dialect === \"postgresql\" && c.type.kind === \"enum\") {\n const typeName = enumTypeName(table.name, c.name);\n const values = (c.type.meta.values ?? []).map(quoteLiteral).join(\", \");\n typeStmts.push(`CREATE TYPE ${quoteId(typeName, dialect)} AS ENUM (${values})`);\n let def = `${quoteId(c.name, dialect)} ${quoteId(typeName, dialect)}`;\n if (c.notNull) def += \" NOT NULL\";\n if (c.default !== null) def += ` DEFAULT ${renderDefault(c.default, dialect)}`;\n return def + columnConstraintSuffix(c, dialect);\n }\n if (dialect === \"postgresql\" && isAutoIncrementPk(table, c)) {\n return `${quoteId(c.name, dialect)} ${postgresSerialType(c.type.kind)}${columnConstraintSuffix(c, dialect)}`;\n }\n if (dialect === \"mysql\" && isAutoIncrementPk(table, c)) {\n return `${quoteId(c.name, dialect)} ${renderColumnType(c.type, dialect)} NOT NULL AUTO_INCREMENT${columnConstraintSuffix(c, dialect)}`;\n }\n return renderColumnDef(c, dialect);\n });\n if (table.primaryKey.length > 0) {\n cols.push(\n `PRIMARY KEY (${table.primaryKey.map((c) => quoteId(c, dialect)).join(\", \")})`,\n );\n }\n cols.push(...tableConstraintClauses(table, dialect));\n return [\n ...typeStmts,\n `CREATE TABLE ${quoteId(table.name, dialect)} (\\n ${cols.join(\",\\n \")}\\n)`,\n ];\n}\n\n/**\n * Render an operation to one or more SQL statements for the dialect.\n *\n * @param op The operation.\n * @param dialect The target dialect.\n * @returns The SQL statements (usually one).\n * @throws Error When the operation is unsupported on the dialect (e.g. SQLite\n * `alter_column`, which needs the table-rebuild path).\n */\nexport function renderOperation(op: Operation, dialect: Dialect): string[] {\n switch (op.kind) {\n case \"create_table\":\n return renderCreateTable(op.table, dialect);\n case \"drop_table\":\n return [`DROP TABLE ${quoteId(op.table.name, dialect)}`];\n case \"rename_table\":\n return dialect === \"mysql\"\n ? [`RENAME TABLE ${quoteId(op.from, dialect)} TO ${quoteId(op.to, dialect)}`]\n : [\n `ALTER TABLE ${quoteId(op.from, dialect)} RENAME TO ${quoteId(op.to, dialect)}`,\n ];\n case \"add_column\":\n return [\n `ALTER TABLE ${quoteId(op.table, dialect)} ADD COLUMN ${renderColumnDef(op.column, dialect)}`,\n ];\n case \"drop_column\":\n return [\n `ALTER TABLE ${quoteId(op.table, dialect)} DROP COLUMN ${quoteId(op.column.name, dialect)}`,\n ];\n case \"rename_column\":\n return [\n `ALTER TABLE ${quoteId(op.table, dialect)} RENAME COLUMN ${quoteId(op.from, dialect)} TO ${quoteId(op.to, dialect)}`,\n ];\n case \"alter_column\":\n return renderAlterColumn(op.table, op.to, dialect);\n case \"recreate_table\":\n return dialect === \"sqlite\"\n ? renderSqliteRebuild(op.from, op.to)\n : renderTableDiff(op.from, op.to, dialect);\n case \"add_constraint\":\n return renderAddConstraint(op.table, op.constraint, dialect);\n case \"drop_constraint\":\n return renderDropConstraint(op.table, op.constraint, dialect);\n case \"execute\":\n return [op.up];\n }\n}\n\n/**\n * Render an `ALTER TABLE ... ADD CONSTRAINT`. SQLite cannot add constraints in\n * place — it needs a table-rebuild (`recreate_table`), so this throws there.\n */\nfunction renderAddConstraint(\n table: string,\n constraint: NamedConstraint,\n dialect: Dialect,\n): string[] {\n if (dialect === \"sqlite\") {\n throw new Error(\n `add_constraint on SQLite needs a table-rebuild (recreate_table); constraint ${constraint.constraint.name} on ${table}`,\n );\n }\n const clause =\n constraint.type === \"unique\"\n ? renderUniqueConstraint(constraint.constraint, dialect)\n : renderForeignKeyConstraint(constraint.constraint, dialect);\n return [`ALTER TABLE ${quoteId(table, dialect)} ADD ${clause}`];\n}\n\n/**\n * Render an `ALTER TABLE ... DROP CONSTRAINT`. PostgreSQL uses the generic\n * `DROP CONSTRAINT`; MySQL uses `DROP INDEX` (unique) / `DROP FOREIGN KEY` (fk).\n * SQLite needs a table-rebuild, so this throws there.\n */\nfunction renderDropConstraint(\n table: string,\n constraint: NamedConstraint,\n dialect: Dialect,\n): string[] {\n if (dialect === \"sqlite\") {\n throw new Error(\n `drop_constraint on SQLite needs a table-rebuild (recreate_table); constraint ${constraint.constraint.name} on ${table}`,\n );\n }\n const t = quoteId(table, dialect);\n const name = quoteId(constraint.constraint.name, dialect);\n if (dialect === \"mysql\") {\n return [\n constraint.type === \"unique\"\n ? `ALTER TABLE ${t} DROP INDEX ${name}`\n : `ALTER TABLE ${t} DROP FOREIGN KEY ${name}`,\n ];\n }\n return [`ALTER TABLE ${t} DROP CONSTRAINT ${name}`];\n}\n\n/**\n * SQLite batch / table-rebuild: create a new table with the target schema, copy\n * the columns common to both, swap names. This is how SQLite realizes column\n * changes it cannot `ALTER` (drop/alter type/constraint changes).\n */\nfunction renderSqliteRebuild(from: TableIR, to: TableIR): string[] {\n const tmp = `__new_${to.name}`;\n const common = Object.keys(to.columns).filter((c) => c in from.columns);\n const cols = Object.values(to.columns).map((c) => renderColumnDef(c, \"sqlite\"));\n if (to.primaryKey.length > 0) {\n cols.push(\n `PRIMARY KEY (${to.primaryKey.map((c) => quoteId(c, \"sqlite\")).join(\", \")})`,\n );\n }\n cols.push(...tableConstraintClauses(to, \"sqlite\"));\n const commonSql = common.map((c) => quoteId(c, \"sqlite\")).join(\", \");\n return [\n \"PRAGMA foreign_keys=off\",\n `CREATE TABLE ${quoteId(tmp, \"sqlite\")} (\\n ${cols.join(\",\\n \")}\\n)`,\n common.length > 0\n ? `INSERT INTO ${quoteId(tmp, \"sqlite\")} (${commonSql}) SELECT ${commonSql} FROM ${quoteId(from.name, \"sqlite\")}`\n : `-- no common columns to copy from ${from.name}`,\n `DROP TABLE ${quoteId(from.name, \"sqlite\")}`,\n `ALTER TABLE ${quoteId(tmp, \"sqlite\")} RENAME TO ${quoteId(to.name, \"sqlite\")}`,\n \"PRAGMA foreign_keys=on\",\n ];\n}\n\n/** PostgreSQL/MySQL realize a table recreate as per-column ADD/DROP/ALTER. */\nfunction renderTableDiff(from: TableIR, to: TableIR, dialect: Dialect): string[] {\n const stmts: string[] = [];\n for (const [name, col] of Object.entries(to.columns)) {\n if (!(name in from.columns)) {\n stmts.push(\n `ALTER TABLE ${quoteId(to.name, dialect)} ADD COLUMN ${renderColumnDef(col, dialect)}`,\n );\n } else {\n stmts.push(...renderAlterColumn(to.name, col, dialect));\n }\n }\n for (const name of Object.keys(from.columns)) {\n if (!(name in to.columns)) {\n stmts.push(\n `ALTER TABLE ${quoteId(to.name, dialect)} DROP COLUMN ${quoteId(name, dialect)}`,\n );\n }\n }\n return stmts;\n}\n\n/**\n * Render an ALTER COLUMN. SQLite needs table-rebuild (unsupported here); MySQL\n * uses a single `MODIFY COLUMN` (type + NOT NULL + DEFAULT together); PostgreSQL\n * uses separate `ALTER COLUMN ... TYPE / SET|DROP NOT NULL / SET|DROP DEFAULT`.\n */\nfunction renderAlterColumn(table: string, to: ColumnIR, dialect: Dialect): string[] {\n if (dialect === \"sqlite\") {\n throw new Error(\n `alter_column on SQLite needs a table-rebuild (recreate_table); column ${table}.${to.name}`,\n );\n }\n if (dialect === \"mysql\") {\n return [\n `ALTER TABLE ${quoteId(table, dialect)} MODIFY COLUMN ${renderColumnDef(to, dialect)}`,\n ];\n }\n const t = quoteId(table, dialect);\n const c = quoteId(to.name, dialect);\n const stmts = [\n `ALTER TABLE ${t} ALTER COLUMN ${c} TYPE ${renderColumnType(to.type, dialect)}`,\n ];\n stmts.push(\n to.notNull\n ? `ALTER TABLE ${t} ALTER COLUMN ${c} SET NOT NULL`\n : `ALTER TABLE ${t} ALTER COLUMN ${c} DROP NOT NULL`,\n );\n stmts.push(\n to.default !== null\n ? `ALTER TABLE ${t} ALTER COLUMN ${c} SET DEFAULT ${renderDefault(to.default, dialect)}`\n : `ALTER TABLE ${t} ALTER COLUMN ${c} DROP DEFAULT`,\n );\n return stmts;\n}\n","/**\n * tempest-db-js — Phase 6: the schema differ.\n *\n * Compares two `SchemaIR`s (current vs target) and emits the typed `Operation[]`\n * that turns one into the other. Purely structural — no SQL, no DB.\n */\n\nimport type {\n ColumnIR,\n ForeignKeyIR,\n NamedConstraint,\n SchemaIR,\n TableIR,\n UniqueConstraintIR,\n} from \"./ir.js\";\nimport type { Operation } from \"./operations.js\";\n\n/** Stable structural identity of a column, for change detection. */\nfunction columnSignature(col: ColumnIR): string {\n return JSON.stringify({\n type: col.type,\n notNull: col.notNull,\n primaryKey: col.primaryKey,\n default: col.default,\n unique: col.unique,\n references: col.references,\n });\n}\n\n/** Stable structural identity of a table-level constraint (name excluded). */\nfunction uniqueSignature(uc: UniqueConstraintIR): string {\n return JSON.stringify({ columns: uc.columns });\n}\n\nfunction foreignKeySignature(fk: ForeignKeyIR): string {\n return JSON.stringify({\n columns: fk.columns,\n refTable: fk.refTable,\n refColumns: fk.refColumns,\n onDelete: fk.onDelete ?? null,\n onUpdate: fk.onUpdate ?? null,\n });\n}\n\n/**\n * Diff the table-level constraints of an existing table, keyed by name. Emits\n * `drop_constraint` for removed/changed and `add_constraint` for added/changed.\n */\nfunction diffConstraints(current: TableIR, target: TableIR): Operation[] {\n const ops: Operation[] = [];\n const table = target.name;\n\n const currentUq = new Map(current.uniqueConstraints.map((u) => [u.name, u]));\n const targetUq = new Map(target.uniqueConstraints.map((u) => [u.name, u]));\n for (const [name, cur] of currentUq) {\n const tgt = targetUq.get(name);\n if (!tgt || uniqueSignature(cur) !== uniqueSignature(tgt)) {\n ops.push(dropUnique(table, cur));\n }\n }\n for (const [name, tgt] of targetUq) {\n const cur = currentUq.get(name);\n if (!cur || uniqueSignature(cur) !== uniqueSignature(tgt)) {\n ops.push(addUnique(table, tgt));\n }\n }\n\n const currentFk = new Map(current.foreignKeys.map((f) => [f.name, f]));\n const targetFk = new Map(target.foreignKeys.map((f) => [f.name, f]));\n for (const [name, cur] of currentFk) {\n const tgt = targetFk.get(name);\n if (!tgt || foreignKeySignature(cur) !== foreignKeySignature(tgt)) {\n ops.push(dropForeignKey(table, cur));\n }\n }\n for (const [name, tgt] of targetFk) {\n const cur = currentFk.get(name);\n if (!cur || foreignKeySignature(cur) !== foreignKeySignature(tgt)) {\n ops.push(addForeignKey(table, tgt));\n }\n }\n\n return ops;\n}\n\nfunction uniqueNamed(uc: UniqueConstraintIR): NamedConstraint {\n return { type: \"unique\", constraint: uc };\n}\nfunction foreignKeyNamed(fk: ForeignKeyIR): NamedConstraint {\n return { type: \"foreignKey\", constraint: fk };\n}\nfunction addUnique(table: string, uc: UniqueConstraintIR): Operation {\n return { kind: \"add_constraint\", table, constraint: uniqueNamed(uc) };\n}\nfunction dropUnique(table: string, uc: UniqueConstraintIR): Operation {\n return { kind: \"drop_constraint\", table, constraint: uniqueNamed(uc) };\n}\nfunction addForeignKey(table: string, fk: ForeignKeyIR): Operation {\n return { kind: \"add_constraint\", table, constraint: foreignKeyNamed(fk) };\n}\nfunction dropForeignKey(table: string, fk: ForeignKeyIR): Operation {\n return { kind: \"drop_constraint\", table, constraint: foreignKeyNamed(fk) };\n}\n\n/**\n * Diff `current` → `target`, returning the operations to migrate forward.\n *\n * Order: create new tables, then per-table column adds/alters/drops, then drop\n * removed tables last (so nothing depends on a table being dropped first).\n *\n * @param current The current schema (e.g. from migration replay).\n * @param target The desired schema (e.g. from model reflection).\n * @returns The forward operations.\n */\nexport function diffSchema(current: SchemaIR, target: SchemaIR): Operation[] {\n const ops: Operation[] = [];\n const drops: Operation[] = [];\n\n for (const [name, targetTable] of Object.entries(target.tables)) {\n const currentTable = current.tables[name];\n if (!currentTable) {\n ops.push({ kind: \"create_table\", table: targetTable });\n continue;\n }\n // existing table → diff columns\n for (const [colName, targetCol] of Object.entries(targetTable.columns)) {\n const currentCol = currentTable.columns[colName];\n if (!currentCol) {\n ops.push({ kind: \"add_column\", table: name, column: targetCol });\n } else if (columnSignature(currentCol) !== columnSignature(targetCol)) {\n ops.push({\n kind: \"alter_column\",\n table: name,\n name: colName,\n from: currentCol,\n to: targetCol,\n });\n }\n }\n for (const [colName, currentCol] of Object.entries(currentTable.columns)) {\n if (!targetTable.columns[colName]) {\n ops.push({ kind: \"drop_column\", table: name, column: currentCol });\n }\n }\n ops.push(...diffConstraints(currentTable, targetTable));\n }\n\n for (const [name, currentTable] of Object.entries(current.tables)) {\n if (!target.tables[name]) {\n drops.push({ kind: \"drop_table\", table: currentTable });\n }\n }\n\n return [...ops, ...drops];\n}\n","/**\n * tempest-db-js — Phase 6: the revision DAG.\n *\n * Migrations form a directed acyclic graph via `downRevision` (a list of parents,\n * so branches and merges are first-class). This module orders them for applying\n * (topological, deterministic) and finds heads.\n */\n\n/** The minimal graph shape a migration must expose. */\nexport interface RevisionNode {\n readonly revision: string;\n readonly downRevision: readonly string[];\n}\n\n/** Raised when the revision graph contains a cycle. */\nexport class CyclicMigrationGraph extends Error {\n constructor(remaining: readonly string[]) {\n super(`migration graph has a cycle among: ${remaining.join(\", \")}`);\n this.name = \"CyclicMigrationGraph\";\n }\n}\n\n/** Raised when a `downRevision` points at a revision that does not exist. */\nexport class UnknownRevision extends Error {\n constructor(revision: string, parent: string) {\n super(`revision ${revision} references unknown parent ${parent}`);\n this.name = \"UnknownRevision\";\n }\n}\n\n/**\n * Topologically order migrations so every parent precedes its children. Ties are\n * broken by revision id for reproducible builds. Throws on cycles or dangling\n * parents.\n *\n * @param migrations The migrations to order.\n * @returns The migrations in apply order.\n */\nexport function topoOrder<T extends RevisionNode>(migrations: readonly T[]): T[] {\n const byId = new Map<string, T>();\n for (const m of migrations) byId.set(m.revision, m);\n\n const indegree = new Map<string, number>();\n const children = new Map<string, string[]>();\n for (const m of migrations) {\n indegree.set(m.revision, m.downRevision.length);\n for (const parent of m.downRevision) {\n if (!byId.has(parent)) throw new UnknownRevision(m.revision, parent);\n const list = children.get(parent) ?? [];\n list.push(m.revision);\n children.set(parent, list);\n }\n }\n\n // roots: indegree 0, sorted for determinism\n const ready = migrations\n .filter((m) => (indegree.get(m.revision) ?? 0) === 0)\n .map((m) => m.revision)\n .sort();\n\n const ordered: T[] = [];\n while (ready.length > 0) {\n const id = ready.shift() as string;\n ordered.push(byId.get(id) as T);\n const next = (children.get(id) ?? []).sort();\n for (const child of next) {\n const deg = (indegree.get(child) ?? 0) - 1;\n indegree.set(child, deg);\n if (deg === 0) {\n ready.push(child);\n ready.sort();\n }\n }\n }\n\n if (ordered.length !== migrations.length) {\n const remaining = migrations\n .map((m) => m.revision)\n .filter((r) => !ordered.some((o) => o.revision === r));\n throw new CyclicMigrationGraph(remaining);\n }\n return ordered;\n}\n\n/** Revisions that are nobody's parent — the current head(s) of the graph. */\nexport function heads<T extends RevisionNode>(migrations: readonly T[]): string[] {\n const parents = new Set<string>();\n for (const m of migrations) for (const p of m.downRevision) parents.add(p);\n return migrations\n .map((m) => m.revision)\n .filter((r) => !parents.has(r))\n .sort();\n}\n","/**\n * tempest-db-js — Phase 6: the Schema IR (intermediate representation).\n *\n * A canonical, dialect-neutral description of a database schema. Every source of\n * truth — model reflection (here), migration replay, or DB introspection —\n * produces the SAME `SchemaIR`, so the differ compares like with like and SQL is\n * only ever emitted at the dialect edge (the anti-\"SQL-stitching\" core).\n */\n\nimport {\n type ColumnType,\n type DefaultValue,\n type FkAction,\n type ForeignKeyRef,\n type ModelClass,\n columnsOf,\n} from \"../index.js\";\n\n/** A column's default in the IR. */\nexport type DefaultIR = DefaultValue | null;\n\n/** One column. */\nexport interface ColumnIR {\n readonly name: string;\n readonly type: ColumnType;\n readonly notNull: boolean;\n readonly primaryKey: boolean;\n readonly default: DefaultIR;\n /** A column-level `UNIQUE` constraint. */\n readonly unique: boolean;\n /** A column-level foreign-key reference, or `null` for none. */\n readonly references: ForeignKeyRef | null;\n}\n\n/** A (composite) `UNIQUE` table constraint in the IR. */\nexport interface UniqueConstraintIR {\n readonly name: string;\n readonly columns: readonly string[];\n}\n\n/** A (composite) foreign-key table constraint in the IR. */\nexport interface ForeignKeyIR {\n readonly name: string;\n readonly columns: readonly string[];\n readonly refTable: string;\n readonly refColumns: readonly string[];\n readonly onDelete?: FkAction | undefined;\n readonly onUpdate?: FkAction | undefined;\n}\n\n/**\n * A named table-level constraint, tagged by kind. Carried whole by the\n * `add_constraint` / `drop_constraint` operations so each is reversible.\n */\nexport type NamedConstraint =\n | { readonly type: \"unique\"; readonly constraint: UniqueConstraintIR }\n | { readonly type: \"foreignKey\"; readonly constraint: ForeignKeyIR };\n\n/** One table. */\nexport interface TableIR {\n readonly name: string;\n readonly columns: Record<string, ColumnIR>;\n /** Primary-key column names (composite = more than one). */\n readonly primaryKey: readonly string[];\n /** Table-level unique constraints (from `tableArgs`). */\n readonly uniqueConstraints: readonly UniqueConstraintIR[];\n /** Table-level foreign-key constraints (from `tableArgs`). */\n readonly foreignKeys: readonly ForeignKeyIR[];\n}\n\n/** A whole schema, keyed by table name. */\nexport interface SchemaIR {\n readonly tables: Record<string, TableIR>;\n}\n\n/** Deterministic constraint name when the user did not supply one. */\nfunction constraintName(\n prefix: \"uq\" | \"fk\",\n table: string,\n columns: readonly string[],\n): string {\n return `${prefix}_${table}_${columns.join(\"_\")}`;\n}\n\n/** Reflect one model class into a `TableIR`. */\nexport function reflectTable(model: ModelClass): TableIR {\n const columns: Record<string, ColumnIR> = {};\n const primaryKey: string[] = [];\n for (const [name, col] of Object.entries(columnsOf(model))) {\n const isPk = col.flags.primaryKey;\n columns[name] = {\n name,\n type: col.type,\n notNull: col.flags.notNull || isPk,\n primaryKey: isPk,\n default: col.defaultValue,\n unique: col.flags.unique,\n references: col.reference,\n };\n if (isPk) primaryKey.push(name);\n }\n\n const uniqueConstraints: UniqueConstraintIR[] = [];\n const foreignKeys: ForeignKeyIR[] = [];\n for (const c of model.tableArgs?.() ?? []) {\n if (c.kind === \"unique\") {\n uniqueConstraints.push({\n name: c.name ?? constraintName(\"uq\", model.tablename, c.columns),\n columns: c.columns,\n });\n } else {\n foreignKeys.push({\n name: c.name ?? constraintName(\"fk\", model.tablename, c.columns),\n columns: c.columns,\n refTable: c.refTable,\n refColumns: c.refColumns,\n onDelete: c.onDelete,\n onUpdate: c.onUpdate,\n });\n }\n }\n\n return { name: model.tablename, columns, primaryKey, uniqueConstraints, foreignKeys };\n}\n\n/**\n * Reflect a set of model classes into a `SchemaIR`. This is the **target** state\n * the differ compares the current (replayed) schema against.\n *\n * @param models The model classes that make up the schema.\n * @returns The reflected schema IR.\n */\nexport function reflectSchema(models: readonly ModelClass[]): SchemaIR {\n const tables: Record<string, TableIR> = {};\n for (const model of models) {\n const table = reflectTable(model);\n tables[table.name] = table;\n }\n return { tables };\n}\n\n/** An empty schema (the baseline before any migration). */\nexport function emptySchema(): SchemaIR {\n return { tables: {} };\n}\n","/**\n * tempest-db-js — Phase 6d: SQLite introspection + drift detection.\n *\n * Reads the live schema from a SQLite database (via `PRAGMA table_info`) into a\n * `SchemaIR`, and compares it against the models to detect **drift** — the DB\n * diverging from what the migrations/models say it should be. Comparison is done\n * at SQLite's storage-affinity level, so coarse SQLite typing (every string is\n * `TEXT`) does not produce false positives.\n */\n\nimport type { AsyncDriver, SyncDriver } from \"../engine.js\";\nimport type { ColumnType } from \"../index.js\";\nimport type { ModelClass } from \"../index.js\";\nimport { renderColumnType } from \"./ddl.js\";\nimport {\n type ColumnIR,\n type ForeignKeyIR,\n type SchemaIR,\n type TableIR,\n type UniqueConstraintIR,\n reflectSchema,\n} from \"./ir.js\";\n\n/** SQLite's five storage classes / affinities. */\nexport type SqliteAffinity = \"INTEGER\" | \"TEXT\" | \"REAL\" | \"BLOB\" | \"NUMERIC\";\n\n/** Apply SQLite's affinity rules to a declared type string. */\nexport function sqliteAffinity(declared: string): SqliteAffinity {\n const t = declared.toUpperCase();\n if (t.includes(\"INT\")) return \"INTEGER\";\n if (t.includes(\"CHAR\") || t.includes(\"CLOB\") || t.includes(\"TEXT\")) return \"TEXT\";\n if (t.includes(\"BLOB\") || t === \"\") return \"BLOB\";\n if (t.includes(\"REAL\") || t.includes(\"FLOA\") || t.includes(\"DOUB\")) return \"REAL\";\n return \"NUMERIC\";\n}\n\n/** Map a SQLite affinity back to the closest IR column kind. */\nfunction affinityToKind(affinity: SqliteAffinity): ColumnType[\"kind\"] {\n switch (affinity) {\n case \"INTEGER\":\n return \"integer\";\n case \"REAL\":\n return \"real\";\n case \"BLOB\":\n return \"blob\";\n case \"NUMERIC\":\n return \"numeric\";\n default:\n return \"text\";\n }\n}\n\ninterface PragmaColumn {\n name: string;\n type: string;\n notnull: number;\n pk: number;\n}\n\ninterface PragmaForeignKey {\n id: number;\n seq: number;\n table: string;\n from: string;\n to: string;\n on_update: string;\n on_delete: string;\n}\n\ninterface PragmaIndex {\n seq: number;\n name: string;\n unique: number;\n origin: string;\n}\n\ninterface PragmaIndexColumn {\n seqno: number;\n cid: number;\n name: string;\n}\n\n/** Read a table's foreign keys via `PRAGMA foreign_key_list`, grouped by id. */\nfunction sqliteForeignKeys(driver: SyncDriver, table: string): ForeignKeyIR[] {\n const rows = driver.execute(`PRAGMA foreign_key_list(${JSON.stringify(table)})`, [])\n .rows as unknown as PragmaForeignKey[];\n const byId = new Map<number, PragmaForeignKey[]>();\n for (const r of rows) {\n const list = byId.get(r.id) ?? [];\n list.push(r);\n byId.set(r.id, list);\n }\n const fks: ForeignKeyIR[] = [];\n for (const group of byId.values()) {\n const ordered = [...group].sort((a, b) => a.seq - b.seq);\n const columns = ordered.map((r) => r.from);\n fks.push({\n name: `fk_${table}_${columns.join(\"_\")}`,\n columns,\n refTable: ordered[0]?.table ?? \"\",\n refColumns: ordered.map((r) => r.to),\n });\n }\n return fks;\n}\n\n/** Read a table's unique constraints via `PRAGMA index_list`/`index_info`. */\nfunction sqliteUniques(driver: SyncDriver, table: string): UniqueConstraintIR[] {\n const indexes = driver.execute(`PRAGMA index_list(${JSON.stringify(table)})`, [])\n .rows as unknown as PragmaIndex[];\n const uniques: UniqueConstraintIR[] = [];\n for (const idx of indexes) {\n // origin \"u\" = a UNIQUE constraint; \"pk\" = the implicit primary-key index.\n if (Number(idx.unique) !== 1 || idx.origin === \"pk\") continue;\n const cols = (\n driver.execute(`PRAGMA index_info(${JSON.stringify(idx.name)})`, [])\n .rows as unknown as PragmaIndexColumn[]\n )\n .sort((a, b) => a.seqno - b.seqno)\n .map((c) => c.name);\n if (cols.length > 0) {\n uniques.push({ name: `uq_${table}_${cols.join(\"_\")}`, columns: cols });\n }\n }\n return uniques;\n}\n\n/**\n * Read the current SQLite schema into a `SchemaIR`. Lossy by nature (SQLite\n * collapses types into affinities), so types come back as the affinity's kind.\n *\n * @param driver A sync SQLite driver.\n * @returns The introspected schema.\n */\nexport function introspectSqlite(driver: SyncDriver): SchemaIR {\n const tablesRows = driver.execute(\n \"SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' AND name != 'tempest_db_js_migrations'\",\n [],\n ).rows;\n\n const tables: Record<string, TableIR> = {};\n for (const row of tablesRows) {\n const tableName = String(row.name);\n const info = driver.execute(`PRAGMA table_info(${JSON.stringify(tableName)})`, [])\n .rows as unknown as PragmaColumn[];\n const columns: Record<string, ColumnIR> = {};\n const primaryKey: string[] = [];\n for (const col of info) {\n const isPk = Number(col.pk) > 0;\n const affinity = sqliteAffinity(col.type);\n columns[col.name] = {\n name: col.name,\n type: { kind: affinityToKind(affinity), meta: {} },\n notNull: Number(col.notnull) === 1 || isPk,\n primaryKey: isPk,\n default: null,\n unique: false,\n references: null,\n };\n if (isPk) primaryKey.push(col.name);\n }\n tables[tableName] = {\n name: tableName,\n columns,\n primaryKey,\n uniqueConstraints: sqliteUniques(driver, tableName),\n foreignKeys: sqliteForeignKeys(driver, tableName),\n };\n }\n return { tables };\n}\n\n/**\n * Compare the live SQLite schema against the models and report drift. Comparison\n * is at the affinity level (so `varchar` vs `TEXT` is not flagged), plus\n * nullability, primary-key, and presence of tables/columns.\n *\n * @param driver A sync SQLite driver.\n * @param models The model classes that define the intended schema.\n * @returns A list of human-readable drift messages — empty means no drift.\n */\n/**\n * Normalize a table's constraints into comparable key sets, merging the\n * column-level (`.unique()` / `.references()`) and table-level (`tableArgs`)\n * forms so drift comparison is agnostic to how a constraint was declared.\n */\nfunction constraintKeys(table: TableIR): { fks: Set<string>; uniques: Set<string> } {\n const fks = new Set<string>();\n const uniques = new Set<string>();\n for (const col of Object.values(table.columns)) {\n if (col.unique) uniques.add(col.name);\n if (col.references) {\n fks.add(`${col.name}=>${col.references.table}(${col.references.column})`);\n }\n }\n for (const uc of table.uniqueConstraints) {\n uniques.add([...uc.columns].sort().join(\",\"));\n }\n for (const fk of table.foreignKeys) {\n fks.add(`${fk.columns.join(\",\")}=>${fk.refTable}(${fk.refColumns.join(\",\")})`);\n }\n return { fks, uniques };\n}\n\nexport function checkDrift(driver: SyncDriver, models: readonly ModelClass[]): string[] {\n const actual = introspectSqlite(driver);\n const expected = reflectSchema(models);\n const issues: string[] = [];\n\n for (const [tableName, expectedTable] of Object.entries(expected.tables)) {\n const actualTable = actual.tables[tableName];\n if (!actualTable) {\n issues.push(`table \"${tableName}\" is missing from the database`);\n continue;\n }\n for (const [colName, expectedCol] of Object.entries(expectedTable.columns)) {\n const actualCol = actualTable.columns[colName];\n if (!actualCol) {\n issues.push(`column \"${tableName}.${colName}\" is missing from the database`);\n continue;\n }\n const expAff = sqliteAffinity(renderColumnType(expectedCol.type, \"sqlite\"));\n const actAff = sqliteAffinity(renderColumnType(actualCol.type, \"sqlite\"));\n if (expAff !== actAff) {\n issues.push(\n `column \"${tableName}.${colName}\" affinity differs: model ${expAff}, db ${actAff}`,\n );\n }\n if (expectedCol.notNull !== actualCol.notNull) {\n issues.push(`column \"${tableName}.${colName}\" nullability differs`);\n }\n if (expectedCol.primaryKey !== actualCol.primaryKey) {\n issues.push(`column \"${tableName}.${colName}\" primary-key flag differs`);\n }\n }\n for (const colName of Object.keys(actualTable.columns)) {\n if (!expectedTable.columns[colName]) {\n issues.push(\n `column \"${tableName}.${colName}\" exists in the database but not in the model`,\n );\n }\n }\n\n const expectedKeys = constraintKeys(expectedTable);\n const actualKeys = constraintKeys(actualTable);\n for (const fk of expectedKeys.fks) {\n if (!actualKeys.fks.has(fk)) {\n issues.push(`foreign key \"${tableName}: ${fk}\" is missing from the database`);\n }\n }\n for (const fk of actualKeys.fks) {\n if (!expectedKeys.fks.has(fk)) {\n issues.push(\n `foreign key \"${tableName}: ${fk}\" exists in the database but not in the model`,\n );\n }\n }\n for (const uq of expectedKeys.uniques) {\n if (!actualKeys.uniques.has(uq)) {\n issues.push(\n `unique constraint \"${tableName}: (${uq})\" is missing from the database`,\n );\n }\n }\n for (const uq of actualKeys.uniques) {\n if (!expectedKeys.uniques.has(uq)) {\n issues.push(\n `unique constraint \"${tableName}: (${uq})\" exists in the database but not in the model`,\n );\n }\n }\n }\n\n for (const tableName of Object.keys(actual.tables)) {\n if (!expected.tables[tableName]) {\n issues.push(`table \"${tableName}\" exists in the database but not in the models`);\n }\n }\n\n return issues;\n}\n\n/** Map a PostgreSQL `information_schema` type name to the closest IR kind. */\nfunction pgTypeToKind(dataType: string, udtName: string): ColumnType[\"kind\"] {\n const t = dataType.toLowerCase();\n if (t === \"user-defined\") return \"enum\"; // a named enum type\n if (t === \"smallint\") return \"smallint\";\n if (t === \"integer\") return \"integer\";\n if (t === \"bigint\") return \"bigint\";\n if (t === \"numeric\") return \"numeric\";\n if (t === \"real\") return \"real\";\n if (t === \"double precision\") return \"double\";\n if (t === \"character varying\") return \"varchar\";\n if (t === \"character\") return \"char\";\n if (t === \"text\") return \"text\";\n if (t === \"boolean\") return \"boolean\";\n if (t === \"date\") return \"date\";\n if (t.startsWith(\"time\")) return t.startsWith(\"timestamp\") ? \"timestamp\" : \"time\";\n if (t === \"bytea\") return \"blob\";\n if (t === \"json\") return \"json\";\n if (t === \"jsonb\") return \"json\";\n if (t === \"uuid\") return \"uuid\";\n return udtName === \"jsonb\" ? \"json\" : \"text\";\n}\n\n/**\n * Read the current PostgreSQL schema into a `SchemaIR` from `information_schema`.\n *\n * Not exercised by the in-repo test suite (no PostgreSQL in CI); mirrors\n * {@link introspectSqlite} for the async driver.\n *\n * @param driver An async PostgreSQL driver.\n * @returns The introspected schema.\n */\nexport async function introspectPostgres(driver: AsyncDriver): Promise<SchemaIR> {\n const tablesResult = await driver.execute(\n \"SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE' AND table_name != 'tempest_db_js_migrations'\",\n [],\n );\n const tables: Record<string, TableIR> = {};\n for (const row of tablesResult.rows) {\n const tableName = String(row.table_name);\n const colsResult = await driver.execute(\n \"SELECT column_name, data_type, udt_name, is_nullable FROM information_schema.columns WHERE table_name = $1\",\n [tableName],\n );\n const pkResult = await driver.execute(\n `SELECT a.attname AS name FROM pg_index i\n JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)\n WHERE i.indrelid = $1::regclass AND i.indisprimary`,\n [tableName],\n );\n const pkSet = new Set(pkResult.rows.map((r) => String(r.name)));\n const columns: Record<string, ColumnIR> = {};\n const primaryKey: string[] = [];\n for (const col of colsResult.rows) {\n const name = String(col.column_name);\n const isPk = pkSet.has(name);\n columns[name] = {\n name,\n type: {\n kind: pgTypeToKind(String(col.data_type), String(col.udt_name)),\n meta: {},\n },\n notNull: col.is_nullable === \"NO\" || isPk,\n primaryKey: isPk,\n default: null,\n unique: false,\n references: null,\n };\n if (isPk) primaryKey.push(name);\n }\n tables[tableName] = {\n name: tableName,\n columns,\n primaryKey,\n uniqueConstraints: await postgresUniques(driver, tableName),\n foreignKeys: await postgresForeignKeys(driver, tableName),\n };\n }\n return { tables };\n}\n\n/** Read a table's foreign keys from `pg_constraint` (best-effort, no CI). */\nasync function postgresForeignKeys(\n driver: AsyncDriver,\n table: string,\n): Promise<ForeignKeyIR[]> {\n const result = await driver.execute(\n `SELECT c.conname AS name,\n (SELECT array_agg(a.attname ORDER BY k.ord)\n FROM unnest(c.conkey) WITH ORDINALITY AS k(attnum, ord)\n JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = k.attnum) AS cols,\n cf.relname AS ref_table,\n (SELECT array_agg(a.attname ORDER BY k.ord)\n FROM unnest(c.confkey) WITH ORDINALITY AS k(attnum, ord)\n JOIN pg_attribute a ON a.attrelid = c.confrelid AND a.attnum = k.attnum) AS ref_cols\n FROM pg_constraint c\n JOIN pg_class cf ON cf.oid = c.confrelid\n WHERE c.contype = 'f' AND c.conrelid = $1::regclass`,\n [table],\n );\n return result.rows.map((r) => ({\n name: String(r.name),\n columns: (r.cols as string[]) ?? [],\n refTable: String(r.ref_table),\n refColumns: (r.ref_cols as string[]) ?? [],\n }));\n}\n\n/** Read a table's unique constraints from `pg_constraint` (best-effort, no CI). */\nasync function postgresUniques(\n driver: AsyncDriver,\n table: string,\n): Promise<UniqueConstraintIR[]> {\n const result = await driver.execute(\n `SELECT c.conname AS name,\n (SELECT array_agg(a.attname ORDER BY k.ord)\n FROM unnest(c.conkey) WITH ORDINALITY AS k(attnum, ord)\n JOIN pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = k.attnum) AS cols\n FROM pg_constraint c\n WHERE c.contype = 'u' AND c.conrelid = $1::regclass`,\n [table],\n );\n return result.rows.map((r) => ({\n name: String(r.name),\n columns: (r.cols as string[]) ?? [],\n }));\n}\n\n/**\n * Drift check for PostgreSQL: compares the live schema (introspected) against the\n * models by column kind, nullability, primary-key, and presence. Structural —\n * not exercised in CI (no PostgreSQL).\n *\n * @param driver An async PostgreSQL driver.\n * @param models The model classes that define the intended schema.\n * @returns A list of drift messages — empty means no drift.\n */\nexport async function checkDriftPostgres(\n driver: AsyncDriver,\n models: readonly ModelClass[],\n): Promise<string[]> {\n const actual = await introspectPostgres(driver);\n const expected = reflectSchema(models);\n const issues: string[] = [];\n for (const [tableName, expectedTable] of Object.entries(expected.tables)) {\n const actualTable = actual.tables[tableName];\n if (!actualTable) {\n issues.push(`table \"${tableName}\" is missing from the database`);\n continue;\n }\n for (const [colName, expectedCol] of Object.entries(expectedTable.columns)) {\n const actualCol = actualTable.columns[colName];\n if (!actualCol) {\n issues.push(`column \"${tableName}.${colName}\" is missing from the database`);\n continue;\n }\n if (expectedCol.type.kind !== actualCol.type.kind) {\n issues.push(\n `column \"${tableName}.${colName}\" type differs: model ${expectedCol.type.kind}, db ${actualCol.type.kind}`,\n );\n }\n if (expectedCol.notNull !== actualCol.notNull) {\n issues.push(`column \"${tableName}.${colName}\" nullability differs`);\n }\n }\n for (const colName of Object.keys(actualTable.columns)) {\n if (!expectedTable.columns[colName]) {\n issues.push(\n `column \"${tableName}.${colName}\" exists in the database but not in the model`,\n );\n }\n }\n\n const expectedKeys = constraintKeys(expectedTable);\n const actualKeys = constraintKeys(actualTable);\n for (const fk of expectedKeys.fks) {\n if (!actualKeys.fks.has(fk)) {\n issues.push(`foreign key \"${tableName}: ${fk}\" is missing from the database`);\n }\n }\n for (const uq of expectedKeys.uniques) {\n if (!actualKeys.uniques.has(uq)) {\n issues.push(\n `unique constraint \"${tableName}: (${uq})\" is missing from the database`,\n );\n }\n }\n }\n for (const tableName of Object.keys(actual.tables)) {\n if (!expected.tables[tableName]) {\n issues.push(`table \"${tableName}\" exists in the database but not in the models`);\n }\n }\n return issues;\n}\n","/**\n * tempest-db-js — Phase 6: rename detection.\n *\n * The differ ({@link diffSchema}) is deliberately conservative: a renamed column\n * looks like a drop + add, and a renamed table like a drop + create. That is the\n * *safe* default (never guesses), but it loses data. This module turns those\n * add/drop pairs into rename *candidates* the CLI can confirm — interactively at\n * a TTY, or explicitly via flags — and folds confirmed ones back into a single\n * `rename_table` / `rename_column` operation.\n *\n * Everything here is pure and structural (no SQL, no DB, no I/O), so the\n * detection and folding are fully testable; the actual prompting lives in the\n * `tempest-db` bin.\n */\n\nimport type { ColumnIR } from \"./ir.js\";\nimport type { Operation } from \"./operations.js\";\n\n/** A possible rename the differ emitted as a drop + add/create pair. */\nexport type RenameCandidate =\n | { readonly kind: \"table\"; readonly from: string; readonly to: string }\n | {\n readonly kind: \"column\";\n readonly table: string;\n readonly from: string;\n readonly to: string;\n };\n\n/** Structural identity of a column, ignoring its name. */\nfunction columnShape(col: ColumnIR): string {\n return JSON.stringify({\n type: col.type,\n notNull: col.notNull,\n primaryKey: col.primaryKey,\n default: col.default,\n unique: col.unique,\n references: col.references,\n });\n}\n\n/** Structural identity of a table's columns, ignoring the table name. */\nfunction tableShape(columns: Readonly<Record<string, ColumnIR>>): string {\n return Object.entries(columns)\n .map(([name, col]) => `${name}:${columnShape(col)}`)\n .sort()\n .join(\"|\");\n}\n\n/**\n * Detect rename candidates in a forward operation list.\n *\n * A table rename is a `create_table` + `drop_table` whose column shapes match\n * exactly. A column rename is an `add_column` + `drop_column` on the same table\n * whose column shapes match exactly. Only unambiguous 1:1 shape matches are\n * reported — if two dropped columns share a shape, neither is offered (the\n * mapping would be a guess).\n *\n * @param ops The forward operations from {@link diffSchema}.\n * @returns The rename candidates found (never mutates `ops`).\n */\nexport function detectRenames(ops: readonly Operation[]): RenameCandidate[] {\n const candidates: RenameCandidate[] = [];\n\n // --- table renames ---\n const creates = ops.filter((o) => o.kind === \"create_table\");\n const tableDrops = ops.filter((o) => o.kind === \"drop_table\");\n const takenCreate = new Set<string>();\n const takenDrop = new Set<string>();\n for (const create of creates) {\n const createShape = tableShape(create.table.columns);\n const matches = tableDrops.filter(\n (d) => !takenDrop.has(d.table.name) && tableShape(d.table.columns) === createShape,\n );\n // Only a unique match is a safe rename; ambiguity → leave as drop + create.\n const uniqueCreate =\n creates.filter(\n (c) =>\n !takenCreate.has(c.table.name) && tableShape(c.table.columns) === createShape,\n ).length === 1;\n if (matches.length === 1 && uniqueCreate) {\n const drop = matches[0] as Extract<Operation, { kind: \"drop_table\" }>;\n if (drop.table.name !== create.table.name) {\n candidates.push({ kind: \"table\", from: drop.table.name, to: create.table.name });\n takenCreate.add(create.table.name);\n takenDrop.add(drop.table.name);\n }\n }\n }\n\n // --- column renames (per table) ---\n const adds = ops.filter((o) => o.kind === \"add_column\");\n const colDrops = ops.filter((o) => o.kind === \"drop_column\");\n const tables = new Set([...adds.map((o) => o.table), ...colDrops.map((o) => o.table)]);\n for (const table of tables) {\n const tableAdds = adds.filter((o) => o.table === table);\n const tableColDrops = colDrops.filter((o) => o.table === table);\n const takenAdd = new Set<string>();\n const takenColDrop = new Set<string>();\n for (const add of tableAdds) {\n const shape = columnShape(add.column);\n const dropMatches = tableColDrops.filter(\n (d) => !takenColDrop.has(d.column.name) && columnShape(d.column) === shape,\n );\n const addMatches = tableAdds.filter(\n (a) => !takenAdd.has(a.column.name) && columnShape(a.column) === shape,\n );\n if (dropMatches.length === 1 && addMatches.length === 1) {\n const drop = dropMatches[0] as Extract<Operation, { kind: \"drop_column\" }>;\n candidates.push({\n kind: \"column\",\n table,\n from: drop.column.name,\n to: add.column.name,\n });\n takenAdd.add(add.column.name);\n takenColDrop.add(drop.column.name);\n }\n }\n }\n\n return candidates;\n}\n\n/** Match a table-rename candidate against an op pair. */\nfunction isTableRename(\n op: Operation,\n r: Extract<RenameCandidate, { kind: \"table\" }>,\n): boolean {\n return (\n (op.kind === \"create_table\" && op.table.name === r.to) ||\n (op.kind === \"drop_table\" && op.table.name === r.from)\n );\n}\n\n/** Match a column-rename candidate against an op pair. */\nfunction isColumnRename(\n op: Operation,\n r: Extract<RenameCandidate, { kind: \"column\" }>,\n): boolean {\n return (\n (op.kind === \"add_column\" && op.table === r.table && op.column.name === r.to) ||\n (op.kind === \"drop_column\" && op.table === r.table && op.column.name === r.from)\n );\n}\n\n/**\n * Fold confirmed renames into an operation list: each confirmed candidate's\n * drop + add/create pair is removed and replaced by a single rename operation,\n * inserted at the position of the first op it replaces (preserving order).\n *\n * @param ops The forward operations from {@link diffSchema}.\n * @param confirmed The rename candidates the user accepted.\n * @returns A new operation list with renames applied.\n */\nexport function applyRenames(\n ops: readonly Operation[],\n confirmed: readonly RenameCandidate[],\n): Operation[] {\n const out: Operation[] = [];\n const emitted = new Set<RenameCandidate>();\n\n for (const op of ops) {\n const match = confirmed.find((r) =>\n r.kind === \"table\" ? isTableRename(op, r) : isColumnRename(op, r),\n );\n if (!match) {\n out.push(op);\n continue;\n }\n // Emit the rename once (at the first op of the pair); skip both members.\n if (!emitted.has(match)) {\n emitted.add(match);\n out.push(\n match.kind === \"table\"\n ? { kind: \"rename_table\", from: match.from, to: match.to }\n : { kind: \"rename_column\", table: match.table, from: match.from, to: match.to },\n );\n }\n }\n return out;\n}\n","/**\n * tempest-db-js — Phase 6: the migration runner.\n *\n * The `Op` facade records operations; the `MigrationRunner` renders them to SQL\n * (per dialect) and runs them through a sync driver, tracking applied revisions\n * in a `tempest_db_js_migrations` table. Upgrades/downgrades respect the revision DAG.\n *\n * SQLite execution is real (via `node:sqlite`); the same code path serves any\n * sync driver.\n */\n\nimport type { AsyncDriver, SyncDriver } from \"../engine.js\";\nimport type { Dialect } from \"../url.js\";\nimport { renderOperation } from \"./ddl.js\";\nimport { topoOrder } from \"./graph.js\";\nimport type { ColumnIR, NamedConstraint, TableIR } from \"./ir.js\";\nimport { type Operation, invertAll } from \"./operations.js\";\n\n/**\n * The facade injected into `up()`/`down()`. Each method records an operation;\n * the runner renders and executes them after the function returns.\n */\nexport class Op {\n readonly operations: Operation[] = [];\n\n /** Record a raw operation (used by autogenerated migrations). */\n run(operation: Operation): void {\n this.operations.push(operation);\n }\n\n createTable(table: TableIR): void {\n this.run({ kind: \"create_table\", table });\n }\n dropTable(table: TableIR): void {\n this.run({ kind: \"drop_table\", table });\n }\n renameTable(from: string, to: string): void {\n this.run({ kind: \"rename_table\", from, to });\n }\n addColumn(table: string, column: ColumnIR): void {\n this.run({ kind: \"add_column\", table, column });\n }\n dropColumn(table: string, column: ColumnIR): void {\n this.run({ kind: \"drop_column\", table, column });\n }\n alterColumn(table: string, name: string, from: ColumnIR, to: ColumnIR): void {\n this.run({ kind: \"alter_column\", table, name, from, to });\n }\n renameColumn(table: string, from: string, to: string): void {\n this.run({ kind: \"rename_column\", table, from, to });\n }\n /** Rebuild a table (SQLite batch-mode / PostgreSQL per-column alters). */\n recreateTable(from: TableIR, to: TableIR): void {\n this.run({ kind: \"recreate_table\", from, to });\n }\n /** Add a table-level unique / foreign-key constraint. */\n addConstraint(table: string, constraint: NamedConstraint): void {\n this.run({ kind: \"add_constraint\", table, constraint });\n }\n /** Drop a table-level unique / foreign-key constraint. */\n dropConstraint(table: string, constraint: NamedConstraint): void {\n this.run({ kind: \"drop_constraint\", table, constraint });\n }\n /** Raw SQL escape hatch (e.g. a data migration). `down` may be `null`. */\n execute(up: string, down: string | null = null): void {\n this.run({ kind: \"execute\", up, down });\n }\n}\n\n/** A migration file's shape. */\nexport interface Migration {\n readonly revision: string;\n readonly downRevision: readonly string[];\n readonly label?: string;\n up(op: Op): void;\n down(op: Op): void;\n}\n\nconst VERSION_TABLE = \"tempest_db_js_migrations\";\n\n/** Runs migrations against a sync driver, tracking applied revisions. */\nexport class MigrationRunner {\n constructor(\n private readonly driver: SyncDriver,\n private readonly dialect: Dialect,\n ) {}\n\n /** Create the version-tracking table if it does not exist. */\n ensureVersionTable(): void {\n this.driver.execute(\n `CREATE TABLE IF NOT EXISTS \"${VERSION_TABLE}\" (revision TEXT PRIMARY KEY, applied_at TEXT NOT NULL, down_revision TEXT NOT NULL)`,\n [],\n );\n }\n\n /** The set of applied revision ids. */\n applied(): Set<string> {\n this.ensureVersionTable();\n const { rows } = this.driver.execute(`SELECT revision FROM \"${VERSION_TABLE}\"`, []);\n return new Set(rows.map((r) => String(r.revision)));\n }\n\n private runOps(ops: readonly Operation[]): void {\n for (const op of ops) {\n for (const stmt of renderOperation(op, this.dialect)) {\n const trimmed = stmt.trim();\n if (trimmed.length === 0 || trimmed.startsWith(\"--\")) continue;\n this.driver.execute(stmt, []);\n }\n }\n }\n\n private record(migration: Migration, appliedAt: string): void {\n this.driver.execute(\n `INSERT INTO \"${VERSION_TABLE}\" (revision, applied_at, down_revision) VALUES (?, ?, ?)`,\n [migration.revision, appliedAt, migration.downRevision.join(\",\")],\n );\n }\n\n private forget(revision: string): void {\n this.driver.execute(`DELETE FROM \"${VERSION_TABLE}\" WHERE revision = ?`, [revision]);\n }\n\n /**\n * Apply all pending migrations up to the head(s), in DAG order.\n *\n * @param migrations All known migrations.\n * @param appliedAt Timestamp string to stamp (pass one in — the runtime has no\n * wall clock of its own here).\n * @returns The revision ids that were applied this run.\n */\n upgrade(migrations: readonly Migration[], appliedAt: string): string[] {\n const done = this.applied();\n const ordered = topoOrder(migrations);\n const ran: string[] = [];\n for (const migration of ordered) {\n if (done.has(migration.revision)) continue;\n const op = new Op();\n migration.up(op);\n this.runOps(op.operations);\n this.record(migration, appliedAt);\n ran.push(migration.revision);\n }\n return ran;\n }\n\n /**\n * Revert the last `steps` applied migrations (default 1), newest first.\n *\n * @param migrations All known migrations.\n * @param steps How many applied revisions to roll back.\n * @returns The revision ids that were reverted.\n */\n downgrade(migrations: readonly Migration[], steps = 1): string[] {\n const done = this.applied();\n const ordered = topoOrder(migrations).filter((m) => done.has(m.revision));\n const toRevert = ordered.slice(-steps).reverse();\n const reverted: string[] = [];\n for (const migration of toRevert) {\n const op = new Op();\n // Prefer the migration's own down(); fall back to inverting up().\n if (migration.down.length >= 0) {\n try {\n migration.down(op);\n } catch {\n op.operations.length = 0;\n }\n }\n if (op.operations.length === 0) {\n const upOp = new Op();\n migration.up(upOp);\n op.operations.push(...invertAll(upOp.operations));\n }\n this.runOps(op.operations);\n this.forget(migration.revision);\n reverted.push(migration.revision);\n }\n return reverted;\n }\n}\n\n// ---------------------------------------------------------------------------\n// async runner (PostgreSQL / any async driver)\n// ---------------------------------------------------------------------------\n\n/** Quote an identifier for the dialect (backticks on MySQL, double-quotes else). */\nfunction quoteIdent(name: string, dialect: Dialect): string {\n return dialect === \"mysql\"\n ? `\\`${name.replace(/`/g, \"``\")}\\``\n : `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\n/** The n-th (1-based) placeholder for the dialect (`$n` on PostgreSQL, `?` else). */\nfunction placeholder(index: number, dialect: Dialect): string {\n return dialect === \"postgresql\" ? `$${index}` : \"?\";\n}\n\n/**\n * Runs migrations against an **async** driver (PostgreSQL, or any async driver),\n * tracking applied revisions. Mirrors {@link MigrationRunner} but every statement\n * is awaited, and identifier quoting + placeholder style follow the dialect —\n * so the version table and its bookkeeping are portable across SQLite/PG/MySQL.\n */\nexport class AsyncMigrationRunner {\n private readonly vt: string;\n\n constructor(\n private readonly driver: AsyncDriver,\n private readonly dialect: Dialect,\n ) {\n this.vt = quoteIdent(VERSION_TABLE, dialect);\n }\n\n /** Create the version-tracking table if it does not exist. */\n async ensureVersionTable(): Promise<void> {\n await this.driver.execute(\n `CREATE TABLE IF NOT EXISTS ${this.vt} (revision ${this.textType()} PRIMARY KEY, applied_at ${this.textType()} NOT NULL, down_revision ${this.textType()} NOT NULL)`,\n [],\n );\n }\n\n /** A portable \"text\" column type for the version table. */\n private textType(): string {\n // MySQL cannot index an unbounded TEXT primary key; use VARCHAR there.\n return this.dialect === \"mysql\" ? \"VARCHAR(255)\" : \"TEXT\";\n }\n\n /** The set of applied revision ids. */\n async applied(): Promise<Set<string>> {\n await this.ensureVersionTable();\n const { rows } = await this.driver.execute(`SELECT revision FROM ${this.vt}`, []);\n return new Set(rows.map((r) => String(r.revision)));\n }\n\n private async runOps(ops: readonly Operation[]): Promise<void> {\n for (const op of ops) {\n for (const stmt of renderOperation(op, this.dialect)) {\n const trimmed = stmt.trim();\n if (trimmed.length === 0 || trimmed.startsWith(\"--\")) continue;\n await this.driver.execute(stmt, []);\n }\n }\n }\n\n private async record(migration: Migration, appliedAt: string): Promise<void> {\n const p = (i: number) => placeholder(i, this.dialect);\n await this.driver.execute(\n `INSERT INTO ${this.vt} (revision, applied_at, down_revision) VALUES (${p(1)}, ${p(2)}, ${p(3)})`,\n [migration.revision, appliedAt, migration.downRevision.join(\",\")],\n );\n }\n\n private async forget(revision: string): Promise<void> {\n await this.driver.execute(\n `DELETE FROM ${this.vt} WHERE revision = ${placeholder(1, this.dialect)}`,\n [revision],\n );\n }\n\n /**\n * Apply all pending migrations up to the head(s), in DAG order.\n *\n * @param migrations All known migrations.\n * @param appliedAt Timestamp string to stamp on each applied revision.\n * @returns The revision ids that were applied this run.\n */\n async upgrade(migrations: readonly Migration[], appliedAt: string): Promise<string[]> {\n const done = await this.applied();\n const ordered = topoOrder(migrations);\n const ran: string[] = [];\n for (const migration of ordered) {\n if (done.has(migration.revision)) continue;\n const op = new Op();\n migration.up(op);\n await this.runOps(op.operations);\n await this.record(migration, appliedAt);\n ran.push(migration.revision);\n }\n return ran;\n }\n\n /**\n * Revert the last `steps` applied migrations (default 1), newest first.\n *\n * @param migrations All known migrations.\n * @param steps How many applied revisions to roll back.\n * @returns The revision ids that were reverted.\n */\n async downgrade(migrations: readonly Migration[], steps = 1): Promise<string[]> {\n const done = await this.applied();\n const ordered = topoOrder(migrations).filter((m) => done.has(m.revision));\n const toRevert = ordered.slice(-steps).reverse();\n const reverted: string[] = [];\n for (const migration of toRevert) {\n const op = new Op();\n try {\n migration.down(op);\n } catch {\n op.operations.length = 0;\n }\n if (op.operations.length === 0) {\n const upOp = new Op();\n migration.up(upOp);\n op.operations.push(...invertAll(upOp.operations));\n }\n await this.runOps(op.operations);\n await this.forget(migration.revision);\n reverted.push(migration.revision);\n }\n return reverted;\n }\n}\n","/**\n * tempest-db-js — Phase 6: migration replay → virtual schema IR.\n *\n * Applies a migration's operations to an in-memory `SchemaIR`, building the\n * \"current\" schema without touching a database. This is the hybrid source of\n * truth for autogenerate: diff the replayed schema against the reflected models.\n */\n\nimport { topoOrder } from \"./graph.js\";\nimport { type SchemaIR, type TableIR, emptySchema } from \"./ir.js\";\nimport type { Operation } from \"./operations.js\";\nimport { type Migration, Op } from \"./runner.js\";\n\n/** Apply one operation to a schema, returning the updated schema. */\nexport function applyOperation(schema: SchemaIR, op: Operation): SchemaIR {\n const tables: Record<string, TableIR> = { ...schema.tables };\n switch (op.kind) {\n case \"create_table\":\n tables[op.table.name] = op.table;\n break;\n case \"drop_table\":\n delete tables[op.table.name];\n break;\n case \"rename_table\": {\n const t = tables[op.from];\n if (t) {\n delete tables[op.from];\n tables[op.to] = { ...t, name: op.to };\n }\n break;\n }\n case \"recreate_table\":\n delete tables[op.from.name];\n tables[op.to.name] = op.to;\n break;\n case \"add_column\": {\n const t = tables[op.table];\n if (t) {\n tables[op.table] = {\n ...t,\n columns: { ...t.columns, [op.column.name]: op.column },\n };\n }\n break;\n }\n case \"drop_column\": {\n const t = tables[op.table];\n if (t) {\n const columns = { ...t.columns };\n delete columns[op.column.name];\n tables[op.table] = { ...t, columns };\n }\n break;\n }\n case \"alter_column\": {\n const t = tables[op.table];\n if (t) {\n tables[op.table] = {\n ...t,\n columns: { ...t.columns, [op.name]: op.to },\n };\n }\n break;\n }\n case \"rename_column\": {\n const t = tables[op.table];\n const col = t?.columns[op.from];\n if (t && col) {\n const columns = { ...t.columns };\n delete columns[op.from];\n columns[op.to] = { ...col, name: op.to };\n tables[op.table] = { ...t, columns };\n }\n break;\n }\n case \"add_constraint\": {\n const t = tables[op.table];\n if (t) {\n tables[op.table] =\n op.constraint.type === \"unique\"\n ? {\n ...t,\n uniqueConstraints: [...t.uniqueConstraints, op.constraint.constraint],\n }\n : { ...t, foreignKeys: [...t.foreignKeys, op.constraint.constraint] };\n }\n break;\n }\n case \"drop_constraint\": {\n const t = tables[op.table];\n if (t) {\n const dropName = op.constraint.constraint.name;\n tables[op.table] =\n op.constraint.type === \"unique\"\n ? {\n ...t,\n uniqueConstraints: t.uniqueConstraints.filter((u) => u.name !== dropName),\n }\n : {\n ...t,\n foreignKeys: t.foreignKeys.filter((f) => f.name !== dropName),\n };\n }\n break;\n }\n case \"execute\":\n // raw SQL is opaque to the IR\n break;\n }\n return { tables };\n}\n\n/**\n * Replay migrations (in DAG order) into a virtual `SchemaIR` — the \"current\"\n * schema, computed without a database.\n *\n * @param migrations All known migrations.\n * @returns The schema after applying every migration's `up()`.\n */\nexport function replaySchema(migrations: readonly Migration[]): SchemaIR {\n let schema = emptySchema();\n for (const migration of topoOrder(migrations)) {\n const op = new Op();\n migration.up(op);\n for (const operation of op.operations) {\n schema = applyOperation(schema, operation);\n }\n }\n return schema;\n}\n","/**\n * tempest-db-js — migration CLI (programmatic core).\n *\n * `runMigrationCli(argv, config)` dispatches Alembic-style commands against a\n * driver + a set of migrations + (optionally) the models. It returns lines and\n * an exit code rather than touching `process`, so it is fully testable; a thin\n * `bin` wrapper just maps `process.argv`/`process.exit` onto it.\n */\n\nimport type { SyncDriver } from \"../engine.js\";\nimport type { ModelClass } from \"../index.js\";\nimport type { Dialect } from \"../url.js\";\nimport { generateMigration, makeRevisionId } from \"./codegen.js\";\nimport { renderOperation } from \"./ddl.js\";\nimport { diffSchema } from \"./diff.js\";\nimport { heads as graphHeads, topoOrder } from \"./graph.js\";\nimport { checkDrift } from \"./introspect.js\";\nimport { reflectSchema } from \"./ir.js\";\nimport type { Operation } from \"./operations.js\";\nimport { type RenameCandidate, applyRenames, detectRenames } from \"./renames.js\";\nimport { replaySchema } from \"./replay.js\";\nimport { type Migration, MigrationRunner, Op } from \"./runner.js\";\n\n/** Configuration the CLI operates against. */\nexport interface CliConfig {\n readonly driver: SyncDriver;\n readonly dialect: Dialect;\n readonly migrations: readonly Migration[];\n readonly models?: readonly ModelClass[];\n /** Timestamp string stamped on applied revisions (no wall clock here). */\n readonly appliedAt?: string;\n}\n\n/** The result of a CLI run. */\nexport interface CliResult {\n readonly code: number;\n readonly lines: string[];\n}\n\n/**\n * Identity helper for authoring a typed migration config file. Gives editor\n * autocompletion and type-checking on the object the `tempest-db` bin loads.\n *\n * @example\n * ```ts\n * // tempest-db.config.mjs\n * import { defineMigrationConfig } from \"tempest-db-js/migrations\";\n * import { NodeSqliteDriver } from \"tempest-db-js\";\n * import { migrations } from \"./migrations/index.js\";\n * import { User } from \"./models.js\";\n *\n * export default defineMigrationConfig({\n * driver: NodeSqliteDriver.open(\"app.db\"),\n * dialect: \"sqlite\",\n * migrations,\n * models: [User],\n * });\n * ```\n *\n * @param config The migration config to pass through unchanged.\n * @returns The same config, typed as `CliConfig`.\n */\nexport function defineMigrationConfig(config: CliConfig): CliConfig {\n return config;\n}\n\nfunction ok(lines: string[]): CliResult {\n return { code: 0, lines };\n}\nfunction fail(lines: string[]): CliResult {\n return { code: 1, lines };\n}\n\n/**\n * Parse rename flags into explicit rename candidates.\n *\n * `--rename-table <from>:<to>` and `--rename-column <table>.<from>:<to>` may each\n * be repeated. Malformed specs are ignored (the safe drop + add stays).\n *\n * @param rest The command arguments.\n * @returns The explicitly requested renames.\n */\nfunction parseRenameFlags(rest: readonly string[]): RenameCandidate[] {\n const out: RenameCandidate[] = [];\n for (let i = 0; i < rest.length; i += 1) {\n const arg = rest[i];\n if (arg === \"--rename-table\") {\n const [from, to] = (rest[i + 1] ?? \"\").split(\":\");\n i += 1;\n if (from && to) out.push({ kind: \"table\", from, to });\n } else if (arg === \"--rename-column\") {\n const [left, to] = (rest[i + 1] ?? \"\").split(\":\");\n i += 1;\n const dot = left?.lastIndexOf(\".\") ?? -1;\n if (left && to && dot > 0) {\n out.push({\n kind: \"column\",\n table: left.slice(0, dot),\n from: left.slice(dot + 1),\n to,\n });\n }\n }\n }\n return out;\n}\n\n/** Pending migrations (DAG order) not yet applied. */\nfunction pending(config: CliConfig, runner: MigrationRunner): Migration[] {\n const done = runner.applied();\n return topoOrder(config.migrations).filter((m) => !done.has(m.revision));\n}\n\n/**\n * Run one CLI command.\n *\n * Commands: `current`, `history`, `heads`, `upgrade [--sql]`, `downgrade [N]`,\n * `check`, `revision -m <msg> [--autogenerate]`.\n *\n * @param argv The command and its arguments (without the program name).\n * @param config The driver, migrations, and models to operate on.\n * @returns Output lines and an exit code.\n */\nexport function runMigrationCli(argv: readonly string[], config: CliConfig): CliResult {\n const [command, ...rest] = argv;\n const runner = new MigrationRunner(config.driver, config.dialect);\n const appliedAt = config.appliedAt ?? \"1970-01-01T00:00:00.000Z\";\n\n switch (command) {\n case \"current\": {\n const applied = [...runner.applied()].sort();\n return ok(applied.length > 0 ? applied : [\"(no migrations applied)\"]);\n }\n\n case \"heads\":\n return ok(graphHeads(config.migrations));\n\n case \"history\": {\n const done = runner.applied();\n return ok(\n topoOrder(config.migrations).map(\n (m) =>\n `${done.has(m.revision) ? \"✓\" : \"·\"} ${m.revision}${m.label ? ` — ${m.label}` : \"\"}`,\n ),\n );\n }\n\n case \"upgrade\": {\n if (rest.includes(\"--sql\")) {\n const lines: string[] = [];\n for (const migration of pending(config, runner)) {\n const op = new Op();\n migration.up(op);\n lines.push(`-- ${migration.revision}`);\n for (const operation of op.operations) {\n for (const stmt of renderOperation(operation, config.dialect))\n lines.push(`${stmt};`);\n }\n }\n return ok(lines.length > 0 ? lines : [\"-- nothing to upgrade\"]);\n }\n const ran = runner.upgrade(config.migrations, appliedAt);\n return ok(ran.length > 0 ? ran.map((r) => `applied ${r}`) : [\"nothing to upgrade\"]);\n }\n\n case \"downgrade\": {\n const steps = rest[0] ? Number(rest[0]) : 1;\n const reverted = runner.downgrade(config.migrations, steps);\n return ok(\n reverted.length > 0\n ? reverted.map((r) => `reverted ${r}`)\n : [\"nothing to downgrade\"],\n );\n }\n\n case \"check\": {\n if (!config.models) return fail([\"check requires models in the config\"]);\n // Drift: live DB vs models (SQLite introspection).\n const drift =\n config.dialect === \"sqlite\" ? checkDrift(config.driver, config.models) : [];\n // Pending model changes not yet captured by a migration.\n const undiffed = diffSchema(\n replaySchema(config.migrations),\n reflectSchema(config.models),\n );\n const issues = [\n ...drift.map((d) => `drift: ${d}`),\n ...undiffed.map((o) => `uncaptured: ${o.kind}`),\n ];\n return issues.length > 0 ? fail(issues) : ok([\"no drift; models match migrations\"]);\n }\n\n case \"revision\": {\n if (!config.models)\n return fail([\"revision --autogenerate requires models in the config\"]);\n const msgIndex = rest.indexOf(\"-m\");\n const label = msgIndex >= 0 ? (rest[msgIndex + 1] ?? \"revision\") : \"revision\";\n const parents = graphHeads(config.migrations);\n let ops: Operation[] = rest.includes(\"--autogenerate\")\n ? diffSchema(replaySchema(config.migrations), reflectSchema(config.models))\n : [];\n if (rest.includes(\"--autogenerate\")) {\n // Fold add/drop pairs into renames: `--autorename` accepts every\n // detected candidate; otherwise only the explicit `--rename-*` flags.\n const confirmed = rest.includes(\"--autorename\")\n ? detectRenames(ops)\n : parseRenameFlags(rest);\n if (confirmed.length > 0) ops = applyRenames(ops, confirmed);\n }\n const source = generateMigration({\n revision: makeRevisionId(label, parents),\n downRevision: parents,\n label,\n operations: ops,\n });\n return ok(source.split(\"\\n\"));\n }\n\n default:\n return fail([\n `unknown command ${JSON.stringify(command)}`,\n \"commands: current | history | heads | upgrade [--sql] | downgrade [N] | check | revision -m <msg> [--autogenerate]\",\n ]);\n }\n}\n"]}
|
|
@@ -1748,7 +1748,8 @@ function createPostgresDriver(url, pool) {
|
|
|
1748
1748
|
var DEFAULT_FLAGS = {
|
|
1749
1749
|
primaryKey: false,
|
|
1750
1750
|
notNull: false,
|
|
1751
|
-
hasDefault: false
|
|
1751
|
+
hasDefault: false,
|
|
1752
|
+
unique: false
|
|
1752
1753
|
};
|
|
1753
1754
|
var sql = {
|
|
1754
1755
|
/** Current timestamp at insert (`CURRENT_TIMESTAMP` / `now()`). */
|
|
@@ -1768,23 +1769,38 @@ var sql = {
|
|
|
1768
1769
|
function isDefaultValue(value) {
|
|
1769
1770
|
return typeof value === "object" && value !== null && "kind" in value && (value.kind === "literal" || value.kind === "expression");
|
|
1770
1771
|
}
|
|
1772
|
+
function parseReference(ref, options) {
|
|
1773
|
+
const dot = ref.lastIndexOf(".");
|
|
1774
|
+
if (dot <= 0 || dot === ref.length - 1) {
|
|
1775
|
+
throw new Error(`Invalid foreign key reference "${ref}"; expected "table.column".`);
|
|
1776
|
+
}
|
|
1777
|
+
return {
|
|
1778
|
+
table: ref.slice(0, dot),
|
|
1779
|
+
column: ref.slice(dot + 1),
|
|
1780
|
+
onDelete: options?.onDelete,
|
|
1781
|
+
onUpdate: options?.onUpdate
|
|
1782
|
+
};
|
|
1783
|
+
}
|
|
1771
1784
|
var Column = class _Column {
|
|
1772
|
-
constructor(type, flags, defaultValue = null, onUpdateValue = null) {
|
|
1785
|
+
constructor(type, flags, defaultValue = null, onUpdateValue = null, reference = null) {
|
|
1773
1786
|
this.type = type;
|
|
1774
1787
|
this.flags = flags;
|
|
1775
1788
|
this.defaultValue = defaultValue;
|
|
1776
1789
|
this.onUpdateValue = onUpdateValue;
|
|
1790
|
+
this.reference = reference;
|
|
1777
1791
|
}
|
|
1778
1792
|
type;
|
|
1779
1793
|
flags;
|
|
1780
1794
|
defaultValue;
|
|
1781
1795
|
onUpdateValue;
|
|
1796
|
+
reference;
|
|
1782
1797
|
primaryKey() {
|
|
1783
1798
|
return new _Column(
|
|
1784
1799
|
this.type,
|
|
1785
1800
|
{ ...this.flags, primaryKey: true, hasDefault: true },
|
|
1786
1801
|
this.defaultValue,
|
|
1787
|
-
this.onUpdateValue
|
|
1802
|
+
this.onUpdateValue,
|
|
1803
|
+
this.reference
|
|
1788
1804
|
);
|
|
1789
1805
|
}
|
|
1790
1806
|
notNull() {
|
|
@@ -1792,7 +1808,40 @@ var Column = class _Column {
|
|
|
1792
1808
|
this.type,
|
|
1793
1809
|
{ ...this.flags, notNull: true },
|
|
1794
1810
|
this.defaultValue,
|
|
1795
|
-
this.onUpdateValue
|
|
1811
|
+
this.onUpdateValue,
|
|
1812
|
+
this.reference
|
|
1813
|
+
);
|
|
1814
|
+
}
|
|
1815
|
+
/**
|
|
1816
|
+
* Add a `UNIQUE` constraint to the column (mirrors SQLAlchemy's
|
|
1817
|
+
* `mapped_column(unique=True)`). DDL-only — does not change the inferred type.
|
|
1818
|
+
*/
|
|
1819
|
+
unique() {
|
|
1820
|
+
return new _Column(
|
|
1821
|
+
this.type,
|
|
1822
|
+
{ ...this.flags, unique: true },
|
|
1823
|
+
this.defaultValue,
|
|
1824
|
+
this.onUpdateValue,
|
|
1825
|
+
this.reference
|
|
1826
|
+
);
|
|
1827
|
+
}
|
|
1828
|
+
/**
|
|
1829
|
+
* Declare a foreign-key reference to another table's column, à la SQLAlchemy's
|
|
1830
|
+
* `mapped_column(ForeignKey("table.column", ondelete=...))`. DDL-only — does
|
|
1831
|
+
* not change the inferred type.
|
|
1832
|
+
*
|
|
1833
|
+
* @param ref The target as `"table.column"` (e.g. `"users.id"`).
|
|
1834
|
+
* @param options Optional `onDelete` / `onUpdate` referential actions.
|
|
1835
|
+
* @returns A new column carrying the reference.
|
|
1836
|
+
* @throws Error When `ref` is not a valid `"table.column"` string.
|
|
1837
|
+
*/
|
|
1838
|
+
references(ref, options) {
|
|
1839
|
+
return new _Column(
|
|
1840
|
+
this.type,
|
|
1841
|
+
this.flags,
|
|
1842
|
+
this.defaultValue,
|
|
1843
|
+
this.onUpdateValue,
|
|
1844
|
+
parseReference(ref, options)
|
|
1796
1845
|
);
|
|
1797
1846
|
}
|
|
1798
1847
|
/**
|
|
@@ -1805,7 +1854,8 @@ var Column = class _Column {
|
|
|
1805
1854
|
this.type,
|
|
1806
1855
|
{ ...this.flags, hasDefault: true },
|
|
1807
1856
|
resolved,
|
|
1808
|
-
this.onUpdateValue
|
|
1857
|
+
this.onUpdateValue,
|
|
1858
|
+
this.reference
|
|
1809
1859
|
);
|
|
1810
1860
|
}
|
|
1811
1861
|
/**
|
|
@@ -1814,7 +1864,7 @@ var Column = class _Column {
|
|
|
1814
1864
|
*/
|
|
1815
1865
|
onUpdate(value) {
|
|
1816
1866
|
const resolved = isDefaultValue(value) ? value : { kind: "literal", value };
|
|
1817
|
-
return new _Column(this.type, this.flags, this.defaultValue, resolved);
|
|
1867
|
+
return new _Column(this.type, this.flags, this.defaultValue, resolved, this.reference);
|
|
1818
1868
|
}
|
|
1819
1869
|
};
|
|
1820
1870
|
function makeColumn(kind, meta = {}) {
|
|
@@ -1868,8 +1918,36 @@ var column = {
|
|
|
1868
1918
|
/** `ENUM(...values)` → a string-literal union of the given values. */
|
|
1869
1919
|
enum: (...values) => makeColumn("enum", { values })
|
|
1870
1920
|
};
|
|
1921
|
+
function unique(...columns) {
|
|
1922
|
+
if (columns.length === 0) {
|
|
1923
|
+
throw new Error("unique() requires at least one column.");
|
|
1924
|
+
}
|
|
1925
|
+
return { kind: "unique", columns };
|
|
1926
|
+
}
|
|
1927
|
+
function foreignKey(columns, refTable, refColumns, options) {
|
|
1928
|
+
if (columns.length === 0 || columns.length !== refColumns.length) {
|
|
1929
|
+
throw new Error(
|
|
1930
|
+
"foreignKey() requires matching, non-empty local and referenced column lists."
|
|
1931
|
+
);
|
|
1932
|
+
}
|
|
1933
|
+
return {
|
|
1934
|
+
kind: "foreignKey",
|
|
1935
|
+
name: options?.name,
|
|
1936
|
+
columns,
|
|
1937
|
+
refTable,
|
|
1938
|
+
refColumns,
|
|
1939
|
+
onDelete: options?.onDelete,
|
|
1940
|
+
onUpdate: options?.onUpdate
|
|
1941
|
+
};
|
|
1942
|
+
}
|
|
1871
1943
|
var Model = class {
|
|
1872
1944
|
static tablename;
|
|
1945
|
+
/**
|
|
1946
|
+
* Optional table-level constraints (composite unique / foreign keys), returned
|
|
1947
|
+
* by a thunk so forward references resolve lazily. Mirrors SQLAlchemy's
|
|
1948
|
+
* `__table_args__`.
|
|
1949
|
+
*/
|
|
1950
|
+
static tableArgs;
|
|
1873
1951
|
};
|
|
1874
1952
|
var columnsCache = /* @__PURE__ */ new WeakMap();
|
|
1875
1953
|
function columnsOf(model) {
|
|
@@ -1886,6 +1964,6 @@ function columnsOf(model) {
|
|
|
1886
1964
|
return out;
|
|
1887
1965
|
}
|
|
1888
1966
|
|
|
1889
|
-
export { ActiveRecord, Agg, AsyncEngine, AsyncResult, AsyncSession, BaseDialect, BaseRepository, Column, DeleteBuilder, InsertBuilder, InvalidDatabaseUrl, JoinBuilder, Model, MysqlDialect, NoResultError, NodeSqliteDriver, OPERATORS, PostgresDialect, QueryExecutionError, RecordNotFound, SelectBuilder, SqliteDialect, SyncEngine, SyncResult, SyncSession, UpdateBuilder, ValidationError, activeRecord, and, avg, belongsTo, column, columnsOf, count, createEngine, createSyncEngine, del, detectDialect, fromDict, getDialect, hasMany, insert, isCondition, join, loadRelations, max, min, not, or, parse, parseDatabaseUrl, select, sql, stringify, sum, toCondNode, toDict, toJSON, update };
|
|
1890
|
-
//# sourceMappingURL=chunk-
|
|
1891
|
-
//# sourceMappingURL=chunk-
|
|
1967
|
+
export { ActiveRecord, Agg, AsyncEngine, AsyncResult, AsyncSession, BaseDialect, BaseRepository, Column, DeleteBuilder, InsertBuilder, InvalidDatabaseUrl, JoinBuilder, Model, MysqlDialect, NoResultError, NodeSqliteDriver, OPERATORS, PostgresDialect, QueryExecutionError, RecordNotFound, SelectBuilder, SqliteDialect, SyncEngine, SyncResult, SyncSession, UpdateBuilder, ValidationError, activeRecord, and, avg, belongsTo, column, columnsOf, count, createEngine, createSyncEngine, del, detectDialect, foreignKey, fromDict, getDialect, hasMany, insert, isCondition, join, loadRelations, max, min, not, or, parse, parseDatabaseUrl, select, sql, stringify, sum, toCondNode, toDict, toJSON, unique, update };
|
|
1968
|
+
//# sourceMappingURL=chunk-JR4MLFQN.js.map
|
|
1969
|
+
//# sourceMappingURL=chunk-JR4MLFQN.js.map
|