fix: lazy-load Prisma client to fix build-time URL parsing

- Make Prisma client initialization lazy via Proxy
- Defer database-pool import until runtime
- Add guard for empty DATABASE_URL
- Build now succeeds with Next.js 16.1.4
This commit is contained in:
2026-01-20 07:34:30 +01:00
parent 5bfd762e55
commit 7932fe7386
6 changed files with 91 additions and 177 deletions

View File

@@ -1,14 +1,12 @@
// Enhanced Prisma client setup with connection pooling
import { PrismaClient } from "@prisma/client";
import { createEnhancedPrismaClient } from "./database-pool";
import { env } from "./env";
// Add prisma to the NodeJS global type
declare const global: {
prisma: PrismaClient | undefined;
};
// Connection pooling configuration
// Lazy-load createEnhancedPrismaClient to avoid build-time URL parsing
const createPrismaClient = () => {
// Use enhanced pooling in production or when explicitly enabled
const useEnhancedPooling =
@@ -17,6 +15,8 @@ const createPrismaClient = () => {
if (useEnhancedPooling) {
console.log("Using enhanced database connection pooling with PG adapter");
// Dynamic import to defer URL parsing until runtime
const { createEnhancedPrismaClient } = require("./database-pool");
return createEnhancedPrismaClient();
}
@@ -26,21 +26,29 @@ const createPrismaClient = () => {
process.env.NODE_ENV === "development"
? ["query", "error", "warn"]
: ["error"],
datasources: {
db: {
url: env.DATABASE_URL,
},
},
});
};
// Initialize Prisma Client with singleton pattern
const prisma = global.prisma || createPrismaClient();
// Lazy initialization - only create when first accessed
let _prisma: PrismaClient | undefined;
// Save in global if we're in development to prevent multiple instances
if (process.env.NODE_ENV !== "production") {
global.prisma = prisma;
}
const getPrisma = (): PrismaClient => {
if (!_prisma) {
_prisma = global.prisma || createPrismaClient();
// Save in global if we're in development to prevent multiple instances
if (process.env.NODE_ENV !== "production") {
global.prisma = _prisma;
}
}
return _prisma!;
};
// Export a proxy that lazily initializes the client
export const prisma = new Proxy({} as PrismaClient, {
get(_target, prop) {
return getPrisma()[prop as keyof PrismaClient];
},
});
// Graceful shutdown handling
const gracefulShutdown = async () => {
@@ -63,5 +71,3 @@ export const checkDatabaseConnection = async (): Promise<boolean> => {
return false;
}
};
export { prisma };