Prisma 7+ generator to emit typescript models of your database with class validator
npm install @howdygo/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
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
``bashnpm
npm install prisma-class-validator-generator
$3
1. Add the generator to your Prisma schema:
> Heads up: Keep a Prisma Client generator in the same schema. Both
provider = "prisma-client" (recommended) and provider = "prisma-client-js" are supported.`prisma
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
}
`2. Generate your models:
`bash
npx prisma generate
`3. Use the generated classes:
`typescript
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:
$3
`typescript
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[];
}
`$3
`typescript
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:
`prisma
generator class_validator {
provider = "prisma-class-validator-generator"
output = "./src/models" // Output directory
swagger = "true" // Add Swagger decorators
separateRelationFields = "true" // Split base/relation classes
}
`$3
| 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 |$3
Automatically generates NestJS Swagger decorators alongside class-validator decorators:
`typescript
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;
}
`$3
Perfect for NestJS DTOs - generates separate classes for maximum flexibility:
-
UserBase.model.ts - Only scalar fields with validation decorators
- UserRelations.model.ts - Only relation fields
- User.model.ts - Combined class extending UserBaseThis enables powerful NestJS patterns:
`typescript
// 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
$3
`prisma
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
}
`$3
`typescript
export enum Role {
USER = "USER",
ADMIN = "ADMIN",
MODERATOR = "MODERATOR",
}
`$3
`typescript
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:
`bash
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.
$3
`bash
git clone https://github.com/omar-dulaimi/prisma-class-validator-generator.git
cd prisma-class-validator-generator
npm install
npm run build
npm test
`$3
`bash
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
$3
The generator accepts the following configuration in your
schema.prisma:`prisma
generator class_validator {
provider = "prisma-class-validator-generator"
output = "./generated" // Optional: output directory
}
`$3
`
generated/
โโโ models/
โ โโโ User.model.ts
โ โโโ Post.model.ts
โ โโโ index.ts
โโโ enums/
โ โโโ Role.ts
โ โโโ index.ts
โโโ index.ts
`๐ Troubleshooting
$3
1. Generator not found: Ensure you've installed the package as a dependency
2. Output directory errors: Check that the parent directory exists
3. Import errors: Make sure class-validator is installed in your project
$3
Enable debug logging by setting the
DEBUG environment variable:`bash
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
---