mirror of
https://github.com/anomalyco/opencode.git
synced 2026-09-29 05:53:24 +08:00
57 lines
2.1 KiB
TypeScript
57 lines
2.1 KiB
TypeScript
#!/usr/bin/env bun
|
|
// Renders the drizzle-kit output under src/main/storage/migration into migration.gen.ts so the
|
|
// main bundle and Bun tests import plain TypeScript instead of reading SQL files at runtime.
|
|
//
|
|
// bun run migration --name <change> generate a migration from schema.ts, then render
|
|
// bun run migration render only
|
|
// bun run migration --check fail when the rendered registry is stale
|
|
|
|
import { $ } from "bun"
|
|
import path from "node:path"
|
|
import { parseArgs } from "node:util"
|
|
|
|
const root = path.resolve(import.meta.dirname, "..")
|
|
const directory = path.join(root, "src/main/storage/migration")
|
|
const output = path.join(root, "src/main/storage/migration.gen.ts")
|
|
const args = parseArgs({
|
|
args: process.argv.slice(2),
|
|
options: {
|
|
check: { type: "boolean" },
|
|
name: { type: "string" },
|
|
},
|
|
})
|
|
|
|
if (args.values.name) await $`bun drizzle-kit generate --name ${args.values.name}`.cwd(root)
|
|
|
|
const rendered = await render()
|
|
if (!args.values.check) {
|
|
await Bun.write(output, rendered)
|
|
process.exit(0)
|
|
}
|
|
if ((await Bun.file(output).text()) !== rendered) {
|
|
throw new Error("Desktop storage migrations are stale. Run `bun run migration` from packages/desktop.")
|
|
}
|
|
|
|
async function render() {
|
|
const ids = (await Array.fromAsync(new Bun.Glob("*/migration.sql").scan({ cwd: directory })))
|
|
.map((file) => path.dirname(file))
|
|
.sort()
|
|
const migrations = await Promise.all(
|
|
ids.map(async (id) => ({
|
|
id,
|
|
// Normalize so a CRLF checkout renders the same registry as an LF one.
|
|
statements: (await Bun.file(path.join(directory, id, "migration.sql")).text())
|
|
.replaceAll("\r\n", "\n")
|
|
.split("--> statement-breakpoint")
|
|
.map((statement) => statement.trim())
|
|
.filter((statement) => statement.length > 0),
|
|
})),
|
|
)
|
|
const source = `// Generated by scripts/migration.ts from src/main/storage/migration. Do not edit.
|
|
|
|
export const migrations = ${JSON.stringify(migrations, null, 2)}
|
|
`
|
|
const prettier = await import("prettier")
|
|
return prettier.format(source, { parser: "typescript", semi: false, printWidth: 120 })
|
|
}
|