59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
import { mkdirSync } from 'node:fs';
|
|
import { dirname } from 'node:path';
|
|
import { Database } from 'bun:sqlite';
|
|
import { drizzle } from 'drizzle-orm/bun-sqlite';
|
|
import { schema } from './schema';
|
|
|
|
type AppDrizzleDb = ReturnType<typeof createDb>;
|
|
|
|
declare global {
|
|
// eslint-disable-next-line no-var
|
|
var __fiscalSqliteClient: Database | undefined;
|
|
// eslint-disable-next-line no-var
|
|
var __fiscalDrizzleDb: AppDrizzleDb | undefined;
|
|
}
|
|
|
|
function getDatabasePath() {
|
|
const raw = process.env.DATABASE_URL?.trim() || 'file:data/fiscal.sqlite';
|
|
let databasePath = raw.startsWith('file:') ? raw.slice(5) : raw;
|
|
|
|
if (databasePath.startsWith('///')) {
|
|
databasePath = databasePath.slice(2);
|
|
}
|
|
|
|
if (!databasePath) {
|
|
throw new Error('DATABASE_URL must point to a SQLite file path.');
|
|
}
|
|
|
|
return databasePath;
|
|
}
|
|
|
|
export function getSqliteClient() {
|
|
if (!globalThis.__fiscalSqliteClient) {
|
|
const databasePath = getDatabasePath();
|
|
|
|
if (databasePath !== ':memory:') {
|
|
mkdirSync(dirname(databasePath), { recursive: true });
|
|
}
|
|
|
|
const client = new Database(databasePath, { create: true });
|
|
client.exec('PRAGMA foreign_keys = ON;');
|
|
client.exec('PRAGMA journal_mode = WAL;');
|
|
client.exec('PRAGMA busy_timeout = 5000;');
|
|
|
|
globalThis.__fiscalSqliteClient = client;
|
|
}
|
|
|
|
return globalThis.__fiscalSqliteClient;
|
|
}
|
|
|
|
function createDb() {
|
|
return drizzle(getSqliteClient(), { schema });
|
|
}
|
|
|
|
export const db = globalThis.__fiscalDrizzleDb ?? createDb();
|
|
|
|
if (!globalThis.__fiscalDrizzleDb) {
|
|
globalThis.__fiscalDrizzleDb = db;
|
|
}
|