@npio/internals
Version:
A free visual website editor, powered with your own SolidJS components.
48 lines (40 loc) • 1.54 kB
text/typescript
import { PrismaClient } from "@prisma/client";
import { isAbsolute, join } from "node:path";
import { createGlobal } from "./util";
// Prismas default DATABASE_URL resolution doesnt work nicely with nitro build
// This makes sure that relative urls are resolved to their proper absolute path (based on cwd)
// https://github.com/nuxt/nuxt/issues/22738
// https://github.com/prisma/prisma/issues/2559
const resolveRelativeDatasourceUrl = function (url?: string) {
const FILE_INDICATOR = "file:";
if (!url?.startsWith(FILE_INDICATOR)) {
return url;
}
const rawUrl = url.replace(FILE_INDICATOR, "");
if (isAbsolute(rawUrl)) {
return rawUrl;
}
const newUrl =
FILE_INDICATOR + join(process.cwd(), "prisma", "schema", rawUrl);
return newUrl;
};
const createClient = () => {
const prisma = new PrismaClient({
// Inspired by: https://github.com/t3-oss/create-t3-app/blob/1e4c2d352e9b42e0f48c98980714c5334bfd06d7/cli/template/extras/src/server/db.ts#L12
log: import.meta.env?.DEV ? ["query", "error", "warn"] : ["error"],
datasourceUrl: resolveRelativeDatasourceUrl(process.env["DATABASE_URL"]),
});
return prisma;
};
export const [useDatabase, setDatabase] =
createGlobal<ReturnType<typeof createClient>>("npDatabase");
const initDatabase = () => setDatabase(createClient);
export default initDatabase;
export const connectOrDisconnect = (
id?: string | null,
connectOnly = false,
) => {
if (id) return { connect: { id } };
if (connectOnly) return;
return { disconnect: true };
};