UNPKG

prisma-class-validator

Version:

Automatically generator class-validator schema from Prisma client

110 lines (108 loc) 4.85 kB
"use strict"; /** * @copyright Koj <https://koj.co> * @link https://github.com/koj-co/prisma-class-validator */ Object.defineProperty(exports, "__esModule", { value: true }); exports.generateClassValidatorFromPrismaClient = exports.readAndGenerateClassValidator = void 0; const prettier_1 = require("prettier"); const promises_1 = require("fs/promises"); const path_1 = require("path"); const readAndGenerateClassValidator = async () => { const generatedTypes = await promises_1.readFile(path_1.join(".", "node_modules", ".prisma", "client", "index.d.ts"), "utf8"); return exports.generateClassValidatorFromPrismaClient(generatedTypes); }; exports.readAndGenerateClassValidator = readAndGenerateClassValidator; const generateClassValidatorFromPrismaClient = (generatedTypes) => { const enums = new Set(); const enumValues = {}; generatedTypes.split("\n").forEach((line) => { if (line.includes("[keyof typeof ")) enums.add(line.split("[keyof typeof ")[1].split("]")[0]); }); enums.forEach((val) => { const started = generatedTypes.split(`export const ${val}: {`)[1]; if (started) enumValues[val] = started .split("}")[0] .split("\n") .map((i) => i.split(":")[0].trim()) .filter((i) => i.length > 0); }); return prettier_1.format(`/** * 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'; ` + generatedTypes .split("@prisma/client/runtime';")[1] .split("export class PrismaClient")[0] .split("/**\n * ## Prisma Client")[0] .replace(new RegExp("Prisma.JsonValue", "g"), "any") .replace(new RegExp("Prisma.Decimal", "g"), "string") .replace(new RegExp("export const", "g"), "export let") .split("\n") .map((line) => { if (line.match(/export type ([A-Z])\w+ = {/g)) line = line.replace("export type ", "export class ").replace("= {", "{"); else if (line.endsWith(": string")) return `\n@IsString()\n@IsNotEmpty()\n${line.replace(":", "!:")}`; else if (line.endsWith(": string | null")) return `\n@IsString()\n@IsOptional()\n${line.replace(":", "?:")}`; else if (line.endsWith(": Date | null")) return `\n@IsDateString()\n@IsOptional()\n${line.replace(":", "?:")}`; else if (line.endsWith(": Date")) return `\n@IsDateString()\n@IsNotEmpty()\n${line.replace(":", "!:")}`; else if (line.endsWith(": number")) return `\n@IsNumber()\n@IsNotEmpty()\n${line.replace(":", "!:")}`; else if (line.endsWith(": number | null")) return `\n@IsNumber()\n@IsOptional()\n${line.replace(":", "?:")}`; else if (line.endsWith(": any")) return `\n@IsObject()\n@IsNotEmpty()\n${line.replace(":", "!:")}`; else if (line.endsWith(": any | null")) return `\n@IsObject()\n@IsOptional()\n${line.replace(":", "?:")}`; else if (line.endsWith(": boolean")) return `\n@IsBoolean()\n@IsNotEmpty()\n${line.replace(":", "!:")}`; else if (line.endsWith(": boolean | null")) return `\n@IsBoolean()\n@IsOptional()\n${line.replace(":", "?:")}`; else { let result = ""; enums.forEach((val) => { let options = enumValues[val]; let prefix = ""; if (options) prefix = `@IsIn([${options.map((i) => `'${i}'`).join(", ")}])\n`; if (line.endsWith(`: ${val}`)) result = `\n@IsString()${prefix}\n@IsNotEmpty()\n${line.replace(":", "!:")}`; else if (line.endsWith(`: ${val} | null`)) result = `\n@IsString()${prefix}\n@IsOptional()\n${line.replace(":", "?:")}`; }); if (result) return result; } return line; }) .map((i) => i.includes("?!:") ? i.replace("?!:", "!:") : i.includes("??:") ? i.replace("??:", "?:") : i) .join("\n") .trim() + "\n", { parser: "typescript" }); }; exports.generateClassValidatorFromPrismaClient = generateClassValidatorFromPrismaClient; //# sourceMappingURL=index.js.map