75 lines
1.9 KiB
TypeScript
75 lines
1.9 KiB
TypeScript
import { existsSync } from "node:fs";
|
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
import { join } from "node:path";
|
|
import { spawnSync } from "node:child_process";
|
|
|
|
const toSlug = (raw: string): string =>
|
|
raw
|
|
.toLowerCase()
|
|
.replace(/[^a-z0-9]+/g, "_")
|
|
.replace(/^_+|_+$/g, "");
|
|
|
|
const formatYyyymmdd = (date = new Date()): string => {
|
|
const year = date.getFullYear();
|
|
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
const day = String(date.getDate()).padStart(2, "0");
|
|
return `${year}${month}${day}`;
|
|
};
|
|
|
|
const sourceFor = (id: string): string => `package fixes
|
|
|
|
import (
|
|
\t"context"
|
|
\t"database/sql"
|
|
\t"fmt"
|
|
)
|
|
|
|
func init() {
|
|
\tRegister(Fix{
|
|
\t\tID: "${id}",
|
|
\t\tApply: func(ctx context.Context, sqlDB *sql.DB) error {
|
|
\t\t\t// TODO: implement fix
|
|
\t\t\t// _, err := sqlDB.ExecContext(ctx, \`UPDATE ...\`)
|
|
\t\t\t// if err != nil { return fmt.Errorf("...: %w", err) }
|
|
\t\t\treturn fmt.Errorf("unimplemented data fix: ${id}")
|
|
\t\t},
|
|
\t})
|
|
}
|
|
`;
|
|
|
|
const main = async (): Promise<void> => {
|
|
const rawName = process.argv[2] ?? "";
|
|
|
|
if (rawName === "--help" || rawName === "-h") {
|
|
console.log("usage: bun run ./scripts/new-data-fix.ts <name>");
|
|
return;
|
|
}
|
|
|
|
const slug = toSlug(rawName);
|
|
|
|
if (!slug) {
|
|
console.error("usage: bun run ./scripts/new-data-fix.ts <name>");
|
|
process.exit(1);
|
|
}
|
|
|
|
const id = `${formatYyyymmdd()}_${slug}`;
|
|
const dir = join(process.cwd(), "internal", "database", "fixes");
|
|
const filePath = join(dir, `${id}.go`);
|
|
|
|
if (existsSync(filePath)) {
|
|
console.error(`data fix already exists: ${filePath}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
await mkdir(dir, { recursive: true });
|
|
await writeFile(filePath, sourceFor(id));
|
|
spawnSync("gofmt", ["-w", filePath], { stdio: "ignore" });
|
|
|
|
console.log(filePath);
|
|
};
|
|
|
|
main().catch((error: unknown) => {
|
|
console.error(error instanceof Error ? error.message : String(error));
|
|
process.exitCode = 1;
|
|
});
|