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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/migrations/ir.ts","../../src/migrations/operations.ts","../../src/migrations/ddl.ts","../../src/migrations/diff.ts","../../src/migrations/graph.ts","../../src/migrations/codegen.ts","../../src/migrations/runner.ts","../../src/migrations/introspect.ts","../../src/migrations/replay.ts","../../src/migrations/cli.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\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 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}\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}\n\n/** A whole schema, keyed by table name. */\nexport interface SchemaIR {\n readonly tables: Record<string, TableIR>;\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 };\n if (isPk) primaryKey.push(name);\n }\n return { name: model.tablename, columns, primaryKey };\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 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, 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 | { 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 \"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: 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 or PostgreSQL.\n */\n\nimport type { ColumnType, DefaultValue } from \"../index.js\";\nimport type { Dialect } from \"../url.js\";\nimport type { ColumnIR, TableIR } from \"./ir.js\";\nimport type { Operation } from \"./operations.js\";\n\nfunction quoteId(name: string): string {\n return `\"${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 // 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 a Phase 6e refinement; fall back to TEXT for now.\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 === \"sqlite\" ? \"CURRENT_TIMESTAMP\" : \"now()\";\n case \"current_date\":\n return \"CURRENT_DATE\";\n case \"current_time\":\n return \"CURRENT_TIME\";\n case \"uuidv4\":\n return dialect === \"sqlite\"\n ? \"(lower(hex(randomblob(16))))\"\n : \"gen_random_uuid()\";\n }\n }\n const value = def.value;\n if (value === null) return \"NULL\";\n if (typeof value === \"boolean\") {\n return dialect === \"sqlite\" ? (value ? \"1\" : \"0\") : value ? \"TRUE\" : \"FALSE\";\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 one column definition: `\"name\" TYPE [NOT NULL] [DEFAULT x]`. */\nexport function renderColumnDef(col: ColumnIR, dialect: Dialect): string {\n let sql = `${quoteId(col.name)} ${renderColumnType(col.type, dialect)}`;\n if (col.notNull) sql += \" NOT NULL\";\n if (col.default !== null) sql += ` DEFAULT ${renderDefault(col.default, 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/**\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 */\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)} AS ENUM (${values})`);\n let def = `${quoteId(c.name)} ${quoteId(typeName)}`;\n if (c.notNull) def += \" NOT NULL\";\n if (c.default !== null) def += ` DEFAULT ${renderDefault(c.default, dialect)}`;\n return def;\n }\n return renderColumnDef(c, dialect);\n });\n if (table.primaryKey.length > 0) {\n cols.push(`PRIMARY KEY (${table.primaryKey.map(quoteId).join(\", \")})`);\n }\n return [\n ...typeStmts,\n `CREATE TABLE ${quoteId(table.name)} (\\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 Phase 6e batch/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)}`];\n case \"rename_table\":\n return [`ALTER TABLE ${quoteId(op.from)} RENAME TO ${quoteId(op.to)}`];\n case \"add_column\":\n return [\n `ALTER TABLE ${quoteId(op.table)} ADD COLUMN ${renderColumnDef(op.column, dialect)}`,\n ];\n case \"drop_column\":\n return [`ALTER TABLE ${quoteId(op.table)} DROP COLUMN ${quoteId(op.column.name)}`];\n case \"rename_column\":\n return [\n `ALTER TABLE ${quoteId(op.table)} RENAME COLUMN ${quoteId(op.from)} TO ${quoteId(op.to)}`,\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 : renderPostgresTableDiff(op.from, op.to);\n case \"execute\":\n return [op.up];\n }\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(`PRIMARY KEY (${to.primaryKey.map(quoteId).join(\", \")})`);\n }\n const commonSql = common.map(quoteId).join(\", \");\n return [\n \"PRAGMA foreign_keys=off\",\n `CREATE TABLE ${quoteId(tmp)} (\\n ${cols.join(\",\\n \")}\\n)`,\n common.length > 0\n ? `INSERT INTO ${quoteId(tmp)} (${commonSql}) SELECT ${commonSql} FROM ${quoteId(from.name)}`\n : `-- no common columns to copy from ${from.name}`,\n `DROP TABLE ${quoteId(from.name)}`,\n `ALTER TABLE ${quoteId(tmp)} RENAME TO ${quoteId(to.name)}`,\n \"PRAGMA foreign_keys=on\",\n ];\n}\n\n/** PostgreSQL realizes a table recreate as per-column ADD/DROP/ALTER. */\nfunction renderPostgresTableDiff(from: TableIR, to: TableIR): 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)} ADD COLUMN ${renderColumnDef(col, \"postgresql\")}`,\n );\n } else {\n stmts.push(...renderAlterColumn(to.name, col, \"postgresql\"));\n }\n }\n for (const name of Object.keys(from.columns)) {\n if (!(name in to.columns)) {\n stmts.push(`ALTER TABLE ${quoteId(to.name)} DROP COLUMN ${quoteId(name)}`);\n }\n }\n return stmts;\n}\n\n/** Render an ALTER COLUMN (PostgreSQL); SQLite needs batch mode (Phase 6e). */\nfunction renderAlterColumn(table: string, to: ColumnIR, dialect: Dialect): string[] {\n if (dialect === \"sqlite\") {\n throw new Error(\n `alter_column on SQLite needs batch/table-rebuild (Phase 6e); column ${table}.${to.name}`,\n );\n }\n const t = quoteId(table);\n const c = quoteId(to.name);\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 { ColumnIR, SchemaIR } 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 });\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 }\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: 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: 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 { SyncDriver } from \"../engine.js\";\nimport type { Dialect } from \"../url.js\";\nimport { renderOperation } from \"./ddl.js\";\nimport { topoOrder } from \"./graph.js\";\nimport type { ColumnIR, 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 /** 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 * 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 { type ColumnIR, type SchemaIR, type TableIR, reflectSchema } 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\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 };\n if (isPk) primaryKey.push(col.name);\n }\n tables[tableName] = { name: tableName, columns, primaryKey };\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 */\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\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 };\n if (isPk) primaryKey.push(name);\n }\n tables[tableName] = { name: tableName, columns, primaryKey };\n }\n return { tables };\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 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: 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 \"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 { 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\nfunction ok(lines: string[]): CliResult {\n return { code: 0, lines };\n}\nfunction fail(lines: string[]): CliResult {\n return { code: 1, lines };\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 const ops = rest.includes(\"--autogenerate\")\n ? diffSchema(replaySchema(config.migrations), reflectSchema(config.models))\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"]}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "tempest-db-js",
3
+ "version": "0.1.0",
4
+ "description": "Type-safe, class-based ORM for TypeScript — SQLAlchemy 2.0 ergonomics for the JS/TS world.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Mauricio Benjamin",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/mauriciobenjamin700/tempest-db-js.git"
11
+ },
12
+ "homepage": "https://mauriciobenjamin700.github.io/tempest-db-js/",
13
+ "bugs": "https://github.com/mauriciobenjamin700/tempest-db-js/issues",
14
+ "keywords": [
15
+ "orm",
16
+ "typescript",
17
+ "sql",
18
+ "query-builder",
19
+ "sqlite",
20
+ "postgresql",
21
+ "type-safe",
22
+ "sqlalchemy"
23
+ ],
24
+ "main": "./dist/index.cjs",
25
+ "module": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.js",
31
+ "require": "./dist/index.cjs"
32
+ },
33
+ "./migrations": {
34
+ "types": "./dist/migrations/index.d.ts",
35
+ "import": "./dist/migrations/index.js",
36
+ "require": "./dist/migrations/index.cjs"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist"
41
+ ],
42
+ "engines": {
43
+ "node": ">=20"
44
+ },
45
+ "scripts": {
46
+ "build": "tsup",
47
+ "prepublishOnly": "tsup",
48
+ "dev": "tsup --watch",
49
+ "test": "vitest run",
50
+ "test:watch": "vitest",
51
+ "test:types": "tsc --noEmit",
52
+ "lint": "biome check .",
53
+ "format": "biome format --write ."
54
+ },
55
+ "devDependencies": {
56
+ "@biomejs/biome": "^1.9.0",
57
+ "@types/node": "^26.0.1",
58
+ "tsup": "^8.3.0",
59
+ "typescript": "^5.9.3",
60
+ "vitest": "^2.1.9"
61
+ },
62
+ "peerDependencies": {
63
+ "better-sqlite3": "*",
64
+ "postgres": "*"
65
+ },
66
+ "peerDependenciesMeta": {
67
+ "better-sqlite3": {
68
+ "optional": true
69
+ },
70
+ "postgres": {
71
+ "optional": true
72
+ }
73
+ }
74
+ }