import { fumadb, type FumaDB } from "fumadb"; import { createDrizzleRuntimeSchemaFromTables, createDrizzleRuntimeSchemaSqlFromTables, drizzleAdapter, } from "fumadb/adapters/drizzle"; import { schema as fumaSchema, type RelationsMap } from "fumadb/schema"; import { createRequire } from "node:module"; import type { FumaDb, FumaTables } from "@executor-js/sdk/core"; const require = createRequire(import.meta.url); type SqliteFumaSchema = ReturnType< typeof fumaSchema> >; export interface SqliteFumaDb { readonly db: FumaDb>; readonly fuma: FumaDB[]>; readonly drizzle: unknown; readonly sqlite: { readonly close: () => void; }; readonly close: () => Promise; } export interface CreateSqliteFumaDbOptions { readonly tables: TTables; readonly namespace: string; readonly version?: string; readonly path: string; } const openSqlite = async ( path: string, schema: Record, ): Promise<{ readonly sqlite: { readonly exec: (statement: string) => unknown; readonly close: () => void }; readonly drizzleDb: unknown; }> => { const Database = require("better-sqlite3") as typeof import("better-sqlite3"); const { drizzle } = require("drizzle-orm/better-sqlite3") as typeof import("drizzle-orm/better-sqlite3"); const sqlite = new Database(path); sqlite.pragma("foreign_keys = ON"); sqlite.pragma("journal_mode = WAL"); return { sqlite, drizzleDb: drizzle(sqlite, { schema }), }; }; export const createSqliteFumaDb = async ( options: CreateSqliteFumaDbOptions, ): Promise> => { const version = options.version ?? "1.0.0"; const schema = createDrizzleRuntimeSchemaFromTables({ tables: options.tables, namespace: options.namespace, version, provider: "sqlite", }); const { sqlite, drizzleDb } = await openSqlite(options.path, schema); for (const statement of createDrizzleRuntimeSchemaSqlFromTables({ tables: options.tables, namespace: options.namespace, version, provider: "sqlite", })) { sqlite.exec(statement); } const latestSchema = fumaSchema({ version, tables: options.tables, }); const factory = fumadb({ namespace: options.namespace, schemas: [latestSchema], }); const fuma = factory.client( drizzleAdapter({ db: drizzleDb, provider: "sqlite", }), ); return { db: fuma.orm(version), fuma, drizzle: drizzleDb, sqlite, close: async () => { sqlite.close(); }, }; };