
Security News
rv Is a New Rust-Powered Ruby Version Manager Inspired by Python's uv
Ruby maintainers from Bundler and rbenv teams are building rv to bring Python uv's speed and unified tooling approach to Ruby development.
prisma-class-validator-generator
Advanced tools
Prisma 2+ generator to emit typescript models of your database with class validator
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! ๐
# npm
npm install prisma-class-validator-generator
# yarn
yarn add prisma-class-validator-generator
# pnpm
pnpm add prisma-class-validator-generator
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
}
npx prisma generate
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 |
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;
}
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 UserBaseThis 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:
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
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.
Made with โค๏ธ by Omar Dulaimi
โญ Star us on GitHub โข ๐ Report Issues โข ๐ฌ Discussions
FAQs
Prisma 2+ generator to emit typescript models of your database with class validator
The npm package prisma-class-validator-generator receives a total of 1,193 weekly downloads. As such, prisma-class-validator-generator popularity was classified as popular.
We found that prisma-class-validator-generator demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.ย It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Ruby maintainers from Bundler and rbenv teams are building rv to bring Python uv's speed and unified tooling approach to Ruby development.
Security News
Following last weekโs supply chain attack, Nx published findings on the GitHub Actions exploit and moved npm publishing to Trusted Publishers.
Security News
AGENTS.md is a fast-growing open format giving AI coding agents a shared, predictable way to understand project setup, style, and workflows.