Automatically generate TypeScript class-validator models from your Prisma schema
Create type-safe validation classes with decorators from your database models
Quick Start β’ Examples β’ Features β’ Contributing
If this tool helps you build better applications, please consider supporting its development:
Your sponsorship helps maintain and improve this project. Thank you! π
Try the latest beta with enhanced Prisma 6 support!
npm install prisma-class-validator-generator@beta
This beta includes major upgrades for Prisma 6.x compatibility - bringing full support for the latest Prisma features including proper Uint8Array handling for Bytes fields and modern Node.js requirements.
What to test:
- β Prisma 6.12+ schema generation
- β Uint8Array support for Bytes fields
- β Complex schemas with enums and relations
- β TypeScript 5.8+ compatibility
Please test in development and report any issues. Your feedback helps us deliver a stable v6.0.0 release!
- ποΈ Auto-generation - Automatically generates TypeScript models with class-validator decorators
- π§ Prisma 6 support - Full compatibility with the latest Prisma features and types
- π― Type safety - Perfect TypeScript integration with proper type inference
- π Smart decorators - Intelligent mapping of Prisma types to class-validator decorators
- π Incremental updates - Regenerates only when schema changes
- π Zero config - Works out of the box with sensible defaults
- π‘οΈ Production ready - Battle-tested with comprehensive test coverage
- π¦ Lightweight - Minimal dependencies and fast generation
# npm
npm install prisma-class-validator-generator
# yarn
yarn add prisma-class-validator-generator
# pnpm
pnpm add prisma-class-validator-generator
- Add the generator to your Prisma schema:
generator class_validator {
provider = "prisma-class-validator-generator"
output = "./generated" // optional, defaults to ./generated
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String
content String?
published Boolean @default(false)
viewCount Int @default(0)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
rating Float
}
- Generate your models:
npx prisma generate
- Use the generated classes:
import { User } from './generated/models';
import { validate } from 'class-validator';
const user = new User();
user.id = 1;
user.email = '[email protected]';
user.name = 'John Doe';
const errors = await validate(user);
if (errors.length > 0) {
console.log('Validation failed:', errors);
} else {
console.log('User is valid!');
}
Prisma Version | Generator Version | Maintained |
---|---|---|
v6.x | v6.0.0-beta.1 | β Active |
v5.x | v5.0.0 | β No |
v4.x | v0.2.0 - v4.x | β No |
v2-3.x | v0.1.x | β No |
Currently in development! This version brings full Prisma 6 compatibility:
- Prisma 6 Support - Full compatibility with Prisma 6.12+ features
- Uint8Array Support - Proper handling of Bytes fields as Uint8Array (breaking change from Buffer)
- Node.js 18+ - Modern Node.js support (18.18+, 20.9+, 22.11+)
- TypeScript 5.8 - Latest TypeScript features and optimizations
- Enhanced Testing - Comprehensive test suite with Vitest and 95%+ coverage
- Performance Improvements - Faster generation with optimized AST manipulation
Note: This beta version is currently in development. The stable v5.0.0 supports Prisma 5.x.
The generator creates TypeScript classes with appropriate class-validator decorators:
import { IsInt, IsDefined, IsString, IsOptional } from "class-validator";
import { Post } from "./Post.model";
export class User {
@IsDefined()
@IsInt()
id!: number;
@IsDefined()
@IsString()
email!: string;
@IsOptional()
@IsString()
name?: string | null;
@IsDefined()
posts!: Post[];
}
import { IsInt, IsDefined, IsDate, IsString, IsOptional, IsBoolean, IsNumber } from "class-validator";
import { User } from "./User.model";
export class Post {
@IsDefined()
@IsInt()
id!: number;
@IsDefined()
@IsDate()
createdAt!: Date;
@IsDefined()
@IsDate()
updatedAt!: Date;
@IsDefined()
@IsString()
title!: string;
@IsOptional()
@IsString()
content?: string | null;
@IsDefined()
@IsBoolean()
published!: boolean;
@IsDefined()
@IsInt()
viewCount!: number;
@IsOptional()
author?: User | null;
@IsOptional()
@IsInt()
authorId?: number | null;
@IsDefined()
@IsNumber()
rating!: number;
}
Customize the generator behavior:
generator class_validator {
provider = "prisma-class-validator-generator"
output = "./src/models" // Output directory
swagger = "true" // Add Swagger decorators
separateRelationFields = "true" // Split base/relation classes
}
Option | Type | Default | Description |
---|---|---|---|
output |
string |
"./generated" |
Output directory for generated models |
swagger |
string |
"false" |
Add NestJS @ApiProperty decorators for Swagger docs |
separateRelationFields |
string |
"false" |
Generate separate base and relation classes for flexible DTOs |
Automatically generates NestJS Swagger decorators alongside class-validator decorators:
export class User {
@IsDefined()
@ApiProperty({ example: 'Generated by autoincrement', type: "integer" })
@IsInt()
id!: number;
@IsDefined()
@ApiProperty({ type: "string" })
@IsString()
email!: string;
@IsOptional()
@ApiProperty({ type: "string", required: false })
@IsString()
name?: string | null;
}
Perfect for NestJS DTOs - generates separate classes for maximum flexibility:
UserBase.model.ts
- Only scalar fields with validation decoratorsUserRelations.model.ts
- Only relation fieldsUser.model.ts
- Combined class extending UserBase
This enables powerful NestJS patterns:
// Create DTO without relations using PickType
export class CreateUserDto extends PickType(UserBase, ['email', 'name']) {}
// Update DTO with partial fields
export class UpdateUserDto extends PartialType(UserBase) {}
// Full model with relations for responses
export class UserResponseDto extends User {}
enum Role {
USER
ADMIN
MODERATOR
}
model User {
id String @id @default(cuid())
email String @unique
name String?
role Role @default(USER)
profile Profile?
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Profile {
id String @id @default(cuid())
bio String?
avatar Bytes?
user User @relation(fields: [userId], references: [id])
userId String @unique
}
model Post {
id String @id @default(cuid())
title String
content String?
published Boolean @default(false)
tags String[]
metadata Json?
author User @relation(fields: [authorId], references: [id])
authorId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
export enum Role {
USER = "USER",
ADMIN = "ADMIN",
MODERATOR = "MODERATOR",
}
import { IsString, IsDefined, IsEmail, IsOptional, IsEnum, IsDate } from "class-validator";
import { Role } from "../enums";
import { Profile } from "./Profile.model";
import { Post } from "./Post.model";
export class User {
@IsDefined()
@IsString()
id!: string;
@IsDefined()
@IsEmail()
email!: string;
@IsOptional()
@IsString()
name?: string | null;
@IsDefined()
@IsEnum(Role)
role!: Role;
@IsOptional()
profile?: Profile | null;
@IsDefined()
posts!: Post[];
@IsDefined()
@IsDate()
createdAt!: Date;
@IsDefined()
@IsDate()
updatedAt!: Date;
}
The generator includes comprehensive tests covering:
- Basic model generation
- Complex schemas with relations
- Enum generation
- Edge cases and error handling
- TypeScript compilation
Run tests:
npm test # Run tests in watch mode
npm run test:ci # Run tests once with coverage
npm run test:coverage # Generate coverage report
The generator intelligently maps Prisma types to class-validator decorators:
Prisma Type | TypeScript Type | Class Validator Decorator |
---|---|---|
String |
string |
@IsString() |
Int |
number |
@IsInt() |
Float |
number |
@IsNumber() |
Boolean |
boolean |
@IsBoolean() |
DateTime |
Date |
@IsDate() |
Bytes |
Uint8Array |
@IsDefined() |
Json |
any |
@IsDefined() |
String[] |
string[] |
@IsArray() |
Enum |
EnumType |
@IsEnum(EnumType) |
Optional fields | type | null |
@IsOptional() |
Required fields | type |
@IsDefined() |
We welcome contributions! Please see our Contributing Guide for details.
git clone https://github.com/omar-dulaimi/prisma-class-validator-generator.git
cd prisma-class-validator-generator
npm install
npm run build
npm test
npm run build # Compile TypeScript
npm run start # Build and run Prisma generate
npm test # Run tests in watch mode
npm run test:ci # Run tests with coverage
npm run format # Format code with Prettier
The generator accepts the following configuration in your schema.prisma
:
generator class_validator {
provider = "prisma-class-validator-generator"
output = "./generated" // Optional: output directory
}
generated/
βββ models/
β βββ User.model.ts
β βββ Post.model.ts
β βββ index.ts
βββ enums/
β βββ Role.ts
β βββ index.ts
βββ index.ts
- Generator not found: Ensure you've installed the package as a dependency
- Output directory errors: Check that the parent directory exists
- Import errors: Make sure class-validator is installed in your project
Enable debug logging by setting the DEBUG
environment variable:
DEBUG=prisma:generator npx prisma generate
This project is licensed under the MIT License - see the LICENSE file for details.
- Built for the amazing Prisma ecosystem
- Powered by class-validator for robust validation
- Uses ts-morph for TypeScript AST manipulation
Made with β€οΈ by Omar Dulaimi
β Star us on GitHub β’ π Report Issues β’ π¬ Discussions