From 29da7fa8c77df6914ef43fb22333cd73d9596553 Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Tue, 2 Jul 2024 11:24:50 +0900 Subject: [PATCH 1/9] fix number default value convert to Date error --- src/components/field.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/field.component.ts b/src/components/field.component.ts index 9c78f2d..3d3e392 100755 --- a/src/components/field.component.ts +++ b/src/components/field.component.ts @@ -26,7 +26,7 @@ export class FieldComponent extends BaseComponent implements Echoable { let defaultValue = '' if (this.default) { - if (!isNaN(Date.parse(this.default))) { + if (this.type === 'Date' && !isNaN(Date.parse(this.default))) { defaultValue = `= new Date('${this.default}')` } else { defaultValue = `= ${this.default}` From 3028b12905868e49926ce334751b88d487118e39 Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Wed, 3 Jul 2024 17:44:36 +0900 Subject: [PATCH 2/9] fix/add use class-validator --- package.json | 12 ++++----- prisma/postgresql.prisma | 1 + src/convertor.ts | 58 ++++++++++++++++++++++++++++++++++------ src/generator.ts | 4 +++ 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 6c32638..c689b5a 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "prisma-class-generator", - "version": "0.2.9", + "name": "prisma-class-generator-custom", + "version": "1.0.0", "description": "Class generator from Prisma schema", "main": "dist/index.js", "license": "MIT", @@ -10,10 +10,10 @@ "typescript", "generator" ], - "homepage": "https://github.com/kimjbstar/prisma-class-generator", + "homepage": "https://github.com/ABHwan/prisma-class-generator", "repository": { "type": "git", - "url": "git://github.com/kimjbstar/prisma-class-generator.git" + "url": "git://github.com/ABHwan/prisma-class-generator.git" }, "scripts": { "format": "prettier --write \"src/**/*.ts\"", @@ -29,8 +29,8 @@ "node": ">=14" }, "author": { - "name": "kimjbstar", - "email": "kimjbstar@gmail.com" + "name": "ABHwan", + "email": "say5131@gmail.com" }, "dependencies": { "@prisma/client": "^5.5.2", diff --git a/prisma/postgresql.prisma b/prisma/postgresql.prisma index 9560e8b..9664cce 100755 --- a/prisma/postgresql.prisma +++ b/prisma/postgresql.prisma @@ -13,6 +13,7 @@ generator prismaClassGenerator { output = "../src/_gen/prisma-class" dryRun = "false" separateRelationFields = "false" + useValidator = "false" } enum ProductType { diff --git a/src/convertor.ts b/src/convertor.ts index c08d547..73171e1 100755 --- a/src/convertor.ts +++ b/src/convertor.ts @@ -3,13 +3,7 @@ import { ClassComponent } from './components/class.component' import { DecoratorComponent } from './components/decorator.component' import { FieldComponent } from './components/field.component' import { PrismaClassGeneratorConfig } from './generator' -import { - arrayify, - capitalizeFirst, - uniquify, - wrapArrowFunction, - wrapQuote, -} from './util' +import { arrayify, capitalizeFirst, uniquify, wrapArrowFunction, wrapQuote } from './util' /** BigInt, Boolean, Bytes, DateTime, Decimal, Float, Int, JSON, String, $ModelName */ type DefaultPrismaFieldType = @@ -185,6 +179,44 @@ export class PrismaConvertor { return decorator } + extractValidatorDecoratorsFromField = ( + dmmfField: DMMF.Field, + ): DecoratorComponent[] => { + const decorators: DecoratorComponent[] = [] + const importFrom = 'class-validator' + let name: string; + switch (dmmfField.type) { + case 'Int': + name = 'IsInt' + break; + case 'DateTime': + name = 'IsDate' + break; + case 'String': + name = 'IsString' + break; + case 'Boolean': + name = 'IsBoolean' + break; + } + if (name) { + decorators.push(new DecoratorComponent({ name, importFrom })) + } + + if (dmmfField.isRequired) { + name = 'IsDefined' + decorators.push(new DecoratorComponent({ name, importFrom })) + } else { + name = 'IsOptional' + decorators.push(new DecoratorComponent({ name, importFrom })) + } + if (dmmfField.kind === 'enum') { + name = 'IsIn' + decorators.push(new DecoratorComponent({ name, importFrom, params: [`getEnumValues(${String(dmmfField.type)})`] })) + } + return decorators; + } + getClass = (input: ConvertModelInput): ClassComponent => { /** options */ const options = Object.assign( @@ -212,7 +244,11 @@ export class PrismaConvertor { const relationTypes = uniquify( model.fields .filter( - (field) => field.relationName && (this._config.separateRelationFields ? true : model.name !== field.type), + (field) => + field.relationName && + (this._config.separateRelationFields + ? true + : model.name !== field.type), ) .map((v) => v.type), ) @@ -343,6 +379,12 @@ export class PrismaConvertor { field.decorators.push(decorator) } + if (this.config.useValidator) { + const decorators = this.extractValidatorDecoratorsFromField(dmmfField) + console.log(decorators) + field.decorators.push(...decorators) + } + if (this.config.useGraphQL) { const decorator = this.extractTypeGraphQLDecoratorFromField(dmmfField) diff --git a/src/generator.ts b/src/generator.ts index 608c23f..04da788 100755 --- a/src/generator.ts +++ b/src/generator.ts @@ -53,6 +53,10 @@ export const PrismaClassGeneratorOptions = { defaultValue: false, desc: 'preserve default nullable behavior', }, + useValidator: { + desc: 'use nest js class-validator decorators', + defaultValue: false, + }, } as const export type PrismaClassGeneratorOptionsKeys = From a701ada11aac04ed2e23ecdc3f6bf8a6c4bf9db2 Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Wed, 3 Jul 2024 17:45:29 +0900 Subject: [PATCH 3/9] fix/add use class-validator --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c689b5a..b84ec66 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prisma-class-generator-custom", - "version": "1.0.0", + "version": "1.1.0", "description": "Class generator from Prisma schema", "main": "dist/index.js", "license": "MIT", From 438efdb74ea5b20aa19ec890514e4b0cad1eba66 Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Wed, 3 Jul 2024 18:12:24 +0900 Subject: [PATCH 4/9] fix enum typecheck IsIn => IsEnum --- package.json | 2 +- src/convertor.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b84ec66..101c4ec 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prisma-class-generator-custom", - "version": "1.1.0", + "version": "1.2.1", "description": "Class generator from Prisma schema", "main": "dist/index.js", "license": "MIT", diff --git a/src/convertor.ts b/src/convertor.ts index 73171e1..ca629b0 100755 --- a/src/convertor.ts +++ b/src/convertor.ts @@ -211,8 +211,8 @@ export class PrismaConvertor { decorators.push(new DecoratorComponent({ name, importFrom })) } if (dmmfField.kind === 'enum') { - name = 'IsIn' - decorators.push(new DecoratorComponent({ name, importFrom, params: [`getEnumValues(${String(dmmfField.type)})`] })) + name = 'IsEnum' + decorators.push(new DecoratorComponent({ name, importFrom, params: [`${String(dmmfField.type)}`] })) } return decorators; } From 57609fa75973de16d7e79b0b5d616a0d2cdbc040 Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Wed, 3 Jul 2024 18:18:29 +0900 Subject: [PATCH 5/9] fix remove console log --- package.json | 2 +- src/convertor.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 101c4ec..6cc5206 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prisma-class-generator-custom", - "version": "1.2.1", + "version": "1.2.2", "description": "Class generator from Prisma schema", "main": "dist/index.js", "license": "MIT", diff --git a/src/convertor.ts b/src/convertor.ts index ca629b0..cc705d3 100755 --- a/src/convertor.ts +++ b/src/convertor.ts @@ -381,7 +381,6 @@ export class PrismaConvertor { if (this.config.useValidator) { const decorators = this.extractValidatorDecoratorsFromField(dmmfField) - console.log(decorators) field.decorators.push(...decorators) } From 6cdc3975fe26b7fcc5306b101f1de9328a22351e Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Sun, 25 Aug 2024 02:04:56 +0900 Subject: [PATCH 6/9] add option rewrite --- prisma/postgresql.prisma | 1 + src/generator.ts | 14 +++++++------- src/util.ts | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/prisma/postgresql.prisma b/prisma/postgresql.prisma index 9664cce..a420e80 100755 --- a/prisma/postgresql.prisma +++ b/prisma/postgresql.prisma @@ -14,6 +14,7 @@ generator prismaClassGenerator { dryRun = "false" separateRelationFields = "false" useValidator = "false" + rewrite = "false" } enum ProductType { diff --git a/src/generator.ts b/src/generator.ts index 04da788..5d076d8 100755 --- a/src/generator.ts +++ b/src/generator.ts @@ -2,13 +2,7 @@ import { GeneratorOptions } from '@prisma/generator-helper' import { parseEnvValue } from '@prisma/internals' import * as path from 'path' import { PrismaConvertor } from './convertor' -import { - getRelativeTSPath, - parseBoolean, - parseNumber, - prettierFormat, - writeTSFile, -} from './util' +import { getRelativeTSPath, parseBoolean, parseNumber, prettierFormat, rmdir, writeTSFile } from './util' import { INDEX_TEMPLATE } from './templates/index.template' import { ImportComponent } from './components/import.component' import * as prettier from 'prettier' @@ -57,6 +51,10 @@ export const PrismaClassGeneratorOptions = { desc: 'use nest js class-validator decorators', defaultValue: false, }, + rewrite: { + defaultValue: false, + desc: 'rewrite output at generate' + }, } as const export type PrismaClassGeneratorOptionsKeys = @@ -137,6 +135,8 @@ export class PrismaClassGenerator { const config = this.getConfig() this.setPrismaClientPath() + await rmdir(output, config.rewrite) + const convertor = PrismaConvertor.getInstance() convertor.dmmf = dmmf convertor.config = config diff --git a/src/util.ts b/src/util.ts index 9f44edc..2487ca9 100755 --- a/src/util.ts +++ b/src/util.ts @@ -89,3 +89,17 @@ export const writeTSFile = ( export const prettierFormat = (content: string, options: Options = {}) => { return format(content, { ...options, parser: 'typescript' }) } + +export const rmdir = async ( + dirPath: string, + rewrite: boolean = false, +) => { + if (fs.existsSync(dirPath) && rewrite) { + const deletePromises = fs.readdirSync(dirPath).map(async (file) => { + const filePath = path.join(dirPath, file) + log(`Remove ${filePath}`) + return fs.unlinkSync(filePath) + }) + await Promise.all(deletePromises) + } +} From 0363553bc73f1f40d0d27e8e594daed9d5d1c8b6 Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Sun, 25 Aug 2024 02:18:36 +0900 Subject: [PATCH 7/9] add option rewrite --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6cc5206..2f37ef6 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prisma-class-generator-custom", - "version": "1.2.2", + "version": "1.2.4", "description": "Class generator from Prisma schema", "main": "dist/index.js", "license": "MIT", From d6e7a3f2c786c6a8cd9662e08935919b276b4214 Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Thu, 29 Aug 2024 00:13:55 +0900 Subject: [PATCH 8/9] primitive array --- src/convertor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/convertor.ts b/src/convertor.ts index cc705d3..8d86395 100755 --- a/src/convertor.ts +++ b/src/convertor.ts @@ -199,7 +199,7 @@ export class PrismaConvertor { name = 'IsBoolean' break; } - if (name) { + if (name && !dmmfField.isList) { decorators.push(new DecoratorComponent({ name, importFrom })) } From 7e220ef9b0c523fcef0708a90076f5c83f904a57 Mon Sep 17 00:00:00 2001 From: LuffyAhn Date: Thu, 29 Aug 2024 00:16:48 +0900 Subject: [PATCH 9/9] primitive array --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f37ef6..2ddb679 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "prisma-class-generator-custom", - "version": "1.2.4", + "version": "1.2.5", "description": "Class generator from Prisma schema", "main": "dist/index.js", "license": "MIT",