53 lines
2.0 KiB
TypeScript
53 lines
2.0 KiB
TypeScript
/**
|
|
* 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<any>,
|
|
): Promise<void> {
|
|
// 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 });
|
|
}
|