SEC-cyBERT/labelapp/scripts/ensure-migration-baseline.ts
2026-03-29 16:37:51 -04:00

63 lines
1.9 KiB
TypeScript

/**
* Ensures the baseline migration is marked as applied for databases
* that were created with `drizzle-kit push` before we switched to
* file-based migrations. Safe to run on fresh databases (no-op).
*/
import postgres from "postgres";
import { readFileSync } from "fs";
import { createHash } from "crypto";
import { resolve } from "path";
const sql = postgres(process.env.DATABASE_URL!);
try {
// Check if any application tables exist (indicator of a push-created DB)
const [{ exists: tablesExist }] = await sql`
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = 'public' AND table_name = 'paragraphs'
) as exists
`;
if (!tablesExist) {
console.log("Fresh database — baseline seeding not needed.");
await sql.end();
process.exit(0);
}
// Ensure the drizzle schema + migrations table exist
await sql`CREATE SCHEMA IF NOT EXISTS drizzle`;
await sql`
CREATE TABLE IF NOT EXISTS drizzle.__drizzle_migrations (
id serial PRIMARY KEY,
hash text NOT NULL,
created_at bigint
)
`;
// Check if any migrations are already recorded
const [{ count }] = await sql`
SELECT count(*)::int as count FROM drizzle.__drizzle_migrations
`;
if (Number(count) > 0) {
console.log("Migration history already exists — baseline seeding not needed.");
await sql.end();
process.exit(0);
}
// Compute hash of the baseline migration and insert it
const baselinePath = resolve(import.meta.dirname!, "../drizzle/0000_baseline.sql");
const content = readFileSync(baselinePath, "utf-8");
const hash = createHash("sha256").update(content).digest("hex");
await sql`
INSERT INTO drizzle.__drizzle_migrations (hash, created_at)
VALUES (${hash}, ${Date.now()})
`;
console.log("Baseline migration marked as applied (push → migrate transition).");
} finally {
await sql.end();
}