Package Exports
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (prisma-class-validator-generator) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Prisma Class Validator Generator
๐๏ธ Prisma Class Validator Generator
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
๐ Support This Project
If this tool helps you build better applications, please consider supporting its development:
Your sponsorship helps maintain and improve this project. Thank you! ๐
โจ Features
- ๐๏ธ 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
๐ Quick Start
Installation
# npm
npm install prisma-class-validator-generator
# yarn
yarn add prisma-class-validator-generator
# pnpm
pnpm add prisma-class-validator-generatorBasic Setup
- 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 = '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!');
}๐ฏ Generated Output
The generator creates TypeScript classes with appropriate class-validator decorators:
User.model.ts
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[];
}Post.model.ts
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;
}๐ง Configuration Options
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
}Available Options
| 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 |
Swagger Support (swagger = "true")
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;
}Relation Field Splitting (separateRelationFields = "true")
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 {}๐ Advanced Usage
Complex Schema Example
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
}Generated Enum
export enum Role {
USER = "USER",
ADMIN = "ADMIN",
MODERATOR = "MODERATOR",
}Generated Models with Advanced Types
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;
}๐งช Testing
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๐ Type Mapping
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() |
๐ค Contributing
We welcome contributions! Please see our Contributing Guide for details.
Development Setup
git clone https://github.com/omar-dulaimi/prisma-class-validator-generator.git
cd prisma-class-validator-generator
npm install
npm run build
npm testCommon Development Commands
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๐ API Reference
Generator Configuration
The generator accepts the following configuration in your schema.prisma:
generator class_validator {
provider = "prisma-class-validator-generator"
output = "./generated" // Optional: output directory
}Generated File Structure
generated/
โโโ models/
โ โโโ User.model.ts
โ โโโ Post.model.ts
โ โโโ index.ts
โโโ enums/
โ โโโ Role.ts
โ โโโ index.ts
โโโ index.ts๐ Troubleshooting
Common Issues
- 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
Debug Mode
Enable debug logging by setting the DEBUG environment variable:
DEBUG=prisma:generator npx prisma generate๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- 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