import {type PartialWithUndefined} from '@augment-vir/common'; import {mkdir, rm} from 'node:fs/promises'; import {join} from 'node:path'; import { getDefaultDbParentDirPath, getDefaultMigrationsDirPath, getDefaultPrismaConfigPath, } from '../util/default-paths.js'; import {resolvePrismaConfigPaths} from '../util/prisma-config.js'; import { applyMigrationsOrPushSchema, readMigrationList, readSchemaContainers, } from './schema-engine.js'; /** * Parameters for {@link resetPgliteDatabase}. * * @category Internal */ export type ResetPgliteDatabaseParams = PartialWithUndefined<{ /** * Path to the PGlite database directory. * * @default * - join('', '.not-committed', 'pglite', 'dev') * - join(process.cwd(), '.not-committed', 'pglite', 'dev') */ pgliteDatabaseDirPath: string; /** * Path to a Prisma config file (`prisma.config.ts`). Prisma v7 reads the schema location, * datasource, and (if set) the `migrations.path` from this config. The migrations directory is * derived from it: the config's `migrations.path` if set, otherwise the `migrations` folder * next to the schema. * * @default join(process.cwd(), 'prisma.config.ts') */ prismaConfigPath: string; }>; /** * Reset a dev database to your Prisma schema with a PGlite database. This is analogous to running * `prisma migrate reset` with a plain Postgres database. Existing migrations are applied through * the Prisma schema engine; if there are no migrations, the schema is pushed directly (like `prisma * db push`). * * @category CLI */ export async function resetPgliteDatabase(rawParams: Readonly = {}) { const prismaConfigPath = rawParams.prismaConfigPath || getDefaultPrismaConfigPath(); const pgliteDatabaseDirPath = rawParams.pgliteDatabaseDirPath || join(getDefaultDbParentDirPath(), 'dev'); const {schemaPath, migrationsDirPath: configMigrationsDirPath} = await resolvePrismaConfigPaths(prismaConfigPath); const migrationsDirPath = configMigrationsDirPath || getDefaultMigrationsDirPath(schemaPath); const [ schemaContainers, migrations, ] = await Promise.all([ readSchemaContainers(schemaPath), readMigrationList(migrationsDirPath), ]); /* node:coverage ignore next 1: dynamic imports are not a branch */ const {PGlite} = await import('@electric-sql/pglite'); await rm(pgliteDatabaseDirPath, { force: true, recursive: true, }); await mkdir(pgliteDatabaseDirPath, { recursive: true, }); const pglite = new PGlite(pgliteDatabaseDirPath); await pglite.waitReady; await applyMigrationsOrPushSchema({ pglite, migrations, schemaContainers, }); /** * PGlite's WASM PostgreSQL startup sets process.exitCode as a side effect. Reset it after all * PGlite operations complete so it doesn't cause Node.js test runner failures. */ process.exitCode = undefined; return pglite; }