import { adapterEnv, identityShimEnabled } from "../src/config/env"; import { exitOnInvalidMigrationConfig } from "../src/config/fail-fast"; import { assertManifestMatches, listMigrationFiles, migrate, pendingMigrations, readMigrationLedger, } from "../src/infra/db/migrate"; import { bootstrapScript, describeTarget, runScript, runWithDb } from "./_bootstrap"; /** * Três modos, separados de propósito: * - `--plan` lista o manifesto no disco e não abre banco. * - `--dry-run` lê `schema_migrations` e não aplica SQL. * - sem flag, aplica o lote pendente numa transação. */ const plan = process.argv.includes("--plan"); const dryRun = process.argv.includes("--dry-run"); if (plan) { runScript("migrate", async () => { const files = await listMigrationFiles(); assertManifestMatches(files); console.log(`plano estatico offline: ${files.join(", ")}`); }); } else { if (adapterEnv() === "staging") exitOnInvalidMigrationConfig(process.env); else if (adapterEnv() === "production") { console.error( "[adaptador-planilhas] Configuração administrativa recusada. ADAPTER_ENV: migrate administrativo de homologação exige staging", ); process.exit(1); } else bootstrapScript("migrate"); runWithDb("migrate", "admin", async (db) => { const ledger = await readMigrationLedger(db); const pending = await pendingMigrations(db); console.log(`alvo: ${adapterEnv() === "staging" ? "postgres administrativo" : describeTarget()}`); console.log(`shim de identidade: ${identityShimEnabled() ? "SERÁ aplicado" : "NÃO será aplicado"}`); if (ledger.state === "ausente") console.log("historico: ausente; schema_migrations nao foi criada"); if (pending.length === 0) { console.log("migrations: nada pendente"); return; } if (dryRun) { console.log(`migrations pendentes (dry-run, nada aplicado): ${pending.join(", ")}`); return; } const ran = await migrate(db); console.log(ran.length ? `migrations aplicadas: ${ran.join(", ")}` : "migrations: nada pendente"); }); }