costco-grocery-list/scripts/db-migrate-new.js
Nico 77ae5be445
All checks were successful
Build & Deploy Costco Grocery List / build (push) Successful in 1m10s
Build & Deploy Costco Grocery List / verify-images (push) Successful in 3s
Build & Deploy Costco Grocery List / deploy (push) Successful in 11s
Build & Deploy Costco Grocery List / notify (push) Successful in 1s
refactor
2026-02-22 01:27:03 -08:00

70 lines
1.6 KiB
JavaScript

"use strict";
const fs = require("fs");
const path = require("path");
const { migrationsDir } = require("./db-migrate-common");
function sanitizeName(input) {
return String(input || "")
.trim()
.toLowerCase()
.replace(/[^a-z0-9]+/g, "_")
.replace(/^_+|_+$/g, "");
}
function timestampUtc() {
const now = new Date();
const pad = (value) => String(value).padStart(2, "0");
return [
now.getUTCFullYear(),
pad(now.getUTCMonth() + 1),
pad(now.getUTCDate()),
"_",
pad(now.getUTCHours()),
pad(now.getUTCMinutes()),
pad(now.getUTCSeconds()),
].join("");
}
function main() {
const rawName = process.argv.slice(2).join(" ").trim();
if (!rawName || process.argv.includes("--help")) {
console.log("Usage: npm run db:migrate:new -- <migration-name>");
process.exit(rawName ? 0 : 1);
}
const name = sanitizeName(rawName);
if (!name) {
throw new Error("Migration name must contain letters or numbers.");
}
if (!fs.existsSync(migrationsDir)) {
throw new Error(`Migrations directory not found: ${migrationsDir}`);
}
const filename = `${timestampUtc()}_${name}.sql`;
const fullPath = path.join(migrationsDir, filename);
if (fs.existsSync(fullPath)) {
throw new Error(`Migration already exists: ${filename}`);
}
const template = [
"BEGIN;",
"",
"-- Add schema changes here.",
"",
"COMMIT;",
"",
].join("\n");
fs.writeFileSync(fullPath, template, "utf8");
console.log(`Created migration: ${path.relative(process.cwd(), fullPath)}`);
}
try {
main();
} catch (error) {
console.error(error.message);
process.exit(1);
}