arkos 1.4.1-canary.8 → 1.5.0-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/modules/auth/auth.controller.js +13 -0
- package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js +40 -14
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js +1 -1
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/cjs/modules/base/base.middlewares.js +6 -4
- package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
- package/dist/cjs/modules/base/utils/error-prettifier.js +185 -0
- package/dist/cjs/modules/base/utils/error-prettifier.js.map +1 -0
- package/dist/cjs/modules/email/email.service.js +4 -1
- package/dist/cjs/modules/email/email.service.js.map +1 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +9 -3
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +27 -9
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +28 -11
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
- package/dist/cjs/types/auth.js.map +1 -1
- package/dist/cjs/utils/arkos-router/index.js +7 -1
- package/dist/cjs/utils/arkos-router/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/types/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js +51 -0
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/cjs/utils/cli/generate.js +38 -0
- package/dist/cjs/utils/cli/generate.js.map +1 -1
- package/dist/cjs/utils/cli/index.js +37 -4
- package/dist/cjs/utils/cli/index.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js +70 -37
- package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +556 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +327 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generators.js +14 -8
- package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/cjs/utils/dynamic-loader.js +2 -2
- package/dist/cjs/utils/dynamic-loader.js.map +1 -1
- package/dist/cjs/utils/helpers/routers.helpers.js +2 -3
- package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +5 -5
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/modules/auth/auth.controller.js +13 -0
- package/dist/esm/modules/auth/auth.controller.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +40 -14
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/auth/utils/services/auth-action.service.js +1 -1
- package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +6 -4
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/base/utils/error-prettifier.js +181 -0
- package/dist/esm/modules/base/utils/error-prettifier.js.map +1 -0
- package/dist/esm/modules/email/email.service.js +4 -1
- package/dist/esm/modules/email/email.service.js.map +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +9 -3
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +27 -9
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +28 -11
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
- package/dist/esm/types/auth.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +8 -2
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +50 -0
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/cli/generate.js +38 -0
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +37 -4
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js +70 -37
- package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +549 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +320 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generators.js +14 -8
- package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/esm/utils/dynamic-loader.js +2 -2
- package/dist/esm/utils/dynamic-loader.js.map +1 -1
- package/dist/esm/utils/helpers/routers.helpers.js +2 -3
- package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +5 -5
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/types/modules/auth/auth.service.d.ts +5 -0
- package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +1 -1
- package/dist/types/modules/base/utils/error-prettifier.d.ts +19 -0
- package/dist/types/modules/email/email.service.d.ts +4 -8
- package/dist/types/types/auth.d.ts +3 -3
- package/dist/types/utils/arkos-router/index.d.ts +3 -1
- package/dist/types/utils/arkos-router/types/index.d.ts +2 -2
- package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +4 -0
- package/dist/types/utils/cli/generate.d.ts +4 -0
- package/dist/types/utils/cli/utils/template-generator/templates/auth-configs-template.d.ts +3 -1
- package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +18 -0
- package/dist/types/utils/cli/utils/template-generator/templates/zod-schema-generator.d.ts +14 -0
- package/dist/types/utils/helpers/routers.helpers.d.ts +1 -1
- package/package.json +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +0 -187
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +0 -181
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod/create-schema-template.js +0 -106
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod/create-schema-template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js +0 -104
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +0 -181
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +0 -175
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/zod/create-schema-template.js +0 -100
- package/dist/esm/utils/cli/utils/template-generator/templates/zod/create-schema-template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/zod/update-schema-template.js +0 -98
- package/dist/esm/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map +0 -1
- package/dist/types/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.d.ts +0 -2
- package/dist/types/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.d.ts +0 -2
- package/dist/types/utils/cli/utils/template-generator/templates/zod/create-schema-template.d.ts +0 -2
- package/dist/types/utils/cli/utils/template-generator/templates/zod/update-schema-template.d.ts +0 -2
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.generateUpdateSchemaTemplate = generateUpdateSchemaTemplate;
|
|
7
|
-
const prisma_schema_parser_1 = __importDefault(require("../../../../../prisma/prisma-schema-parser"));
|
|
8
|
-
const fs_helpers_1 = require("../../../../../helpers/fs.helpers");
|
|
9
|
-
function generateUpdateSchemaTemplate(options) {
|
|
10
|
-
const { modelName } = options;
|
|
11
|
-
if (!modelName)
|
|
12
|
-
throw new Error("Module name is required for update-schema template");
|
|
13
|
-
const model = prisma_schema_parser_1.default.models.find((m) => m.name.toLowerCase() === modelName.pascal.toLowerCase());
|
|
14
|
-
if (!model)
|
|
15
|
-
throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);
|
|
16
|
-
const ext = (0, fs_helpers_1.getUserFileExtension)();
|
|
17
|
-
const isTypeScript = ext === "ts";
|
|
18
|
-
const restrictedFields = ["id", "createdAt", "updatedAt", "deletedAt"];
|
|
19
|
-
const isUserModule = modelName.kebab === "user";
|
|
20
|
-
const enumsUsed = new Set();
|
|
21
|
-
let schemaFields = [];
|
|
22
|
-
for (const field of model.fields) {
|
|
23
|
-
const isForeignKey = model.fields.some((f) => f.foreignKeyField === field.name);
|
|
24
|
-
if (field.isId || restrictedFields.includes(field.name) || isForeignKey) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (field.isRelation) {
|
|
28
|
-
if (field.isArray)
|
|
29
|
-
continue;
|
|
30
|
-
const referencedModel = prisma_schema_parser_1.default.models.find((m) => m.name === field.type);
|
|
31
|
-
if (referencedModel) {
|
|
32
|
-
const refField = field.foreignReferenceField || "id";
|
|
33
|
-
const refFieldType = referencedModel.fields.find((f) => f.name === refField);
|
|
34
|
-
const zodType = mapPrismaTypeToZod(refFieldType?.type);
|
|
35
|
-
schemaFields.push(` ${field.name}: z.object({ ${refField}: ${zodType} }).optional()`);
|
|
36
|
-
}
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
if (prisma_schema_parser_1.default.isEnum(field.type)) {
|
|
40
|
-
enumsUsed.add(field.type);
|
|
41
|
-
}
|
|
42
|
-
const zodSchema = generateZodField(field, isUserModule);
|
|
43
|
-
schemaFields.push(` ${field.name}: ${zodSchema}`);
|
|
44
|
-
}
|
|
45
|
-
const enumImports = enumsUsed.size > 0
|
|
46
|
-
? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
|
|
47
|
-
: "";
|
|
48
|
-
const typeExport = isTypeScript
|
|
49
|
-
? `\nexport type Update${modelName.pascal}SchemaType = z.infer<typeof Update${modelName.pascal}Schema>;`
|
|
50
|
-
: "";
|
|
51
|
-
return `import { z } from "zod";
|
|
52
|
-
${enumImports}
|
|
53
|
-
const Update${modelName.pascal}Schema = z.object({
|
|
54
|
-
${schemaFields.join(",\n")}
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
${typeExport}
|
|
58
|
-
export default Update${modelName.pascal}Schema;
|
|
59
|
-
`;
|
|
60
|
-
}
|
|
61
|
-
function generateZodField(field, isUserModule) {
|
|
62
|
-
let zodType = mapPrismaTypeToZod(field.type);
|
|
63
|
-
if (field.isArray) {
|
|
64
|
-
zodType = `z.array(${zodType})`;
|
|
65
|
-
}
|
|
66
|
-
if (prisma_schema_parser_1.default.isEnum(field.type)) {
|
|
67
|
-
zodType = field.isArray
|
|
68
|
-
? `z.array(z.nativeEnum(${field.type}))`
|
|
69
|
-
: `z.nativeEnum(${field.type})`;
|
|
70
|
-
}
|
|
71
|
-
if (isUserModule) {
|
|
72
|
-
if (field.name === "email") {
|
|
73
|
-
zodType = `z.string().email()`;
|
|
74
|
-
}
|
|
75
|
-
else if (field.name === "password") {
|
|
76
|
-
zodType = `z.string().min(8).regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/, "Password must contain at least one uppercase letter, one lowercase letter, and one number")`;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
zodType += ".optional()";
|
|
80
|
-
return zodType;
|
|
81
|
-
}
|
|
82
|
-
function mapPrismaTypeToZod(prismaType) {
|
|
83
|
-
switch (prismaType) {
|
|
84
|
-
case "String":
|
|
85
|
-
return "z.string()";
|
|
86
|
-
case "Int":
|
|
87
|
-
case "Float":
|
|
88
|
-
case "Decimal":
|
|
89
|
-
return "z.number()";
|
|
90
|
-
case "Boolean":
|
|
91
|
-
return "z.boolean()";
|
|
92
|
-
case "DateTime":
|
|
93
|
-
return "z.date().or(z.string()).refine((val) => val instanceof Date || !isNaN(Date.parse(val)), 'Invalid date')";
|
|
94
|
-
case "Json":
|
|
95
|
-
return "z.any()";
|
|
96
|
-
case "Bytes":
|
|
97
|
-
return "z.instanceof(Buffer)";
|
|
98
|
-
case "BigInt":
|
|
99
|
-
return "z.bigint()";
|
|
100
|
-
default:
|
|
101
|
-
return "z.any()";
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=update-schema-template.js.map
|
package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-schema-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/zod/update-schema-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateUpdateSchemaTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for update-schema template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n\n let schemaFields: string[] = [];\n\n for (const field of model.fields) {\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n\n if (field.isId || restrictedFields.includes(field.name) || isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n const refField = field.foreignReferenceField || \"id\";\n const refFieldType = referencedModel.fields.find(\n (f) => f.name === refField\n );\n\n const zodType = mapPrismaTypeToZod(refFieldType?.type!);\n\n schemaFields.push(\n ` ${field.name}: z.object({ ${refField}: ${zodType} }).optional()`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const zodSchema = generateZodField(field, isUserModule);\n schemaFields.push(` ${field.name}: ${zodSchema}`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const typeExport = isTypeScript\n ? `\\nexport type Update${modelName.pascal}SchemaType = z.infer<typeof Update${modelName.pascal}Schema>;`\n : \"\";\n\n return `import { z } from \"zod\";\n${enumImports}\nconst Update${modelName.pascal}Schema = z.object({\n${schemaFields.join(\",\\n\")}\n});\n\n${typeExport}\nexport default Update${modelName.pascal}Schema;\n`;\n}\n\nfunction generateZodField(field: PrismaField, isUserModule: boolean): string {\n let zodType = mapPrismaTypeToZod(field.type);\n\n if (field.isArray) {\n zodType = `z.array(${zodType})`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n zodType = field.isArray\n ? `z.array(z.nativeEnum(${field.type}))`\n : `z.nativeEnum(${field.type})`;\n }\n\n if (isUserModule) {\n if (field.name === \"email\") {\n zodType = `z.string().email()`;\n } else if (field.name === \"password\") {\n zodType = `z.string().min(8).regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, \"Password must contain at least one uppercase letter, one lowercase letter, and one number\")`;\n }\n }\n\n zodType += \".optional()\";\n\n return zodType;\n}\n\nfunction mapPrismaTypeToZod(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"z.string()\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"z.number()\";\n case \"Boolean\":\n return \"z.boolean()\";\n case \"DateTime\":\n return \"z.date().or(z.string()).refine((val) => val instanceof Date || !isNaN(Date.parse(val)), 'Invalid date')\";\n case \"Json\":\n return \"z.any()\";\n case \"Bytes\":\n return \"z.instanceof(Buffer)\";\n case \"BigInt\":\n return \"z.bigint()\";\n default:\n return \"z.any()\";\n }\n}\n"]}
|
package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import prismaSchemaParser from "../../../../../prisma/prisma-schema-parser.js";
|
|
2
|
-
import { getUserFileExtension } from "../../../../../helpers/fs.helpers.js";
|
|
3
|
-
export function generateCreateDtoTemplate(options) {
|
|
4
|
-
const { modelName } = options;
|
|
5
|
-
if (!modelName)
|
|
6
|
-
throw new Error("Module name is required for create-dto template");
|
|
7
|
-
const model = prismaSchemaParser.models.find((m) => m.name.toLowerCase() === modelName.pascal.toLowerCase());
|
|
8
|
-
if (!model)
|
|
9
|
-
throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);
|
|
10
|
-
const ext = getUserFileExtension();
|
|
11
|
-
const isTypeScript = ext === "ts";
|
|
12
|
-
const restrictedFields = ["id", "createdAt", "updatedAt", "deletedAt"];
|
|
13
|
-
const isUserModule = modelName.kebab === "user";
|
|
14
|
-
const enumsUsed = new Set();
|
|
15
|
-
const validatorsUsed = new Set();
|
|
16
|
-
const transformersUsed = new Set();
|
|
17
|
-
const nestedDtoClasses = [];
|
|
18
|
-
let dtoFields = [];
|
|
19
|
-
for (const field of model.fields) {
|
|
20
|
-
if (field.isId || restrictedFields.includes(field.name)) {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
const isForeignKey = model.fields.some((f) => f.foreignKeyField === field.name);
|
|
24
|
-
if (isForeignKey) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (field.isRelation) {
|
|
28
|
-
if (field.isArray)
|
|
29
|
-
continue;
|
|
30
|
-
const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
|
|
31
|
-
if (referencedModel) {
|
|
32
|
-
const isOptional = field.isOptional || field.defaultValue !== undefined;
|
|
33
|
-
const optionalDecorator = isOptional ? " @IsOptional()\n" : "";
|
|
34
|
-
const typeModifier = isTypeScript ? (isOptional ? "?" : "!") : "";
|
|
35
|
-
validatorsUsed.add("IsOptional");
|
|
36
|
-
validatorsUsed.add("ValidateNested");
|
|
37
|
-
transformersUsed.add("Type");
|
|
38
|
-
const relationDtoName = `${referencedModel.name}ForCreate${modelName.pascal}Dto`;
|
|
39
|
-
const nestedDtoClass = generateNestedDtoClass(field, referencedModel, relationDtoName, validatorsUsed, enumsUsed, isTypeScript);
|
|
40
|
-
nestedDtoClasses.push(nestedDtoClass);
|
|
41
|
-
dtoFields.push(`${optionalDecorator} @ValidateNested()\n @Type(() => ${relationDtoName})\n ${field.name}${typeModifier}: ${relationDtoName};`);
|
|
42
|
-
}
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
if (prismaSchemaParser.isEnum(field.type)) {
|
|
46
|
-
enumsUsed.add(field.type);
|
|
47
|
-
}
|
|
48
|
-
const { decorators, type } = generateClassValidatorField(field, isUserModule, validatorsUsed);
|
|
49
|
-
const isOptional = field.isOptional || field.defaultValue !== undefined;
|
|
50
|
-
const typeModifier = isTypeScript ? (isOptional ? "?" : "!") : "";
|
|
51
|
-
dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);
|
|
52
|
-
}
|
|
53
|
-
const enumImports = enumsUsed.size > 0
|
|
54
|
-
? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
|
|
55
|
-
: "";
|
|
56
|
-
const validatorImports = validatorsUsed.size > 0
|
|
57
|
-
? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
|
|
58
|
-
: "";
|
|
59
|
-
const transformerImports = transformersUsed.size > 0
|
|
60
|
-
? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
|
|
61
|
-
: "";
|
|
62
|
-
const nestedDtoSection = nestedDtoClasses.length > 0 ? `\n${nestedDtoClasses.join("\n\n")}\n` : "";
|
|
63
|
-
return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}
|
|
64
|
-
export default class Create${modelName.pascal}Dto {
|
|
65
|
-
${dtoFields.join("\n\n")}
|
|
66
|
-
}`;
|
|
67
|
-
}
|
|
68
|
-
function generateNestedDtoClass(field, referencedModel, dtoName, validatorsUsed, enumsUsed, isTypeScript) {
|
|
69
|
-
const fields = [];
|
|
70
|
-
const refFieldName = field.foreignReferenceField || "id";
|
|
71
|
-
const refFieldAsPrismaField = referencedModel.fields.find((f) => f.name === refFieldName);
|
|
72
|
-
if (refFieldAsPrismaField) {
|
|
73
|
-
if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))
|
|
74
|
-
enumsUsed.add(refFieldAsPrismaField.type);
|
|
75
|
-
const { decorators, type } = generateClassValidatorField(refFieldAsPrismaField, false, validatorsUsed);
|
|
76
|
-
const typeModifier = isTypeScript ? "!" : "";
|
|
77
|
-
fields.push(`${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`);
|
|
78
|
-
}
|
|
79
|
-
return `class ${dtoName} {
|
|
80
|
-
${fields.join("\n\n")}
|
|
81
|
-
}`;
|
|
82
|
-
}
|
|
83
|
-
function generateClassValidatorField(field, isUserModule, validatorsUsed) {
|
|
84
|
-
let decorators = [];
|
|
85
|
-
let type = mapPrismaTypeToTS(field.type);
|
|
86
|
-
const isOptional = field.isOptional || field.defaultValue !== undefined;
|
|
87
|
-
if (isOptional) {
|
|
88
|
-
decorators.push("@IsOptional()");
|
|
89
|
-
validatorsUsed.add("IsOptional");
|
|
90
|
-
}
|
|
91
|
-
if (field.isArray) {
|
|
92
|
-
decorators.push("@IsArray()");
|
|
93
|
-
validatorsUsed.add("IsArray");
|
|
94
|
-
type = `${type}[]`;
|
|
95
|
-
}
|
|
96
|
-
if (prismaSchemaParser.isEnum(field.type)) {
|
|
97
|
-
decorators.push(`@IsEnum(${field.type}${field.isArray ? ", { each: true }" : ""})`);
|
|
98
|
-
validatorsUsed.add("IsEnum");
|
|
99
|
-
type = field.isArray ? `${field.type}[]` : field.type;
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
const fieldValidators = getValidatorsForType(field, isUserModule);
|
|
103
|
-
decorators.push(...fieldValidators);
|
|
104
|
-
fieldValidators.forEach((decorator) => {
|
|
105
|
-
const validatorName = decorator.match(/@(\w+)/)?.[1];
|
|
106
|
-
if (validatorName)
|
|
107
|
-
validatorsUsed.add(validatorName);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
return {
|
|
111
|
-
decorators: decorators.map((d) => ` ${d}`).join("\n") +
|
|
112
|
-
(decorators.length > 0 ? "\n" : ""),
|
|
113
|
-
type,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
function getValidatorsForType(field, isUserModule) {
|
|
117
|
-
const validators = [];
|
|
118
|
-
const arrayEach = field.isArray ? "{ each: true }" : "";
|
|
119
|
-
if (isUserModule) {
|
|
120
|
-
if (field.name === "email") {
|
|
121
|
-
return ["@IsEmail()"];
|
|
122
|
-
}
|
|
123
|
-
else if (field.name === "password") {
|
|
124
|
-
return [
|
|
125
|
-
"@IsString()",
|
|
126
|
-
"@MinLength(8)",
|
|
127
|
-
'@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/, { message: "Password must contain at least one uppercase letter, one lowercase letter, and one number" })',
|
|
128
|
-
];
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
switch (field.type) {
|
|
132
|
-
case "String":
|
|
133
|
-
validators.push(`@IsString(${arrayEach})`);
|
|
134
|
-
break;
|
|
135
|
-
case "Int":
|
|
136
|
-
case "Float":
|
|
137
|
-
case "Decimal":
|
|
138
|
-
validators.push(`@IsNumber(${arrayEach})`);
|
|
139
|
-
break;
|
|
140
|
-
case "Boolean":
|
|
141
|
-
validators.push(`@IsBoolean(${arrayEach})`);
|
|
142
|
-
break;
|
|
143
|
-
case "DateTime":
|
|
144
|
-
validators.push(`@IsDate(${arrayEach})`);
|
|
145
|
-
break;
|
|
146
|
-
case "BigInt":
|
|
147
|
-
validators.push(`@IsNumber(${arrayEach})`);
|
|
148
|
-
break;
|
|
149
|
-
case "Json":
|
|
150
|
-
validators.push(`@IsObject(${arrayEach})`);
|
|
151
|
-
break;
|
|
152
|
-
case "Bytes":
|
|
153
|
-
break;
|
|
154
|
-
default:
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
return validators;
|
|
158
|
-
}
|
|
159
|
-
function mapPrismaTypeToTS(prismaType) {
|
|
160
|
-
switch (prismaType) {
|
|
161
|
-
case "String":
|
|
162
|
-
return "string";
|
|
163
|
-
case "Int":
|
|
164
|
-
case "Float":
|
|
165
|
-
case "Decimal":
|
|
166
|
-
return "number";
|
|
167
|
-
case "Boolean":
|
|
168
|
-
return "boolean";
|
|
169
|
-
case "DateTime":
|
|
170
|
-
return "Date";
|
|
171
|
-
case "Json":
|
|
172
|
-
return "any";
|
|
173
|
-
case "Bytes":
|
|
174
|
-
return "Buffer";
|
|
175
|
-
case "BigInt":
|
|
176
|
-
return "bigint";
|
|
177
|
-
default:
|
|
178
|
-
return prismaSchemaParser.isEnum(prismaType) ? prismaType : "any";
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=create-dto-template.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-dto-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField, PrismaModel } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateCreateDtoTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for create-dto template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n const validatorsUsed = new Set<string>();\n const transformersUsed = new Set<string>();\n const nestedDtoClasses: string[] = [];\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n if (field.isId || restrictedFields.includes(field.name)) {\n continue;\n }\n\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n if (isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n const optionalDecorator = isOptional ? \" @IsOptional()\\n\" : \"\";\n const typeModifier = isTypeScript ? (isOptional ? \"?\" : \"!\") : \"\";\n\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n transformersUsed.add(\"Type\");\n\n const relationDtoName = `${referencedModel.name}ForCreate${modelName.pascal}Dto`;\n\n // Generate the nested DTO class inline\n const nestedDtoClass = generateNestedDtoClass(\n field,\n referencedModel,\n relationDtoName,\n validatorsUsed,\n enumsUsed,\n isTypeScript\n );\n nestedDtoClasses.push(nestedDtoClass);\n\n dtoFields.push(\n `${optionalDecorator} @ValidateNested()\\n @Type(() => ${relationDtoName})\\n ${field.name}${typeModifier}: ${relationDtoName};`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n const typeModifier = isTypeScript ? (isOptional ? \"?\" : \"!\") : \"\";\n dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const validatorImports =\n validatorsUsed.size > 0\n ? `import { ${Array.from(validatorsUsed).join(\", \")} } from \"class-validator\";\\n`\n : \"\";\n\n const transformerImports =\n transformersUsed.size > 0\n ? `import { ${Array.from(transformersUsed).join(\", \")} } from \"class-transformer\";\\n`\n : \"\";\n\n const nestedDtoSection =\n nestedDtoClasses.length > 0 ? `\\n${nestedDtoClasses.join(\"\\n\\n\")}\\n` : \"\";\n\n return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}\nexport default class Create${modelName.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateNestedDtoClass(\n field: PrismaField,\n referencedModel: PrismaModel,\n dtoName: string,\n validatorsUsed: Set<string>,\n enumsUsed: Set<string>,\n isTypeScript: boolean\n): string {\n const fields: string[] = [];\n\n const refFieldName = field.foreignReferenceField || \"id\";\n const refFieldAsPrismaField = referencedModel.fields.find(\n (f) => f.name === refFieldName\n );\n\n if (refFieldAsPrismaField) {\n if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))\n enumsUsed.add(refFieldAsPrismaField.type);\n\n const { decorators, type } = generateClassValidatorField(\n refFieldAsPrismaField,\n false,\n validatorsUsed\n );\n const typeModifier = isTypeScript ? \"!\" : \"\";\n fields.push(\n `${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`\n );\n }\n\n return `class ${dtoName} {\n${fields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = mapPrismaTypeToTS(field.type);\n\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n if (isOptional) {\n decorators.push(\"@IsOptional()\");\n validatorsUsed.add(\"IsOptional\");\n }\n\n if (field.isArray) {\n decorators.push(\"@IsArray()\");\n validatorsUsed.add(\"IsArray\");\n type = `${type}[]`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n decorators.push(\n `@IsEnum(${field.type}${field.isArray ? \", { each: true }\" : \"\"})`\n );\n validatorsUsed.add(\"IsEnum\");\n type = field.isArray ? `${field.type}[]` : field.type;\n } else {\n const fieldValidators = getValidatorsForType(field, isUserModule);\n decorators.push(...fieldValidators);\n fieldValidators.forEach((decorator) => {\n const validatorName = decorator.match(/@(\\w+)/)?.[1];\n if (validatorName) validatorsUsed.add(validatorName);\n });\n }\n\n return {\n decorators:\n decorators.map((d) => ` ${d}`).join(\"\\n\") +\n (decorators.length > 0 ? \"\\n\" : \"\"),\n type,\n };\n}\n\nfunction getValidatorsForType(\n field: PrismaField,\n isUserModule: boolean\n): string[] {\n const validators: string[] = [];\n const arrayEach = field.isArray ? \"{ each: true }\" : \"\";\n\n // User module special cases - return early to override default validators\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"]; // Only IsEmail, no IsString\n } else if (field.name === \"password\") {\n return [\n \"@IsString()\",\n \"@MinLength(8)\",\n '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, { message: \"Password must contain at least one uppercase letter, one lowercase letter, and one number\" })',\n ];\n }\n }\n\n switch (field.type) {\n case \"String\":\n validators.push(`@IsString(${arrayEach})`);\n break;\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n validators.push(`@IsNumber(${arrayEach})`);\n break;\n case \"Boolean\":\n validators.push(`@IsBoolean(${arrayEach})`);\n break;\n case \"DateTime\":\n validators.push(`@IsDate(${arrayEach})`);\n break;\n case \"BigInt\":\n validators.push(`@IsNumber(${arrayEach})`);\n break;\n case \"Json\":\n validators.push(`@IsObject(${arrayEach})`);\n break;\n case \"Bytes\":\n break;\n default:\n break;\n }\n\n return validators;\n}\n\nfunction mapPrismaTypeToTS(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"string\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n case \"Json\":\n return \"any\";\n case \"Bytes\":\n return \"Buffer\";\n case \"BigInt\":\n return \"bigint\";\n default:\n // For enums and unknown types, return as any\n return prismaSchemaParser.isEnum(prismaType) ? prismaType : \"any\";\n }\n}\n"]}
|
package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import prismaSchemaParser from "../../../../../prisma/prisma-schema-parser.js";
|
|
2
|
-
import { getUserFileExtension } from "../../../../../helpers/fs.helpers.js";
|
|
3
|
-
export function generateUpdateDtoTemplate(options) {
|
|
4
|
-
const { modelName } = options;
|
|
5
|
-
if (!modelName)
|
|
6
|
-
throw new Error("Module name is required for update-dto template");
|
|
7
|
-
const model = prismaSchemaParser.models.find((m) => m.name.toLowerCase() === modelName.pascal.toLowerCase());
|
|
8
|
-
if (!model)
|
|
9
|
-
throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);
|
|
10
|
-
const ext = getUserFileExtension();
|
|
11
|
-
const isTypeScript = ext === "ts";
|
|
12
|
-
const restrictedFields = ["id", "createdAt", "updatedAt", "deletedAt"];
|
|
13
|
-
const isUserModule = modelName.kebab === "user";
|
|
14
|
-
const enumsUsed = new Set();
|
|
15
|
-
const validatorsUsed = new Set();
|
|
16
|
-
const transformersUsed = new Set();
|
|
17
|
-
const nestedDtoClasses = [];
|
|
18
|
-
let dtoFields = [];
|
|
19
|
-
for (const field of model.fields) {
|
|
20
|
-
if (field.isId || restrictedFields.includes(field.name)) {
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
const isForeignKey = model.fields.some((f) => f.foreignKeyField === field.name);
|
|
24
|
-
if (isForeignKey) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (field.isRelation) {
|
|
28
|
-
if (field.isArray)
|
|
29
|
-
continue;
|
|
30
|
-
const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
|
|
31
|
-
if (referencedModel) {
|
|
32
|
-
validatorsUsed.add("IsOptional");
|
|
33
|
-
validatorsUsed.add("ValidateNested");
|
|
34
|
-
transformersUsed.add("Type");
|
|
35
|
-
const relationDtoName = `${referencedModel.name}ForUpdate${modelName.pascal}Dto`;
|
|
36
|
-
const nestedDtoClass = generateNestedDtoClass(field, referencedModel, relationDtoName, validatorsUsed, enumsUsed, isTypeScript);
|
|
37
|
-
nestedDtoClasses.push(nestedDtoClass);
|
|
38
|
-
const typeModifier = isTypeScript ? "?" : "";
|
|
39
|
-
dtoFields.push(` @IsOptional()\n @ValidateNested()\n @Type(() => ${relationDtoName})\n ${field.name}${typeModifier}: ${relationDtoName};`);
|
|
40
|
-
}
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
if (prismaSchemaParser.isEnum(field.type)) {
|
|
44
|
-
enumsUsed.add(field.type);
|
|
45
|
-
}
|
|
46
|
-
const { decorators, type } = generateClassValidatorField(field, isUserModule, validatorsUsed);
|
|
47
|
-
const typeModifier = isTypeScript ? "?" : "";
|
|
48
|
-
dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);
|
|
49
|
-
}
|
|
50
|
-
const enumImports = enumsUsed.size > 0
|
|
51
|
-
? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
|
|
52
|
-
: "";
|
|
53
|
-
const validatorImports = validatorsUsed.size > 0
|
|
54
|
-
? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
|
|
55
|
-
: "";
|
|
56
|
-
const transformerImports = transformersUsed.size > 0
|
|
57
|
-
? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
|
|
58
|
-
: "";
|
|
59
|
-
const nestedDtoSection = nestedDtoClasses.length > 0 ? `\n${nestedDtoClasses.join("\n\n")}\n` : "";
|
|
60
|
-
return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}
|
|
61
|
-
export default class Update${modelName.pascal}Dto {
|
|
62
|
-
${dtoFields.join("\n\n")}
|
|
63
|
-
}`;
|
|
64
|
-
}
|
|
65
|
-
function generateNestedDtoClass(field, referencedModel, dtoName, validatorsUsed, enumsUsed, isTypeScript) {
|
|
66
|
-
const fields = [];
|
|
67
|
-
const refFieldName = field.foreignReferenceField || "id";
|
|
68
|
-
const refFieldAsPrismaField = referencedModel.fields.find((f) => f.name === refFieldName);
|
|
69
|
-
if (refFieldAsPrismaField) {
|
|
70
|
-
if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))
|
|
71
|
-
enumsUsed.add(refFieldAsPrismaField.type);
|
|
72
|
-
const { decorators, type } = generateClassValidatorField(refFieldAsPrismaField, false, validatorsUsed);
|
|
73
|
-
const typeModifier = isTypeScript ? "!" : "";
|
|
74
|
-
fields.push(`${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`);
|
|
75
|
-
}
|
|
76
|
-
return `class ${dtoName} {
|
|
77
|
-
${fields.join("\n\n")}
|
|
78
|
-
}`;
|
|
79
|
-
}
|
|
80
|
-
function generateClassValidatorField(field, isUserModule, validatorsUsed) {
|
|
81
|
-
let decorators = [];
|
|
82
|
-
let type = mapPrismaTypeToTS(field.type);
|
|
83
|
-
decorators.push("@IsOptional()");
|
|
84
|
-
validatorsUsed.add("IsOptional");
|
|
85
|
-
if (field.isArray) {
|
|
86
|
-
decorators.push("@IsArray()");
|
|
87
|
-
validatorsUsed.add("IsArray");
|
|
88
|
-
type = `${type}[]`;
|
|
89
|
-
}
|
|
90
|
-
if (prismaSchemaParser.isEnum(field.type)) {
|
|
91
|
-
decorators.push(`@IsEnum(${field.type}${field.isArray ? ", { each: true }" : ""})`);
|
|
92
|
-
validatorsUsed.add("IsEnum");
|
|
93
|
-
type = field.isArray ? `${field.type}[]` : field.type;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
const fieldValidators = getValidatorsForType(field, isUserModule);
|
|
97
|
-
decorators.push(...fieldValidators);
|
|
98
|
-
fieldValidators.forEach((decorator) => {
|
|
99
|
-
const validatorName = decorator.match(/@(\w+)/)?.[1];
|
|
100
|
-
if (validatorName)
|
|
101
|
-
validatorsUsed.add(validatorName);
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
decorators: decorators.map((d) => ` ${d}`).join("\n") +
|
|
106
|
-
(decorators.length > 0 ? "\n" : ""),
|
|
107
|
-
type,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
function getValidatorsForType(field, isUserModule) {
|
|
111
|
-
const validators = [];
|
|
112
|
-
const arrayEach = field.isArray ? "{ each: true }" : "";
|
|
113
|
-
if (isUserModule) {
|
|
114
|
-
if (field.name === "email") {
|
|
115
|
-
return ["@IsEmail()"];
|
|
116
|
-
}
|
|
117
|
-
else if (field.name === "password") {
|
|
118
|
-
return [
|
|
119
|
-
"@IsString()",
|
|
120
|
-
"@MinLength(8)",
|
|
121
|
-
'@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/, { message: "Password must contain at least one uppercase letter, one lowercase letter, and one number" })',
|
|
122
|
-
];
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
switch (field.type) {
|
|
126
|
-
case "String":
|
|
127
|
-
validators.push(`@IsString(${arrayEach})`);
|
|
128
|
-
break;
|
|
129
|
-
case "Int":
|
|
130
|
-
case "Float":
|
|
131
|
-
case "Decimal":
|
|
132
|
-
validators.push(`@IsNumber(${arrayEach})`);
|
|
133
|
-
break;
|
|
134
|
-
case "Boolean":
|
|
135
|
-
validators.push(`@IsBoolean(${arrayEach})`);
|
|
136
|
-
break;
|
|
137
|
-
case "DateTime":
|
|
138
|
-
validators.push(`@IsDate(${arrayEach})`);
|
|
139
|
-
break;
|
|
140
|
-
case "BigInt":
|
|
141
|
-
validators.push(`@IsNumber(${arrayEach})`);
|
|
142
|
-
break;
|
|
143
|
-
case "Json":
|
|
144
|
-
validators.push(`@IsObject(${arrayEach})`);
|
|
145
|
-
break;
|
|
146
|
-
case "Bytes":
|
|
147
|
-
break;
|
|
148
|
-
default:
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
return validators;
|
|
152
|
-
}
|
|
153
|
-
function mapPrismaTypeToTS(prismaType) {
|
|
154
|
-
switch (prismaType) {
|
|
155
|
-
case "String":
|
|
156
|
-
return "string";
|
|
157
|
-
case "Int":
|
|
158
|
-
case "Float":
|
|
159
|
-
case "Decimal":
|
|
160
|
-
return "number";
|
|
161
|
-
case "Boolean":
|
|
162
|
-
return "boolean";
|
|
163
|
-
case "DateTime":
|
|
164
|
-
return "Date";
|
|
165
|
-
case "Json":
|
|
166
|
-
return "any";
|
|
167
|
-
case "Bytes":
|
|
168
|
-
return "Buffer";
|
|
169
|
-
case "BigInt":
|
|
170
|
-
return "bigint";
|
|
171
|
-
default:
|
|
172
|
-
return prismaSchemaParser.isEnum(prismaType) ? prismaType : "any";
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
//# sourceMappingURL=update-dto-template.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-dto-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField, PrismaModel } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateUpdateDtoTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for update-dto template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n const validatorsUsed = new Set<string>();\n const transformersUsed = new Set<string>();\n const nestedDtoClasses: string[] = [];\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n if (field.isId || restrictedFields.includes(field.name)) {\n continue;\n }\n\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n if (isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n // ALL relations are optional in update DTO\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n transformersUsed.add(\"Type\");\n\n const relationDtoName = `${referencedModel.name}ForUpdate${modelName.pascal}Dto`;\n\n // Generate the nested DTO class inline\n const nestedDtoClass = generateNestedDtoClass(\n field,\n referencedModel,\n relationDtoName,\n validatorsUsed,\n enumsUsed,\n isTypeScript\n );\n nestedDtoClasses.push(nestedDtoClass);\n\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(\n ` @IsOptional()\\n @ValidateNested()\\n @Type(() => ${relationDtoName})\\n ${field.name}${typeModifier}: ${relationDtoName};`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n // ALL fields are optional in update DTO\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const validatorImports =\n validatorsUsed.size > 0\n ? `import { ${Array.from(validatorsUsed).join(\", \")} } from \"class-validator\";\\n`\n : \"\";\n\n const transformerImports =\n transformersUsed.size > 0\n ? `import { ${Array.from(transformersUsed).join(\", \")} } from \"class-transformer\";\\n`\n : \"\";\n\n const nestedDtoSection =\n nestedDtoClasses.length > 0 ? `\\n${nestedDtoClasses.join(\"\\n\\n\")}\\n` : \"\";\n\n return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}\nexport default class Update${modelName.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateNestedDtoClass(\n field: PrismaField,\n referencedModel: PrismaModel,\n dtoName: string,\n validatorsUsed: Set<string>,\n enumsUsed: Set<string>,\n isTypeScript: boolean\n): string {\n const fields: string[] = [];\n\n const refFieldName = field.foreignReferenceField || \"id\";\n const refFieldAsPrismaField = referencedModel.fields.find(\n (f) => f.name === refFieldName\n );\n\n if (refFieldAsPrismaField) {\n if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))\n enumsUsed.add(refFieldAsPrismaField.type);\n\n const { decorators, type } = generateClassValidatorField(\n refFieldAsPrismaField,\n false,\n validatorsUsed\n );\n const typeModifier = isTypeScript ? \"!\" : \"\";\n fields.push(\n `${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`\n );\n }\n\n return `class ${dtoName} {\n${fields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = mapPrismaTypeToTS(field.type);\n\n // ALL fields in update DTO are optional\n decorators.push(\"@IsOptional()\");\n validatorsUsed.add(\"IsOptional\");\n\n if (field.isArray) {\n decorators.push(\"@IsArray()\");\n validatorsUsed.add(\"IsArray\");\n type = `${type}[]`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n decorators.push(\n `@IsEnum(${field.type}${field.isArray ? \", { each: true }\" : \"\"})`\n );\n validatorsUsed.add(\"IsEnum\");\n type = field.isArray ? `${field.type}[]` : field.type;\n } else {\n const fieldValidators = getValidatorsForType(field, isUserModule);\n decorators.push(...fieldValidators);\n fieldValidators.forEach((decorator) => {\n const validatorName = decorator.match(/@(\\w+)/)?.[1];\n if (validatorName) validatorsUsed.add(validatorName);\n });\n }\n\n return {\n decorators:\n decorators.map((d) => ` ${d}`).join(\"\\n\") +\n (decorators.length > 0 ? \"\\n\" : \"\"),\n type,\n };\n}\n\nfunction getValidatorsForType(\n field: PrismaField,\n isUserModule: boolean\n): string[] {\n const validators: string[] = [];\n const arrayEach = field.isArray ? \"{ each: true }\" : \"\";\n\n // User module special cases - keep validations even though optional\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"]; // Only IsEmail, no IsString\n } else if (field.name === \"password\") {\n return [\n \"@IsString()\",\n \"@MinLength(8)\",\n '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, { message: \"Password must contain at least one uppercase letter, one lowercase letter, and one number\" })',\n ];\n }\n }\n\n switch (field.type) {\n case \"String\":\n validators.push(`@IsString(${arrayEach})`);\n break;\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n validators.push(`@IsNumber(${arrayEach})`);\n break;\n case \"Boolean\":\n validators.push(`@IsBoolean(${arrayEach})`);\n break;\n case \"DateTime\":\n validators.push(`@IsDate(${arrayEach})`);\n break;\n case \"BigInt\":\n validators.push(`@IsNumber(${arrayEach})`);\n break;\n case \"Json\":\n validators.push(`@IsObject(${arrayEach})`);\n break;\n case \"Bytes\":\n break;\n default:\n break;\n }\n\n return validators;\n}\n\nfunction mapPrismaTypeToTS(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"string\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n case \"Json\":\n return \"any\";\n case \"Bytes\":\n return \"Buffer\";\n case \"BigInt\":\n return \"bigint\";\n default:\n // For enums and unknown types, return as any\n return prismaSchemaParser.isEnum(prismaType) ? prismaType : \"any\";\n }\n}\n"]}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import prismaSchemaParser from "../../../../../prisma/prisma-schema-parser.js";
|
|
2
|
-
import { getUserFileExtension } from "../../../../../helpers/fs.helpers.js";
|
|
3
|
-
export function generateCreateSchemaTemplate(options) {
|
|
4
|
-
const { modelName } = options;
|
|
5
|
-
if (!modelName)
|
|
6
|
-
throw new Error("Module name is required for create-schema template");
|
|
7
|
-
const model = prismaSchemaParser.models.find((m) => m.name.toLowerCase() === modelName.pascal.toLowerCase());
|
|
8
|
-
if (!model)
|
|
9
|
-
throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);
|
|
10
|
-
const ext = getUserFileExtension();
|
|
11
|
-
const isTypeScript = ext === "ts";
|
|
12
|
-
const restrictedFields = ["id", "createdAt", "updatedAt", "deletedAt"];
|
|
13
|
-
const isUserModule = modelName.kebab === "user";
|
|
14
|
-
const enumsUsed = new Set();
|
|
15
|
-
let schemaFields = [];
|
|
16
|
-
for (const field of model.fields) {
|
|
17
|
-
const isForeignKey = model.fields.some((f) => f.foreignKeyField === field.name);
|
|
18
|
-
if (field.isId || restrictedFields.includes(field.name) || isForeignKey)
|
|
19
|
-
continue;
|
|
20
|
-
if (field.isRelation) {
|
|
21
|
-
if (field.isArray)
|
|
22
|
-
continue;
|
|
23
|
-
const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
|
|
24
|
-
if (referencedModel) {
|
|
25
|
-
const refField = field.foreignReferenceField || "id";
|
|
26
|
-
const refFieldType = referencedModel.fields.find((f) => f.name === refField);
|
|
27
|
-
const zodType = mapPrismaTypeToZod(refFieldType?.type);
|
|
28
|
-
const isOptional = field.isOptional || field.defaultValue !== undefined;
|
|
29
|
-
schemaFields.push(` ${field.name}: z.object({ ${refField}: ${zodType} })${isOptional ? ".optional()" : ""}`);
|
|
30
|
-
}
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
if (prismaSchemaParser.isEnum(field.type))
|
|
34
|
-
enumsUsed.add(field.type);
|
|
35
|
-
const zodSchema = generateZodField(field, isUserModule);
|
|
36
|
-
schemaFields.push(` ${field.name}: ${zodSchema}`);
|
|
37
|
-
}
|
|
38
|
-
const enumImports = enumsUsed.size > 0
|
|
39
|
-
? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
|
|
40
|
-
: "";
|
|
41
|
-
const typeExport = isTypeScript
|
|
42
|
-
? `\nexport type Create${modelName.pascal}SchemaType = z.infer<typeof Create${modelName.pascal}Schema>;`
|
|
43
|
-
: "";
|
|
44
|
-
return `import { z } from "zod";
|
|
45
|
-
${enumImports}
|
|
46
|
-
const Create${modelName.pascal}Schema = z.object({
|
|
47
|
-
${schemaFields.join(",\n")}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
${typeExport}
|
|
51
|
-
export default Create${modelName.pascal}Schema;
|
|
52
|
-
`;
|
|
53
|
-
}
|
|
54
|
-
function generateZodField(field, isUserModule) {
|
|
55
|
-
let zodType = mapPrismaTypeToZod(field.type);
|
|
56
|
-
if (field.isArray) {
|
|
57
|
-
zodType = `z.array(${zodType})`;
|
|
58
|
-
}
|
|
59
|
-
if (prismaSchemaParser.isEnum(field.type)) {
|
|
60
|
-
zodType = field.isArray
|
|
61
|
-
? `z.array(z.nativeEnum(${field.type}))`
|
|
62
|
-
: `z.nativeEnum(${field.type})`;
|
|
63
|
-
}
|
|
64
|
-
if (isUserModule) {
|
|
65
|
-
if (field.name === "email") {
|
|
66
|
-
zodType = `z.string().email()`;
|
|
67
|
-
}
|
|
68
|
-
else if (field.name === "password") {
|
|
69
|
-
zodType = `z.string().min(8).regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/, "Password must contain at least one uppercase letter, one lowercase letter, and one number")`;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
const isOptional = field.isOptional || field.defaultValue !== undefined;
|
|
73
|
-
if (isOptional) {
|
|
74
|
-
zodType += ".optional()";
|
|
75
|
-
}
|
|
76
|
-
return zodType;
|
|
77
|
-
}
|
|
78
|
-
function mapPrismaTypeToZod(prismaType) {
|
|
79
|
-
switch (prismaType) {
|
|
80
|
-
case "String":
|
|
81
|
-
return "z.string()";
|
|
82
|
-
case "Int":
|
|
83
|
-
case "Float":
|
|
84
|
-
case "Decimal":
|
|
85
|
-
return "z.number()";
|
|
86
|
-
case "Boolean":
|
|
87
|
-
return "z.boolean()";
|
|
88
|
-
case "DateTime":
|
|
89
|
-
return "z.date().or(z.string()).refine((val) => val instanceof Date || !isNaN(Date.parse(val)), 'Invalid date')";
|
|
90
|
-
case "Json":
|
|
91
|
-
return "z.any()";
|
|
92
|
-
case "Bytes":
|
|
93
|
-
return "z.instanceof(Buffer)";
|
|
94
|
-
case "BigInt":
|
|
95
|
-
return "z.bigint()";
|
|
96
|
-
default:
|
|
97
|
-
return "z.any()";
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=create-schema-template.js.map
|