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! π
- ποΈ 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:
Heads up: Keep a Prisma Client generator in the same schema. Both
provider = "prisma-client"(recommended) andprovider = "prisma-client-js"are supported.
generator client { provider = "prisma-client" // or "prisma-client-js" output = "../generated/prisma-client" // required when using prisma-client } 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 = 'user@example.com'; user.name = 'John Doe'; const errors = await validate(user); if (errors.length > 0) { console.log('Validation failed:', errors); } else { console.log('User is valid!'); }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 reportThe 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 testnpm 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 PrettierThe 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 generateThis 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