An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

README

          

# Prisma Class Validator Generator

[![NPM Version](https://img.shields.io/npm/v/prisma-class-validator-generator?style=for-the-badge&logo=npm&color=blue)](https://www.npmjs.com/package/prisma-class-validator-generator)
[![NPM Downloads](https://img.shields.io/npm/dm/prisma-class-validator-generator?style=for-the-badge&logo=npm&color=green)](https://www.npmjs.com/package/prisma-class-validator-generator)
[![GitHub Stars](https://img.shields.io/github/stars/omar-dulaimi/prisma-class-validator-generator?style=for-the-badge&logo=github&color=yellow)](https://github.com/omar-dulaimi/prisma-class-validator-generator/stargazers)
[![License](https://img.shields.io/github/license/omar-dulaimi/prisma-class-validator-generator?style=for-the-badge&color=purple)](https://github.com/omar-dulaimi/prisma-class-validator-generator/blob/master/LICENSE)
[![Test Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen?style=for-the-badge)](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:



GitHub Sponsors

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

---


Made with โค๏ธ by Omar Dulaimi



โญ Star us on GitHub โ€ข
๐Ÿ› Report Issues โ€ข
๐Ÿ’ฌ Discussions