
A comprehensive toolkit for building modern GraphQL APIs with Prisma
<a href="https://www.npmjs.com/org/paljs"><img src="https://img.shields.io/npm/v/@paljs/generator?label=stable&style=flat-square" alt="Stable Version" /></a>
<a href="https://www.npmjs.com/package/@paljs/generator/v/beta"><img src="https://img.shields.io/npm/v/@paljs/generator/beta?label=beta&style=flat-square&color=orange" alt="Beta Version" /></a>
<a href="https://github.com/paljs/prisma-tools/blob/main/LICENSE"><img src="https://img.shields.io/github/license/paljs/prisma-tools?style=flat-square" alt="License" /></a>
<a href="https://github.com/paljs/prisma-tools/stargazers"><img src="https://img.shields.io/github/stars/paljs/prisma-tools?style=flat-square" alt="Stars" /></a>
<a href="https://discord.gg/X7yWXrM"><img src="https://img.shields.io/discord/768907308789235752?style=flat-square&logo=discord" alt="Discord" /></a>
v9 Released! PalJS v9 is a major rewrite featuring a native Prisma 7 generator, React 19 admin UI with Tailwind CSS 4, and typed PrismaSelect. What's New | Migration Guide
PalJS is a powerful toolkit that accelerates GraphQL API development with Prisma. Starting with v9, PalJS integrates directly with Prisma 7+ as a native generator, providing code generation, admin interfaces, and query optimization that runs automatically during prisma generate.
prisma generate - no separate CLI needed# Install the generator (dev dependency)
npm install -D @paljs/generator prisma
# Install runtime dependencies
npm install @paljs/plugins @paljs/nexus
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
generator paljs {
provider = "paljs-generator"
output = "../generated/paljs"
config = "../paljs.config.ts"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
password String
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
// paljs.config.ts
import { defineConfig } from '@paljs/generator';
export default defineConfig({
// Generate TypeScript types for PrismaSelect
generateTypes: true,
// Generate Nexus GraphQL types
generateGraphQL: true,
// Generate Admin UI schema and pages
generateAdmin: {
enabled: true,
output: './admin',
routerType: 'app', // 'app' for Next.js App Router, 'pages' for Pages Router
},
// Global field exclusions (e.g., sensitive fields)
excludeFields: ['password'],
// Per-model configuration
models: {
User: {
// Exclude specific mutations
excludeQueriesAndMutations: ['deleteMany'],
},
},
});
npx prisma generate
This generates:
- generated/paljs/dmmf/ - DMMF data for runtime use
- generated/paljs/types/ - TypeScript types for PrismaSelect
- generated/paljs/nexus/ - Nexus GraphQL types, queries, and mutations
- generated/paljs/admin/ - Admin UI schema and pages
// src/graphql/schema.ts
import { makeSchema } from 'nexus';
import * as types from '../generated/paljs/nexus';
export const schema = makeSchema({
types,
outputs: {
typegen: './generated/nexus-typegen.ts',
schema: './generated/schema.graphql',
},
});
import { PrismaSelect } from '@paljs/plugins';
import { dmmf, type ModelsObject } from '../generated/paljs';
// In your resolver
const select = new PrismaSelect<'User', ModelsObject>(info, {
dmmf: [dmmf],
defaultFields: {
User: { id: true, email: true },
},
excludeFields: {
User: ['password'],
},
});
const users = await prisma.user.findMany(select.value);
| @paljs/generator | Prisma 7+ native generator for GraphQL schemas, types, and admin UI |
| @paljs/plugins | PrismaSelect and other GraphQL plugins for query optimization |
| @paljs/nexus | Nexus plugin for Prisma integration with automatic field selection |
| @paljs/admin | React admin UI components with Tailwind CSS |
// paljs.config.ts
import { defineConfig } from '@paljs/generator';
export default defineConfig({
// === Type Generation ===
generateTypes: true, // Generate TypeScript types for PrismaSelect
// === GraphQL Generation ===
generateGraphQL: true, // Generate Nexus GraphQL types
nexusOutput: './nexus', // Output directory for Nexus files (relative to generator output)
// === Admin Generation ===
generateAdmin: {
enabled: true,
output: './admin', // Output directory
routerType: 'app', // 'app' | 'pages'
models: ['User', 'Post'], // Optional: limit to specific models
},
// === Global Options ===
prismaName: 'prisma', // Name of Prisma client in context
// Fields to exclude from all models
excludeFields: ['password', 'hash'],
// Fields to exclude from GraphQL inputs
excludeInputFields: ['createdAt', 'updatedAt'],
// Queries/mutations to exclude globally
excludeQueriesAndMutations: ['deleteMany', 'updateMany'],
// Disable all queries or mutations globally
disableQueries: false,
disableMutations: false,
// === Per-Model Configuration ===
models: {
User: {
// Exclude this model entirely from generation
exclude: false,
// Model-specific field exclusions
excludeFields: ['internalNotes'],
// Model-specific query/mutation exclusions
excludeQueriesAndMutations: ['deleteMany'],
// Disable queries or mutations for this model
disableQueries: false,
disableMutations: false,
// Admin-specific settings
admin: {
hide: false, // Hide from admin UI
displayField: 'email', // Field to display in relationships
listFields: ['id', 'email', 'name'], // Fields to show in list view
},
},
AuditLog: {
// Exclude model from GraphQL generation but keep in admin
exclude: true,
},
Tag: {
// Read-only model (no mutations)
disableMutations: true,
},
},
});
Before (v8):
npm install -g @paljs/cli
pal generate
After (v9):
npm install -D @paljs/generator
npx prisma generate
The new approach:
- Runs automatically with prisma generate
- No separate CLI installation needed
- Configuration via paljs.config.ts instead of pal.config.js
- Same output, better integration
PalJS v9 is a ground-up rewrite with major improvements.
prisma generate, no separate CLIModelsObject type eliminates any castsdefineConfig() API — Type-safe configuration with paljs.config.tsdmmf/, types/, nexus/, admin/)@paljs/cli — Replaced by the native Prisma generator@paljs/create — Use create-next-app and add PalJS packages manually@paljs/display — No longer needed# Install the generator
npm install -D @paljs/generator prisma
# Install runtime packages
npm install @paljs/plugins @paljs/nexus @paljs/admin
generator paljs {
provider = "paljs-generator"
output = "../generated/paljs"
}
paljs.config.ts next to your schema:import { defineConfig } from '@paljs/generator/config';
export default defineConfig({
generateGraphQL: true,
generateTypes: true,
generateAdmin: { enabled: true, output: './admin', routerType: 'app' },
excludeFields: ['password'],
});
npx prisma generate
See the full Migration Guide for upgrading from v8.
This project is licensed under the MIT License - see the LICENSE file for details.
Built with love by the PalJS team
<a href="https://github.com/paljs/prisma-tools">Star on GitHub</a> •
<a href="https://discord.gg/X7yWXrM">Join Discord</a>
$ claude mcp add prisma-tools \
-- python -m otcore.mcp_server <graph>