import { readdirSync, readFileSync } from "node:fs"; import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; import { getSql, closeDb } from "./index.js"; /** Plain-SQL migrations in ./migrations, applied in lexical order, tracked in _dci_migrations. Idempotent. */ async function main() { const sql = getSql(); const dir = join(dirname(fileURLToPath(import.meta.url)), "..", "migrations"); await sql`create table if not exists _dci_migrations (name text primary key, applied_at timestamptz not null default now())`; const done = new Set((await sql`select name from _dci_migrations`).map((r) => r.name as string)); const files = readdirSync(dir).filter((f) => f.endsWith(".sql")).sort(); for (const f of files) { if (done.has(f)) continue; const body = readFileSync(join(dir, f), "utf8"); process.stdout.write(`applying ${f} … `); await sql.begin(async (tx) => { await tx.unsafe(body); await tx`insert into _dci_migrations (name) values (${f})`; }); console.log("ok"); } console.log(`migrations: ${files.length} total, ${files.length - done.size} applied now`); await closeDb(); } main().catch((e) => { console.error(e); process.exit(1); });