JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 1633
  • Score
    100M100P100Q115679F
  • License MIT

Prisma 2+ generator to emit typescript models of your database with class validator

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

    NPM Version NPM Downloads GitHub Stars License Test Coverage

    ๐Ÿ—๏ธ 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

    # 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:
    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
    }
    1. Generate your models:
    npx prisma generate
    1. 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 decorators
    • UserRelations.model.ts - Only relation fields
    • User.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 test

    Common 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

    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:

    DEBUG=prisma:generator npx prisma generate

    ๐Ÿ“„ License

    This project is licensed under the MIT License - see the LICENSE file for details.

    ๐Ÿ™ Acknowledgments


    Made with โค๏ธ by Omar Dulaimi

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