Spaces:
Sleeping
Sleeping
| 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<typeof schema> }; | |
| 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; | |