import Database from "better-sqlite3"; import { drizzle, type BetterSQLite3Database } from "drizzle-orm/better-sqlite3"; import { mkdirSync } from "node:fs"; import { dirname } from "node:path"; import { fumadb, type FumaDB } from "fumadb"; import { createDrizzleRuntimeSchemaFromTables, createDrizzleRuntimeSchemaSqlFromTables, drizzleAdapter, } from "fumadb/adapters/drizzle"; import { schema as fumaSchema, type RelationsMap } from "fumadb/schema"; import type { FumaDb, FumaTables } from "./fuma-runtime"; type SqliteTestFumaSchema = ReturnType< typeof fumaSchema> >; export interface SqliteTestFumaDb { readonly db: FumaDb>; readonly fuma: FumaDB[]>; readonly drizzle: BetterSQLite3Database>; readonly sqlite: Database.Database; readonly close: () => Promise; } export interface CreateSqliteTestFumaDbOptions { readonly tables: TTables; readonly namespace?: string; readonly version?: string; readonly path?: string; } export const createSqliteTestFumaDb = async ( options: CreateSqliteTestFumaDbOptions, ): Promise> => { const version = options.version ?? "1.0.0"; const namespace = options.namespace ?? "executor_test"; if (options.path && options.path !== ":memory:") { mkdirSync(dirname(options.path), { recursive: true }); } const sqlite = new Database(options.path ?? ":memory:"); sqlite.pragma("foreign_keys = ON"); const schema = createDrizzleRuntimeSchemaFromTables({ tables: options.tables, namespace, version, provider: "sqlite", }); const drizzleDb = drizzle(sqlite, { schema }); for (const statement of createDrizzleRuntimeSchemaSqlFromTables({ tables: options.tables, namespace, version, provider: "sqlite", })) { sqlite.exec(statement); } const latestSchema = fumaSchema({ version, tables: options.tables, }); const factory = fumadb({ 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(); }, }; };