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; | |