feat(prisma version updated) - v2

This commit is contained in:
2025-12-03 00:29:53 +05:30
parent afc2017997
commit 8ac44cea29
6 changed files with 1531 additions and 143 deletions

View File

@@ -1,8 +1,152 @@
import { PrismaClient } from "../generated/prisma";
import dotenv from "dotenv";
dotenv.config();
const globalForPrisma = global as unknown as { prisma: PrismaClient };
type AnyFn = new (...a: any[]) => any;
let PrismaClientCtor: AnyFn | undefined;
// --- load generated or installed PrismaClient ctor ---
try {
// prefer the local generated client in the monorepo
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
const local = require("../generated/prisma");
PrismaClientCtor =
local.PrismaClient ||
local.default ||
(typeof local === "function" ? local : undefined);
} catch (e) {
try {
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
const installed = require("@prisma/client");
PrismaClientCtor =
installed.PrismaClient ||
installed.default ||
(typeof installed === "function" ? installed : undefined);
} catch (e2) {
throw new Error(
"Unable to load PrismaClient from local generated client or @prisma/client. Run `npm run db:generate` and ensure the generated client exists."
);
}
}
if (!PrismaClientCtor) {
throw new Error(
"PrismaClient constructor not found in loaded prisma package."
);
}
type PrismaClientType = InstanceType<typeof PrismaClientCtor>;
const globalForPrisma = global as unknown as { prisma?: PrismaClientType };
// --- robust adapter loader & diagnostics ---
function tryLoadPgAdapter() {
try {
// require the package
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
const mod = require("@prisma/adapter-pg");
// possible export names we've seen in docs / examples
const candidates = [
"PrismaPg",
"PrismaPgAdapter",
"PrismaPgAdapterDefault",
"default",
];
for (const name of candidates) {
const candidate = (mod &&
(mod[name] || (name === "default" && mod.default))) as any;
if (typeof candidate === "function") {
return { ctor: candidate, usedExport: name, module: mod };
}
}
// if module itself is a ctor (commonjs default export)
if (typeof mod === "function") {
return { ctor: mod, usedExport: "moduleAsCtor", module: mod };
}
// no usable export found
return { ctor: undefined, usedExport: undefined, module: mod };
} catch (err: any) {
return { error: err };
}
}
function createPgAdapterInstance(ctor: any) {
const dbUrl = process.env.DATABASE_URL;
// different adapter versions accept different option names; attempt common ones
const tryOptions = [
{ connectionString: dbUrl },
{ url: dbUrl },
{ connectionString: dbUrl || "" },
{ url: dbUrl || "" },
];
for (const opts of tryOptions) {
try {
const inst = new ctor(opts);
return { instance: inst, optsUsed: opts };
} catch (err) {
// ignore and try next shape
}
}
// final attempt: no args
try {
return { instance: new ctor(), optsUsed: null };
} catch (err) {
return { instance: undefined };
}
}
// Try to load adapter only for Postgres projects (your schema shows provider = "postgresql")
const adapterLoadResult = tryLoadPgAdapter();
if (adapterLoadResult.error) {
// adapter package couldn't be required at all
console.warn(
"[prisma-adapter] require('@prisma/adapter-pg') failed:",
adapterLoadResult.error.message || adapterLoadResult.error
);
}
let adapter: any | undefined;
if (adapterLoadResult.ctor) {
const { instance, optsUsed } = createPgAdapterInstance(
adapterLoadResult.ctor
);
adapter = instance;
// console.info("[prisma-adapter] Found adapter export:", adapterLoadResult.usedExport, "optsUsed:", optsUsed);
} else if (adapterLoadResult.module) {
console.warn(
"[prisma-adapter] module loaded but no ctor export found. Keys:",
Object.keys(adapterLoadResult.module)
);
}
// If adapter couldn't be constructed, fail loud — constructing PrismaClient without adapter on v7 causes obscure __internal errors.
if (!adapter) {
const missing = adapterLoadResult.error
? "package-not-installed"
: "no-export-or-constructor";
const msg = [
"Prisma adapter for Postgres could not be created.",
`reason=${missing}`,
"To fix: ensure you have @prisma/adapter-pg installed in the package where this code runs and that its peer 'pg' (node-postgres) is resolvable.",
"Examples:",
" npm install @prisma/adapter-pg pg",
"or in monorepo: npm --workspace packages/db install @prisma/adapter-pg pg",
"After installing, run: npm run db:generate and restart dev server.",
].join(" ");
// throw so we don't instantiate PrismaClient and get the __internal crash
throw new Error(msg);
}
// instantiate prisma with adapter
export const prisma =
globalForPrisma.prisma || new PrismaClient();
globalForPrisma.prisma || new PrismaClientCtor({ adapter });
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
if (process.env.NODE_ENV !== "production") {
globalForPrisma.prisma = prisma;
}