52 lines
1.8 KiB
TypeScript
52 lines
1.8 KiB
TypeScript
import { PrismaClient } from '@prisma/client'
|
||
|
||
// Singleton pattern для Prisma Client
|
||
// НАСТОЯЩАЯ lazy initialization - клиент создается только при первом обращении
|
||
const globalForPrisma = globalThis as unknown as {
|
||
prisma: PrismaClient | undefined
|
||
}
|
||
|
||
let prismaInstance: PrismaClient | undefined
|
||
|
||
export function getPrisma(): PrismaClient {
|
||
// Проверяем, находимся ли мы в процессе сборки
|
||
const isBuildTime = process.env.NEXT_PHASE === 'phase-production-build'
|
||
|
||
if (isBuildTime) {
|
||
// Во время сборки возвращаем mock объект, который не делает реальных запросов
|
||
console.log('⚠️ Build time detected, returning mock Prisma client')
|
||
return {
|
||
$connect: async () => {},
|
||
$disconnect: async () => {},
|
||
contactSubmission: {
|
||
create: async () => ({ id: 1, name: 'mock', phone: 'mock', email: null, serviceType: null, message: null, createdAt: new Date() }),
|
||
findMany: async () => [],
|
||
}
|
||
} as any
|
||
}
|
||
|
||
// Runtime: используем настоящий клиент
|
||
if (!prismaInstance) {
|
||
if (globalForPrisma.prisma) {
|
||
prismaInstance = globalForPrisma.prisma
|
||
} else {
|
||
prismaInstance = new PrismaClient({
|
||
log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],
|
||
})
|
||
|
||
if (process.env.NODE_ENV !== 'production') {
|
||
globalForPrisma.prisma = prismaInstance
|
||
}
|
||
}
|
||
}
|
||
|
||
return prismaInstance
|
||
}
|
||
|
||
// Для обратной совместимости экспортируем через Proxy
|
||
export const prisma = new Proxy({} as PrismaClient, {
|
||
get(target, prop) {
|
||
return (getPrisma() as any)[prop]
|
||
}
|
||
})
|