A powerful code generation package that creates GraphQL schemas, resolvers, and admin interfaces from Prisma schema definitions. Supports multiple GraphQL architectures including Nexus, SDL-first, and GraphQL Modules.
npm install @paljs/generator
# or
yarn add @paljs/generator
# or
pnpm add @paljs/generator
The main class that orchestrates code generation based on the specified generator type.
import { Generator } from '@paljs/generator';
const generator = new Generator(
{
name: 'nexus', // 'nexus' | 'sdl' | 'graphql-modules'
schemaPath: './prisma/schema.prisma',
},
{
output: './src/graphql',
excludeFields: ['password'],
// ... other options
},
);
await generator.run();
Constructor Parameters:
-
generator
- Configuration object with generator name and schema path -
options
- Optional generator options for customization
Methods:
-
run()
- Execute the code generation process
Generates Nexus GraphQL schema with type-safe resolvers and input types.
import { GenerateNexus } from '@paljs/generator';
const nexusGenerator = new GenerateNexus('./prisma/schema.prisma', {
output: './src/graphql',
prismaName: 'prisma',
excludeFields: ['password', 'hash'],
});
await nexusGenerator.run();
Generated Files:
-
types.ts
- Nexus object type definitions -
inputs.ts
- Input type definitions -
queries.ts
- Query field definitions -
mutations.ts
- Mutation field definitions -
index.ts
- Combined exports
Key Methods:
-
run()
- Generate all Nexus files -
createTypes()
- Generate object types -
createInputs()
- Generate input types -
createQueries()
- Generate query fields -
createMutations()
- Generate mutation fields
Generates Schema Definition Language (SDL) files with resolver functions.
import { GenerateSdl } from '@paljs/generator';
const sdlGenerator = new GenerateSdl('./prisma/schema.prisma', {
output: './src/graphql',
javaScript: false,
});
await sdlGenerator.run();
Generated Files:
-
typeDefs.ts
- GraphQL type definitions -
resolvers.ts
- Resolver implementations -
index.ts
- Combined exports
Key Methods:
-
run()
- Generate all SDL files -
createTypes()
- Generate type definitions -
createResolvers()
- Generate resolver functions -
createMaster()
- Create index files
Generates GraphQL Modules architecture with modular schema organization.
import { GenerateModules } from '@paljs/generator';
const modulesGenerator = new GenerateModules('./prisma/schema.prisma', {
output: './src/graphql',
});
await modulesGenerator.run();
Generated Files:
-
modules/
- Individual model modules -
inputs/
- Shared input types -
app.ts
- Application module configuration
Key Methods:
-
run()
- Generate all module files -
createModules()
- Generate individual modules -
createInputs()
- Generate input types -
createApp()
- Generate application module
Generates admin UI components and pages for Prisma models.
import { UIGenerator } from '@paljs/generator';
const uiGenerator = new UIGenerator('./prisma/schema.prisma');
await uiGenerator.generateAdminPages({
models: ['User', 'Post', 'Category'],
output: './src/admin/pages',
});
Key Methods:
-
generateAdminPages()
- Generate admin interface pages -
mergeSchemas()
- Merge multiple schemas for multi-database support
import { Generator } from '@paljs/generator';
const generator = new Generator(
{ name: 'nexus', schemaPath: './prisma/schema.prisma' },
{
output: './src/graphql',
prismaName: 'prisma',
excludeFields: ['password', 'hash'],
excludeModels: [{ name: 'Log', queries: true, mutations: true }],
},
);
await generator.run();
import { GenerateSdl } from '@paljs/generator';
const generator = new GenerateSdl('./prisma/schema.prisma', {
output: './src/graphql',
javaScript: false,
excludeQueriesAndMutations: ['deleteMany', 'updateMany'],
excludeFieldsByModel: {
User: ['password', 'hash'],
Post: ['internalNotes'],
},
});
await generator.run();
import { GenerateModules } from '@paljs/generator';
const generator = new GenerateModules('./prisma/schema.prisma', {
output: './src/graphql',
models: ['User', 'Post', 'Comment'],
disableQueries: false,
disableMutations: false,
});
await generator.run();
import { UIGenerator } from '@paljs/generator';
const uiGenerator = new UIGenerator('./prisma/schema.prisma');
// Generate admin pages for Next.js Pages Router (default)
await uiGenerator.generateAdminPages({
models: ['User', 'Post', 'Category'],
outPut: './src/pages/admin/models/',
routerType: 'pages', // Default: generates pages/admin/models/[Model].tsx
});
// Generate admin pages for Next.js App Router
await uiGenerator.generateAdminPages({
models: ['User', 'Post', 'Category'],
outPut: './src/app/admin/models/',
routerType: 'app', // Generates app/admin/models/[Model]/page.tsx + layouts
});
// Custom page template
await uiGenerator.generateAdminPages({
models: ['User', 'Post'],
outPut: './src/admin/pages',
pageContent: `
import React from 'react';
import CustomTable from 'components/CustomTable';
export default function #{id}Page() {
return <CustomTable model="#{id}" />;
}
`,
routerType: 'app',
});
// Generate GraphQL queries for frontend
await uiGenerator.generateGraphqlQueries({
output: './src/graphql/queries',
models: ['User', 'Post'],
});
The generator supports both Next.js routing patterns:
-
Output:
pages/admin/models/[Model].tsx
- Structure: Traditional Next.js pages directory
- Component: React functional component with default export
-
Output:
app/admin/models/[Model]/page.tsx
- Structure: Next.js 13+ app directory with automatic layouts
- Component: Default exported function component
-
Layouts: Automatically generates
layout.tsx
files for admin structure
import { UIGenerator } from '@paljs/generator';
const schemas = ['./prisma/user.prisma', './prisma/blog.prisma', './prisma/ecommerce.prisma'];
const uiGenerator = new UIGenerator(schemas);
await uiGenerator.generateAdminPages({
models: ['User', 'Post', 'Product'],
output: './src/admin/pages',
});
You can provide custom templates for generated code:
const generator = new GenerateNexus('./prisma/schema.prisma', {
output: './src/graphql',
templates: {
query: './templates/custom-query.template',
mutation: './templates/custom-mutation.template',
},
});
const generator = new Generator(
{ name: 'nexus', schemaPath: './prisma/schema.prisma' },
{
output: './src/graphql',
filterInputs: (input) => {
// Custom logic to filter input fields
return input.args.filter((arg) => !arg.name.includes('internal'));
},
},
);
const generator = new GenerateSdl('./prisma/schema.prisma', {
output: './src/graphql',
javaScript: true, // Generate .js files instead of .ts
});
const generator = new GenerateNexus('./prisma/schema.prisma', {
backAsText: true, // Return generated code as string instead of writing files
});
const generatedCode = await generator.run();
console.log(generatedCode);
const { Generator } = require('@paljs/generator');
class PalJSGeneratorPlugin {
apply(compiler) {
compiler.hooks.beforeCompile.tapAsync('PalJSGenerator', async (params, callback) => {
const generator = new Generator(
{ name: 'nexus', schemaPath: './prisma/schema.prisma' },
{ output: './src/graphql' },
);
await generator.run();
callback();
});
}
}
module.exports = PalJSGeneratorPlugin;
import { Generator } from '@paljs/generator';
export function paljs(options = {}) {
return {
name: 'paljs-generator',
buildStart: async () => {
const generator = new Generator({ name: 'nexus', schemaPath: './prisma/schema.prisma' }, options);
await generator.run();
},
};
}
import { Generator } from '@paljs/generator';
try {
const generator = new Generator({ name: 'nexus', schemaPath: './prisma/schema.prisma' }, { output: './src/graphql' });
await generator.run();
console.log('Generation completed successfully');
} catch (error) {
console.error('Generation failed:', error.message);
if (error.code === 'SCHEMA_NOT_FOUND') {
console.error('Prisma schema file not found');
} else if (error.code === 'INVALID_MODEL') {
console.error('Invalid model configuration');
}
}
const generator = new Generator(
{ name: 'nexus', schemaPath: './prisma/schema.prisma' },
{
output: './src/graphql',
models: ['User'], // Generate only specific models
incremental: true, // Only update changed files
},
);
import { GenerateNexus, GenerateSdl } from '@paljs/generator';
const [nexusResult, sdlResult] = await Promise.all([
new GenerateNexus('./prisma/schema.prisma', { output: './src/nexus' }).run(),
new GenerateSdl('./prisma/schema.prisma', { output: './src/sdl' }).run(),
]);
- 🏗️ Multiple Generators - Support for Nexus, SDL, and GraphQL Modules
- 🎯 Type Safety - Full TypeScript support with generated types
- 🔧 Customizable - Extensive configuration options
- 📝 Admin UI - Generate admin interfaces automatically
- 🚀 Performance - Optimized code generation
- 🔄 Incremental - Smart updates without overwriting custom code
type QueriesAndMutations =
| 'findUnique'
| 'findFirst'
| 'findMany'
| 'findCount'
| 'aggregate'
| 'createOne'
| 'createMany'
| 'updateOne'
| 'updateMany'
| 'deleteOne'
| 'deleteMany'
| 'upsertOne';
This package is written in TypeScript and provides comprehensive type definitions:
import type { GeneratorOptions, QueriesAndMutations, AdminPagesOptions } from '@paljs/generator';
const options: GeneratorOptions = {
output: './src/graphql',
prismaName: 'prisma',
excludeFields: ['password'],
excludeModels: [],
excludeFieldsByModel: {},
excludeQueriesAndMutations: [],
excludeQueriesAndMutationsByModel: {},
};
interface GeneratorOptions {
// Output directory for generated files
output: string;
// Prisma client instance name
prismaName: string;
// Models to include (default: all models)
models?: string[];
// Generate JavaScript instead of TypeScript
javaScript?: boolean;
// Fields to exclude globally
excludeFields: string[];
// Models to exclude with specific operations
excludeModels: Array<{
name: string;
queries?: boolean;
mutations?: boolean;
}>;
// Disable all queries or mutations
disableQueries?: boolean;
disableMutations?: boolean;
// Fields to exclude per model
excludeFieldsByModel: {
[modelName: string]: string[];
};
// Queries/mutations to exclude globally
excludeQueriesAndMutations: QueriesAndMutations[];
// Queries/mutations to exclude per model
excludeQueriesAndMutationsByModel: {
[modelName: string]: QueriesAndMutations[];
};
// Exclude input fields
excludeInputFields?: string[];
// Custom input filter function
filterInputs?: (input: DMMF.InputType) => DMMF.SchemaArg[];
// Disable field update operations input
doNotUseFieldUpdateOperationsInput?: boolean;
// Return generated code as text instead of writing files
backAsText?: boolean;
}
interface AdminPagesOptions {
// Models to generate admin pages for
models?: string[];
// Custom page template content (use #{id} as placeholder for model name)
pageContent?: string;
// Output directory path
outPut?: string;
// Return generated content as text instead of writing files
backAsText?: boolean;
// Router type for Next.js
routerType?: 'pages' | 'app';
}
-
'pages'
(default): Generates files for Next.js Pages Router- Creates:
pages/admin/models/[Model].tsx
- Uses React functional components with default export
- Creates:
-
'app'
: Generates files for Next.js App Router- Creates:
app/admin/models/[Model]/page.tsx
- Automatically generates layout files (
layout.tsx
) - Uses default exported function components
- Creates:
MIT License - see the LICENSE file for details.