/** * Test-only helpers for creating a PGlite database with the pgvector extension * and running Drizzle migrations against it. * * These are intentionally NOT exported from @mosaicstack/db to avoid pulling * the WASM vector bundle into the public API surface. */ import { createRequire } from 'node:module'; import { dirname, resolve } from 'node:path'; import { PGlite } from '@electric-sql/pglite'; import { vector } from '@electric-sql/pglite/vector'; import { drizzle } from 'drizzle-orm/pglite'; import { migrate as migratePglite } from 'drizzle-orm/pglite/migrator'; import type { PgliteDatabase } from 'drizzle-orm/pglite'; import * as schema from '@mosaicstack/db'; import type { DbHandle } from '@mosaicstack/db'; /** * Create a PGlite DB handle with the pgvector extension loaded. * Required for running Drizzle migrations that include `CREATE EXTENSION vector`. */ export function createPgliteDbWithVector(dataDir: string): DbHandle { const client = new PGlite(dataDir, { extensions: { vector } }); const db = drizzle(client, { schema }); return { db: db as unknown as DbHandle['db'], close: async () => { await client.close(); }, }; } /** * Run Drizzle migrations against an already-open PGlite database handle. * Resolves the migrations folder from @mosaicstack/db's installed location. * * @param db A PgliteDatabase instance (from drizzle-orm/pglite). */ export async function runPgliteMigrations( // eslint-disable-next-line @typescript-eslint/no-explicit-any db: PgliteDatabase, ): Promise { // Resolve @mosaicstack/db package root to locate its drizzle migrations folder. const _require = createRequire(import.meta.url); const dbPkgMain = _require.resolve('@mosaicstack/db'); // dbPkgMain → …/packages/db/dist/index.js → dirname = dist/ // go up one level from dist/ to find the sibling drizzle/ folder const migrationsFolder = resolve(dirname(dbPkgMain), '../drizzle'); await migratePglite(db, { migrationsFolder }); }