compassmock/.dev-setup/files/init-local-db.ts

52 lines
1.5 KiB
TypeScript

import initSqlJs from "sql.js"
import { readFileSync, readdirSync, writeFileSync, existsSync } from "fs"
import { join, dirname } from "path"
import { createRequire } from "module"
import { fileURLToPath } from "url"
const require = createRequire(import.meta.url)
const __dirname = dirname(fileURLToPath(import.meta.url))
const sqlJsWasm = require.resolve("sql.js/dist/sql-wasm.wasm")
const DB_PATH = process.env.LOCAL_DB_PATH || "local.db"
const MIGRATIONS_DIR = join(process.cwd(), "drizzle")
async function main() {
const sqlJs = await initSqlJs({
locateFile: (file: string) => {
if (file.endsWith(".wasm")) {
return sqlJsWasm
}
return file
},
})
let db: ReturnType<typeof sqlJs.Database>
if (existsSync(DB_PATH)) {
const buffer = readFileSync(DB_PATH)
db = new sqlJs.Database(buffer)
} else {
db = new sqlJs.Database()
}
const migrations = readdirSync(MIGRATIONS_DIR)
.filter((f) => f.endsWith(".sql") && !f.includes("seed"))
.sort()
console.log(`Running ${migrations.length} migrations on ${DB_PATH}...`)
for (const migration of migrations) {
const sql = readFileSync(join(MIGRATIONS_DIR, migration), "utf-8")
console.log(` ${migration}`)
db.run(sql)
}
const data = db.export()
const buffer = Buffer.from(data)
writeFileSync(DB_PATH, buffer)
console.log("Done!")
}
main().catch(console.error)