import path from 'node:path'; import * as schema from '@/models/Schema'; import { PGlite } from '@electric-sql/pglite'; import { drizzle as drizzlePg } from 'drizzle-orm/node-postgres'; import { migrate as migratePg } from 'drizzle-orm/node-postgres/migrator'; import { drizzle as drizzlePglite, type PgliteDatabase } from 'drizzle-orm/pglite'; import { migrate as migratePglite } from 'drizzle-orm/pglite/migrator'; import { PHASE_PRODUCTION_BUILD } from 'next/dist/shared/lib/constants'; import { Client } from 'pg'; import { Env } from './Env'; let client; let drizzle; if (process.env.NEXT_PHASE !== PHASE_PRODUCTION_BUILD && Env.DATABASE_URL) { client = new Client({ connectionString: Env.DATABASE_URL, }); await client.connect(); drizzle = drizzlePg(client, { schema }); await migratePg(drizzle, { migrationsFolder: path.join(process.cwd(), 'migrations'), }); } else { // Stores the db connection in the global scope to prevent multiple instances due to hot reloading with Next.js const global = globalThis as unknown as { client: PGlite; drizzle: PgliteDatabase }; if (!global.client) { global.client = new PGlite(); await global.client.waitReady; global.drizzle = drizzlePglite(global.client, { schema }); } drizzle = global.drizzle; await migratePglite(global.drizzle, { migrationsFolder: path.join(process.cwd(), 'migrations'), }); } export const db = drizzle;