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.
- Native Prisma Integration: Runs as part of
prisma generate- no separate CLI needed - Type-Safe Code Generation: Generate GraphQL schemas, resolvers, and TypeScript types
- Admin UI Ready: Automatic admin schema generation for the PalJS Admin UI
- Query Optimization: PrismaSelect plugin for efficient field selection
- Enterprise Ready: Built with type safety, security, and scalability in mind
# 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 generateThis generates:
generated/paljs/dmmf/- DMMF data for runtime usegenerated/paljs/types/- TypeScript types for PrismaSelectgenerated/paljs/nexus/- Nexus GraphQL types, queries, and mutationsgenerated/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 generateAfter (v9):
npm install -D @paljs/generator
npx prisma generateThe new approach:
- Runs automatically with
prisma generate - No separate CLI installation needed
- Configuration via
paljs.config.tsinstead ofpal.config.js - Same output, better integration
PalJS v9 is a ground-up rewrite with major improvements.
- Native Prisma 7 Generator — Runs as part of
prisma generate, no separate CLI - Typed PrismaSelect — Generated
ModelsObjecttype eliminatesanycasts - React 19 Admin UI — Rebuilt with Tailwind CSS 4 and modern React patterns
defineConfig()API — Type-safe configuration withpaljs.config.ts- Unified Output — All generated code in one directory (
dmmf/,types/,nexus/,admin/)
@paljs/cli— Replaced by the native Prisma generator@paljs/create— Usecreate-next-appand add PalJS packages manually@paljs/display— No longer needed- SDL and GraphQL Modules generators — Nexus code-first only
# Install the generator
npm install -D @paljs/generator prisma
# Install runtime packages
npm install @paljs/plugins @paljs/nexus @paljs/admin- Add the generator to your Prisma schema:
generator paljs {
provider = "paljs-generator"
output = "../generated/paljs"
}- Create
paljs.config.tsnext 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'],
});- Run generation:
npx prisma generateSee the full Migration Guide for upgrading from v8.
- Discord - Join our community for help and discussions
- GitHub Issues - Report bugs and request features
- Discussions - Ask questions and share ideas
This project is licensed under the MIT License - see the LICENSE file for details.
Built with love by the PalJS team
