Prisma adapter
@paneljs/prisma answers two questions for PanelJS: what models exist, and how to read and write rows. The UI never talks to Prisma. Express never imports it.
import { prismaAdapter } from "@paneljs/prisma";
const admin = createAdmin({
adapter: prismaAdapter({ prisma, schemaPath: "prisma/schema.prisma" }),
auth: { getCurrentUser },
});Peer dependencies: prisma and @prisma/client 7.5.x. See Prisma versions.
Discovery
At mount, the adapter compiles schema.prisma with getDMMF() and maps models, fields, enums, and relations into PanelJS metadata.
Default path is prisma/schema.prisma relative to process.cwd(). Pass schemaPath if the file lives elsewhere. That file must ship in production.
Register names are Prisma model names, PascalCase, exact (User, not users).
CRUD
List, get, create, update, and delete go through Prisma delegates (prisma.user.findMany, …). Search is case-insensitive when the schema datasource provider is "postgresql".
Built-in auth
prismaAdapter supplies the auth store. Generate the tables:
npx paneljs auth:schema --identifier emailPaste the models into schema.prisma, migrate, then npx paneljs createsuperuser --config ./paneljs.config.mjs. Full walkthrough: Authentication.
Custom actions
The action handler receives client (your Prisma client) and where: { scope, ids }. where is not a Prisma where. Combine them, or use the helper:
import { prismaActionWhere } from "@paneljs/prisma";
handler: async ({ client, where }) => {
const result = await client.post.updateMany({
where: prismaActionWhere("id", where),
data: { published: true },
});
return { message: `Published ${result.count} posts.` };
};What this adapter does not do
- Nested
connect/create/setwrites - Composite primary keys (
@@id([a, b])) — skipped - Models with no
@id— skipped
Install: Express + Prisma.