Automatically generator class-validator schema from Prisma client projects.
| Status | |
|---|---|
| Build | |
| Health | |
| PRs | 
At Koj, we use this package to automatically generate @koj/types from our Prisma schema.
The readAndGenerateClassValidator method reads your generated Prisma client (after running npx prisma generate) and automatically generates a class-validator schema.
First, install from npm:
npm install --save-dev prisma-class-validatorUsage with TypeScript/Node.js:
import { readAndGenerateClassValidator } from "prisma-class-validator";
import { writeFile } from "fs/promises";
(async () => {
  const schema = await readAndGenerateClassValidator();
  await writeFile("validator.ts", schema);
})();Usage with JavaScript/Node.js:
const { readAndGenerateClassValidator } = require("prisma-class-validator");
const { writeFile } = require("fs/promises");
(async () => {
  const schema = await readAndGenerateClassValidator();
  await writeFile("validator.ts", schema);
})();The generateClassValidatorFromPrismaClient method is used to take a string consisting of generated Prisma schema and converting it to class-validator. In this case, you are expected to read the generated Prisma schema index.d.ts file and supply that as the input.
Example input
generateClassValidatorFromPrismaClient(`
  /**
   * Client
  **/
  
  import * as runtime from '@prisma/client/runtime';
  
  
  /**
   * Model Lead
   */
  
  export type Lead = {
    browser: string | null
    city: string | null
    countryCode: string | null
    createdAt: Date
    email: string
    id: number
    name: string
    operatingSystem: string | null
    region: string | null
    responses: Prisma.JsonValue | null
    timezone: string | null
    updatedAt: Date
  }
  
  /**
   * Model User
   */
  
  export type User = {
    active: boolean
    attributes: Prisma.JsonValue | null
    checkLocationOnLogin: boolean
    countryCode: string
    createdAt: Date
    gender: Gender
  }
  /**
   * Enums
   */
  // Based on
  // https://github.com/microsoft/TypeScript/issues/3192#issuecomment-261720275
  export const Gender: {
    FEMALE: 'FEMALE',
    MALE: 'MALE',
    NONBINARY: 'NONBINARY',
    UNKNOWN: 'UNKNOWN'
  };
  export type Gender = (typeof Gender)[keyof typeof Gender]
`);Resulting output
`/**
 * DO NOT EDIT THIS FILE MANUALLY
 * ==============================
 *
 * This file is automatically generated by Prisma Class Validator using @prisma/client
 * Source: https://github.com/koj-co/prisma-class-validator/blob/HEAD/scripts/generate-types.ts
 */
import {
  IsOptional,
  IsString,
  IsNumber,
  IsNotEmpty,
  IsBoolean,
  IsObject,
  IsDateString,
  IsIn,
} from "class-validator";
/**
 * Model Lead
 */
export class Lead {
  @IsString()
  @IsOptional()
  browser?: string | null;
  @IsString()
  @IsOptional()
  city?: string | null;
  @IsString()
  @IsOptional()
  countryCode?: string | null;
  @IsDateString()
  @IsNotEmpty()
  createdAt!: Date;
  @IsString()
  @IsNotEmpty()
  email!: string;
  @IsNumber()
  @IsNotEmpty()
  id!: number;
  @IsString()
  @IsNotEmpty()
  name!: string;
  @IsString()
  @IsOptional()
  operatingSystem?: string | null;
  @IsString()
  @IsOptional()
  region?: string | null;
  @IsObject()
  @IsOptional()
  responses?: any | null;
  @IsString()
  @IsOptional()
  timezone?: string | null;
  @IsDateString()
  @IsNotEmpty()
  updatedAt!: Date;
}
/**
 * Model User
 */
export class User {
  @IsBoolean()
  @IsNotEmpty()
  active!: boolean;
  @IsObject()
  @IsOptional()
  attributes?: any | null;
  @IsBoolean()
  @IsNotEmpty()
  checkLocationOnLogin!: boolean;
  @IsString()
  @IsNotEmpty()
  countryCode!: string;
  @IsDateString()
  @IsNotEmpty()
  createdAt!: Date;
  
  @IsString()
  @IsIn(["FEMALE", "MALE", "NONBINARY", "UNKNOWN"])
  @IsNotEmpty()
  gender!: Gender;
}
/**
 * Enums
 */
// Based on
// https://github.com/microsoft/TypeScript/issues/3192#issuecomment-261720275
export let Gender: {
  FEMALE: "FEMALE";
  MALE: "MALE";
  NONBINARY: "NONBINARY";
  UNKNOWN: "UNKNOWN";
};
export type Gender = typeof Gender[keyof typeof Gender];`;
  An open source project by Koj. 
 Furnish your home in style, for as low as CHF175/month β