https://github.com/omar-dulaimi/prisma-class-validator-generator
Prisma 2+ generator to emit typescript models of your database with class validator
https://github.com/omar-dulaimi/prisma-class-validator-generator
class-validator prisma prisma-generator
Last synced: 8 months ago
JSON representation
Prisma 2+ generator to emit typescript models of your database with class validator
- Host: GitHub
- URL: https://github.com/omar-dulaimi/prisma-class-validator-generator
- Owner: omar-dulaimi
- License: mit
- Created: 2022-04-17T14:53:27.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2025-09-02T23:39:58.000Z (8 months ago)
- Last Synced: 2025-09-03T01:08:26.619Z (8 months ago)
- Topics: class-validator, prisma, prisma-generator
- Language: TypeScript
- Homepage:
- Size: 226 KB
- Stars: 82
- Watchers: 1
- Forks: 15
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: .github/CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# Prisma Class Validator Generator
[](https://www.npmjs.com/package/prisma-class-validator-generator)
[](https://www.npmjs.com/package/prisma-class-validator-generator)
[](https://github.com/omar-dulaimi/prisma-class-validator-generator/stargazers)
[](https://github.com/omar-dulaimi/prisma-class-validator-generator/blob/master/LICENSE)
[](https://github.com/omar-dulaimi/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
```bash
# npm
npm install prisma-class-validator-generator
# yarn
yarn add prisma-class-validator-generator
# pnpm
pnpm add prisma-class-validator-generator
```
### Basic Setup
1. Add the generator to your Prisma schema:
```prisma
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:
### User.model.ts
```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[];
}
```
### Post.model.ts
```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
}
```
### 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:
```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;
}
```
### Relation Field Splitting (`separateRelationFields = "true"`)
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 UserBase
This 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
### Complex Schema Example
```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
}
```
### Generated Enum
```typescript
export enum Role {
USER = "USER",
ADMIN = "ADMIN",
MODERATOR = "MODERATOR",
}
```
### Generated Models with Advanced Types
```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](CONTRIBUTING.md) for details.
### Development Setup
```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
```
### Common Development Commands
```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
### Generator Configuration
The generator accepts the following configuration in your `schema.prisma`:
```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
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
### Debug Mode
Enable debug logging by setting the `DEBUG` environment variable:
```bash
DEBUG=prisma:generator npx prisma generate
```
## ๐ License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## ๐ Acknowledgments
- Built for the amazing [Prisma](https://prisma.io) ecosystem
- Powered by [class-validator](https://github.com/typestack/class-validator) for robust validation
- Uses [ts-morph](https://github.com/dsherret/ts-morph) for TypeScript AST manipulation
---