arkos 1.4.1-canary.7 → 1.5.0-canary.1

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.
Files changed (118) hide show
  1. package/dist/cjs/modules/auth/auth.controller.js +13 -0
  2. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  3. package/dist/cjs/modules/auth/auth.service.js +40 -14
  4. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  5. package/dist/cjs/modules/auth/utils/services/auth-action.service.js +1 -1
  6. package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -1
  7. package/dist/cjs/modules/base/base.middlewares.js +6 -4
  8. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  9. package/dist/cjs/modules/base/utils/error-prettifier.js +185 -0
  10. package/dist/cjs/modules/base/utils/error-prettifier.js.map +1 -0
  11. package/dist/cjs/modules/email/email.service.js +4 -1
  12. package/dist/cjs/modules/email/email.service.js.map +1 -1
  13. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  14. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +9 -3
  15. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  16. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
  17. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
  18. package/dist/cjs/types/auth.js.map +1 -1
  19. package/dist/cjs/utils/arkos-router/index.js +7 -1
  20. package/dist/cjs/utils/arkos-router/index.js.map +1 -1
  21. package/dist/cjs/utils/arkos-router/types/index.js.map +1 -1
  22. package/dist/cjs/utils/arkos-router/utils/helpers/index.js +51 -0
  23. package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +1 -1
  24. package/dist/cjs/utils/cli/generate.js +38 -0
  25. package/dist/cjs/utils/cli/generate.js.map +1 -1
  26. package/dist/cjs/utils/cli/index.js +37 -4
  27. package/dist/cjs/utils/cli/index.js.map +1 -1
  28. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  29. package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js +70 -37
  30. package/dist/cjs/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
  31. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +556 -0
  32. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -0
  33. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +327 -0
  34. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -0
  35. package/dist/cjs/utils/cli/utils/template-generators.js +14 -8
  36. package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
  37. package/dist/cjs/utils/dynamic-loader.js +2 -2
  38. package/dist/cjs/utils/dynamic-loader.js.map +1 -1
  39. package/dist/cjs/utils/helpers/routers.helpers.js +2 -3
  40. package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -1
  41. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +19 -4
  42. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  43. package/dist/esm/modules/auth/auth.controller.js +13 -0
  44. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  45. package/dist/esm/modules/auth/auth.service.js +40 -14
  46. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  47. package/dist/esm/modules/auth/utils/services/auth-action.service.js +1 -1
  48. package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
  49. package/dist/esm/modules/base/base.middlewares.js +6 -4
  50. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  51. package/dist/esm/modules/base/utils/error-prettifier.js +181 -0
  52. package/dist/esm/modules/base/utils/error-prettifier.js.map +1 -0
  53. package/dist/esm/modules/email/email.service.js +4 -1
  54. package/dist/esm/modules/email/email.service.js.map +1 -1
  55. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
  56. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +9 -3
  57. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  58. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
  59. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
  60. package/dist/esm/types/auth.js.map +1 -1
  61. package/dist/esm/utils/arkos-router/index.js +8 -2
  62. package/dist/esm/utils/arkos-router/index.js.map +1 -1
  63. package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
  64. package/dist/esm/utils/arkos-router/utils/helpers/index.js +50 -0
  65. package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
  66. package/dist/esm/utils/cli/generate.js +38 -0
  67. package/dist/esm/utils/cli/generate.js.map +1 -1
  68. package/dist/esm/utils/cli/index.js +37 -4
  69. package/dist/esm/utils/cli/index.js.map +1 -1
  70. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  71. package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js +70 -37
  72. package/dist/esm/utils/cli/utils/template-generator/templates/auth-configs-template.js.map +1 -1
  73. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +549 -0
  74. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -0
  75. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +320 -0
  76. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -0
  77. package/dist/esm/utils/cli/utils/template-generators.js +14 -8
  78. package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
  79. package/dist/esm/utils/dynamic-loader.js +2 -2
  80. package/dist/esm/utils/dynamic-loader.js.map +1 -1
  81. package/dist/esm/utils/helpers/routers.helpers.js +2 -3
  82. package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
  83. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +19 -4
  84. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  85. package/dist/types/modules/auth/auth.service.d.ts +5 -0
  86. package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +1 -1
  87. package/dist/types/modules/base/utils/error-prettifier.d.ts +19 -0
  88. package/dist/types/modules/email/email.service.d.ts +4 -8
  89. package/dist/types/types/auth.d.ts +3 -3
  90. package/dist/types/utils/arkos-router/index.d.ts +3 -1
  91. package/dist/types/utils/arkos-router/types/index.d.ts +2 -2
  92. package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +4 -0
  93. package/dist/types/utils/cli/generate.d.ts +4 -0
  94. package/dist/types/utils/cli/utils/template-generator/templates/auth-configs-template.d.ts +3 -1
  95. package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +18 -0
  96. package/dist/types/utils/cli/utils/template-generator/templates/zod-schema-generator.d.ts +14 -0
  97. package/dist/types/utils/helpers/routers.helpers.d.ts +1 -1
  98. package/package.json +1 -1
  99. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +0 -187
  100. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +0 -1
  101. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +0 -181
  102. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +0 -1
  103. package/dist/cjs/utils/cli/utils/template-generator/templates/zod/create-schema-template.js +0 -106
  104. package/dist/cjs/utils/cli/utils/template-generator/templates/zod/create-schema-template.js.map +0 -1
  105. package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js +0 -104
  106. package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map +0 -1
  107. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +0 -181
  108. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +0 -1
  109. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +0 -175
  110. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +0 -1
  111. package/dist/esm/utils/cli/utils/template-generator/templates/zod/create-schema-template.js +0 -100
  112. package/dist/esm/utils/cli/utils/template-generator/templates/zod/create-schema-template.js.map +0 -1
  113. package/dist/esm/utils/cli/utils/template-generator/templates/zod/update-schema-template.js +0 -98
  114. package/dist/esm/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map +0 -1
  115. package/dist/types/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.d.ts +0 -2
  116. package/dist/types/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.d.ts +0 -2
  117. package/dist/types/utils/cli/utils/template-generator/templates/zod/create-schema-template.d.ts +0 -2
  118. package/dist/types/utils/cli/utils/template-generator/templates/zod/update-schema-template.d.ts +0 -2
@@ -0,0 +1,549 @@
1
+ import prismaSchemaParser from "../../../../prisma/prisma-schema-parser.js";
2
+ import { getUserFileExtension } from "../../../../helpers/fs.helpers.js";
3
+ export class ClassValidatorDtoGenerator {
4
+ ensureCorrectOptions(options) {
5
+ const { modelName } = options;
6
+ if (!modelName)
7
+ throw new Error("Module name is required for DTO template");
8
+ const model = prismaSchemaParser.models.find((m) => m.name.toLowerCase() === modelName.pascal.toLowerCase());
9
+ if (!model)
10
+ throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);
11
+ return model;
12
+ }
13
+ generateCreateDto(options) {
14
+ const { modelName } = options;
15
+ const model = this.ensureCorrectOptions(options);
16
+ const ext = 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
+ const validatorsUsed = new Set();
22
+ const transformersUsed = new Set();
23
+ const nestedDtoClasses = [];
24
+ let dtoFields = [];
25
+ for (const field of model.fields) {
26
+ if (field.isId || restrictedFields.includes(field.name)) {
27
+ continue;
28
+ }
29
+ const isForeignKey = model.fields.some((f) => f.foreignKeyField === field.name);
30
+ if (isForeignKey) {
31
+ continue;
32
+ }
33
+ if (field.isRelation) {
34
+ if (field.isArray)
35
+ continue;
36
+ const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
37
+ if (referencedModel) {
38
+ const isOptional = field.isOptional || field.defaultValue !== undefined;
39
+ const optionalDecorator = isOptional ? " @IsOptional()\n" : "";
40
+ const typeModifier = isTypeScript ? (isOptional ? "?" : "!") : "";
41
+ if (isOptional)
42
+ validatorsUsed.add("IsOptional");
43
+ validatorsUsed.add("ValidateNested");
44
+ transformersUsed.add("Type");
45
+ const relationDtoName = `${referencedModel.name}ForCreate${modelName.pascal}Dto`;
46
+ const nestedDtoClass = this.generateNestedDtoClass(field, referencedModel, relationDtoName, validatorsUsed, enumsUsed, isTypeScript);
47
+ nestedDtoClasses.push(nestedDtoClass);
48
+ dtoFields.push(`${optionalDecorator} @ValidateNested()\n @Type(() => ${relationDtoName})\n ${field.name}${typeModifier}: ${relationDtoName};`);
49
+ }
50
+ continue;
51
+ }
52
+ if (prismaSchemaParser.isEnum(field.type)) {
53
+ enumsUsed.add(field.type);
54
+ }
55
+ const { decorators, type } = this.generateClassValidatorField(field, isUserModule, validatorsUsed);
56
+ const isOptional = field.isOptional || field.defaultValue !== undefined;
57
+ const typeModifier = isTypeScript ? (isOptional ? "?" : "!") : "";
58
+ dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);
59
+ }
60
+ const enumImports = enumsUsed.size > 0
61
+ ? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
62
+ : "";
63
+ const validatorImports = validatorsUsed.size > 0
64
+ ? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
65
+ : "";
66
+ const transformerImports = transformersUsed.size > 0
67
+ ? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
68
+ : "";
69
+ const nestedDtoSection = nestedDtoClasses.length > 0 ? `\n${nestedDtoClasses.join("\n\n")}\n` : "";
70
+ return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}
71
+ export default class Create${modelName.pascal}Dto {
72
+ ${dtoFields.join("\n\n")}
73
+ }`;
74
+ }
75
+ generateUpdateDto(options) {
76
+ const { modelName } = options;
77
+ const model = this.ensureCorrectOptions(options);
78
+ const ext = getUserFileExtension();
79
+ const isTypeScript = ext === "ts";
80
+ const restrictedFields = ["id", "createdAt", "updatedAt", "deletedAt"];
81
+ const isUserModule = modelName.kebab === "user";
82
+ const enumsUsed = new Set();
83
+ const validatorsUsed = new Set();
84
+ const transformersUsed = new Set();
85
+ const nestedDtoClasses = [];
86
+ let dtoFields = [];
87
+ for (const field of model.fields) {
88
+ if (field.isId || restrictedFields.includes(field.name)) {
89
+ continue;
90
+ }
91
+ const isForeignKey = model.fields.some((f) => f.foreignKeyField === field.name);
92
+ if (isForeignKey) {
93
+ continue;
94
+ }
95
+ if (field.isRelation) {
96
+ if (field.isArray)
97
+ continue;
98
+ const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
99
+ if (referencedModel) {
100
+ validatorsUsed.add("IsOptional");
101
+ validatorsUsed.add("ValidateNested");
102
+ transformersUsed.add("Type");
103
+ const relationDtoName = `${referencedModel.name}ForUpdate${modelName.pascal}Dto`;
104
+ const nestedDtoClass = this.generateNestedDtoClass(field, referencedModel, relationDtoName, validatorsUsed, enumsUsed, isTypeScript);
105
+ nestedDtoClasses.push(nestedDtoClass);
106
+ const typeModifier = isTypeScript ? "?" : "";
107
+ dtoFields.push(` @IsOptional()\n @ValidateNested()\n @Type(() => ${relationDtoName})\n ${field.name}${typeModifier}: ${relationDtoName};`);
108
+ }
109
+ continue;
110
+ }
111
+ if (prismaSchemaParser.isEnum(field.type)) {
112
+ enumsUsed.add(field.type);
113
+ }
114
+ const { decorators, type } = this.generateClassValidatorFieldForUpdate(field, isUserModule, validatorsUsed);
115
+ const typeModifier = isTypeScript ? "?" : "";
116
+ dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);
117
+ }
118
+ const enumImports = enumsUsed.size > 0
119
+ ? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
120
+ : "";
121
+ const validatorImports = validatorsUsed.size > 0
122
+ ? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
123
+ : "";
124
+ const transformerImports = transformersUsed.size > 0
125
+ ? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
126
+ : "";
127
+ const nestedDtoSection = nestedDtoClasses.length > 0 ? `\n${nestedDtoClasses.join("\n\n")}\n` : "";
128
+ return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}
129
+ export default class Update${modelName.pascal}Dto {
130
+ ${dtoFields.join("\n\n")}
131
+ }`;
132
+ }
133
+ generateBaseDto(options) {
134
+ const { modelName } = options;
135
+ const model = this.ensureCorrectOptions(options);
136
+ const ext = getUserFileExtension();
137
+ const isTypeScript = ext === "ts";
138
+ const isUserModule = modelName.kebab === "user";
139
+ const enumsUsed = new Set();
140
+ const validatorsUsed = new Set();
141
+ const transformersUsed = new Set();
142
+ let dtoFields = [];
143
+ for (const field of model.fields) {
144
+ if (isUserModule && field.name === "password") {
145
+ continue;
146
+ }
147
+ if (field.isRelation) {
148
+ continue;
149
+ }
150
+ if (prismaSchemaParser.isEnum(field.type)) {
151
+ enumsUsed.add(field.type);
152
+ }
153
+ const { decorators, type } = this.generateClassValidatorField(field, isUserModule, validatorsUsed);
154
+ const isOptional = field.isOptional;
155
+ const typeModifier = isTypeScript ? (isOptional ? "?" : "!") : "";
156
+ dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);
157
+ }
158
+ const enumImports = enumsUsed.size > 0
159
+ ? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
160
+ : "";
161
+ const validatorImports = validatorsUsed.size > 0
162
+ ? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
163
+ : "";
164
+ const transformerImports = transformersUsed.size > 0
165
+ ? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
166
+ : "";
167
+ return `${validatorImports}${transformerImports}${enumImports}
168
+ export default class ${modelName.pascal}Dto {
169
+ ${dtoFields.join("\n\n")}
170
+ }`;
171
+ }
172
+ generateQueryDto(options) {
173
+ const { modelName } = options;
174
+ const model = this.ensureCorrectOptions(options);
175
+ const ext = getUserFileExtension();
176
+ const isTypeScript = ext === "ts";
177
+ const isUserModule = modelName.kebab === "user";
178
+ const enumsUsed = new Set();
179
+ const validatorsUsed = new Set();
180
+ const transformersUsed = new Set();
181
+ const filterClassesNeeded = new Set();
182
+ const relationFilterClasses = [];
183
+ validatorsUsed.add("IsOptional");
184
+ validatorsUsed.add("ValidateNested");
185
+ transformersUsed.add("Type");
186
+ let dtoFields = [];
187
+ for (const field of model.fields) {
188
+ if (isUserModule && field.name === "password") {
189
+ continue;
190
+ }
191
+ if (field.isRelation) {
192
+ if (field.isArray)
193
+ continue;
194
+ const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
195
+ if (referencedModel) {
196
+ const relationFilterName = `${referencedModel.name}RelationFilter`;
197
+ const relationFilterClass = this.generateRelationFilterClass(referencedModel, relationFilterName, validatorsUsed, transformersUsed, enumsUsed, filterClassesNeeded, isTypeScript);
198
+ relationFilterClasses.push(relationFilterClass);
199
+ const typeModifier = isTypeScript ? "?" : "";
200
+ dtoFields.push(` @IsOptional()\n @ValidateNested()\n @Type(() => ${relationFilterName})\n ${field.name}${typeModifier}: ${relationFilterName};`);
201
+ }
202
+ continue;
203
+ }
204
+ const filterType = this.getFilterTypeForField(field, enumsUsed);
205
+ if (filterType) {
206
+ filterClassesNeeded.add(filterType);
207
+ const typeModifier = isTypeScript ? "?" : "";
208
+ dtoFields.push(` @IsOptional()\n @ValidateNested()\n @Type(() => ${filterType})\n ${field.name}${typeModifier}: ${filterType};`);
209
+ }
210
+ }
211
+ if (filterClassesNeeded.has("StringFilter")) {
212
+ validatorsUsed.add("IsString");
213
+ validatorsUsed.add("IsArray");
214
+ }
215
+ if (filterClassesNeeded.has("NumberFilter")) {
216
+ validatorsUsed.add("IsNumber");
217
+ validatorsUsed.add("IsArray");
218
+ }
219
+ if (filterClassesNeeded.has("BooleanFilter")) {
220
+ validatorsUsed.add("IsBoolean");
221
+ }
222
+ if (filterClassesNeeded.has("DateTimeFilter")) {
223
+ validatorsUsed.add("IsString");
224
+ }
225
+ for (const enumName of enumsUsed) {
226
+ if (filterClassesNeeded.has(`${enumName}Filter`)) {
227
+ validatorsUsed.add("IsEnum");
228
+ validatorsUsed.add("IsArray");
229
+ }
230
+ }
231
+ const enumImports = enumsUsed.size > 0
232
+ ? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
233
+ : "";
234
+ const validatorImports = validatorsUsed.size > 0
235
+ ? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
236
+ : "";
237
+ const transformerImports = transformersUsed.size > 0
238
+ ? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
239
+ : "";
240
+ const filterClasses = this.generateFilterClasses(filterClassesNeeded, enumsUsed, validatorsUsed, isTypeScript);
241
+ const filterClassesSection = filterClasses ? `\n${filterClasses}\n` : "";
242
+ const relationFilterSection = relationFilterClasses.length > 0
243
+ ? `\n${relationFilterClasses.join("\n\n")}\n`
244
+ : "";
245
+ return `${validatorImports}${transformerImports}${enumImports}${filterClassesSection}${relationFilterSection}
246
+ export default class ${modelName.pascal}QueryDto {
247
+ ${dtoFields.join("\n\n")}
248
+ }`;
249
+ }
250
+ generateRelationFilterClass(model, className, validatorsUsed, transformersUsed, enumsUsed, filterClassesNeeded, isTypeScript) {
251
+ const fields = [];
252
+ const isUserModel = model.name.toLowerCase() === "user";
253
+ for (const field of model.fields) {
254
+ if (isUserModel && field.name === "password") {
255
+ continue;
256
+ }
257
+ if (field.isRelation)
258
+ continue;
259
+ const filterType = this.getFilterTypeForField(field, enumsUsed);
260
+ if (filterType) {
261
+ filterClassesNeeded.add(filterType);
262
+ const typeModifier = isTypeScript ? "?" : "";
263
+ fields.push(` @IsOptional()\n @ValidateNested()\n @Type(() => ${filterType})\n ${field.name}${typeModifier}: ${filterType};`);
264
+ }
265
+ }
266
+ return `class ${className} {
267
+ ${fields.join("\n\n")}
268
+ }`;
269
+ }
270
+ getFilterTypeForField(field, enumsUsed) {
271
+ if (prismaSchemaParser.isEnum(field.type)) {
272
+ enumsUsed.add(field.type);
273
+ return `${field.type}Filter`;
274
+ }
275
+ switch (field.type) {
276
+ case "String":
277
+ return "StringFilter";
278
+ case "Int":
279
+ case "Float":
280
+ case "Decimal":
281
+ case "BigInt":
282
+ return "NumberFilter";
283
+ case "Boolean":
284
+ return "BooleanFilter";
285
+ case "DateTime":
286
+ return "DateTimeFilter";
287
+ default:
288
+ return null;
289
+ }
290
+ }
291
+ generateFilterClasses(filterClassesNeeded, enumsUsed, validatorsUsed, isTypeScript) {
292
+ const classes = [];
293
+ const typeModifier = isTypeScript ? "?" : "";
294
+ if (filterClassesNeeded.has("StringFilter")) {
295
+ classes.push(`class StringFilter {
296
+ @IsOptional()
297
+ @IsString()
298
+ contains${typeModifier}: string;
299
+
300
+ @IsOptional()
301
+ @IsString()
302
+ icontains${typeModifier}: string;
303
+
304
+ @IsOptional()
305
+ @IsString()
306
+ equals${typeModifier}: string;
307
+
308
+ @IsOptional()
309
+ @IsArray()
310
+ @IsString({ each: true })
311
+ in${typeModifier}: string[];
312
+
313
+ @IsOptional()
314
+ @IsArray()
315
+ @IsString({ each: true })
316
+ notIn${typeModifier}: string[];
317
+ }`);
318
+ }
319
+ if (filterClassesNeeded.has("NumberFilter")) {
320
+ classes.push(`class NumberFilter {
321
+ @IsOptional()
322
+ @IsNumber()
323
+ equals${typeModifier}: number;
324
+
325
+ @IsOptional()
326
+ @IsNumber()
327
+ gte${typeModifier}: number;
328
+
329
+ @IsOptional()
330
+ @IsNumber()
331
+ lte${typeModifier}: number;
332
+
333
+ @IsOptional()
334
+ @IsNumber()
335
+ gt${typeModifier}: number;
336
+
337
+ @IsOptional()
338
+ @IsNumber()
339
+ lt${typeModifier}: number;
340
+
341
+ @IsOptional()
342
+ @IsArray()
343
+ @IsNumber({}, { each: true })
344
+ in${typeModifier}: number[];
345
+
346
+ @IsOptional()
347
+ @IsArray()
348
+ @IsNumber({}, { each: true })
349
+ notIn${typeModifier}: number[];
350
+ }`);
351
+ }
352
+ if (filterClassesNeeded.has("BooleanFilter")) {
353
+ classes.push(`class BooleanFilter {
354
+ @IsOptional()
355
+ @IsBoolean()
356
+ equals${typeModifier}: boolean;
357
+ }`);
358
+ }
359
+ if (filterClassesNeeded.has("DateTimeFilter")) {
360
+ classes.push(`class DateTimeFilter {
361
+ @IsOptional()
362
+ @IsString()
363
+ equals${typeModifier}: string;
364
+
365
+ @IsOptional()
366
+ @IsString()
367
+ gte${typeModifier}: string;
368
+
369
+ @IsOptional()
370
+ @IsString()
371
+ lte${typeModifier}: string;
372
+
373
+ @IsOptional()
374
+ @IsString()
375
+ gt${typeModifier}: string;
376
+
377
+ @IsOptional()
378
+ @IsString()
379
+ lt${typeModifier}: string;
380
+ }`);
381
+ }
382
+ for (const enumName of enumsUsed) {
383
+ if (filterClassesNeeded.has(`${enumName}Filter`)) {
384
+ classes.push(`class ${enumName}Filter {
385
+ @IsOptional()
386
+ @IsEnum(${enumName})
387
+ equals${typeModifier}: ${enumName};
388
+
389
+ @IsOptional()
390
+ @IsArray()
391
+ @IsEnum(${enumName}, { each: true })
392
+ in${typeModifier}: ${enumName}[];
393
+
394
+ @IsOptional()
395
+ @IsArray()
396
+ @IsEnum(${enumName}, { each: true })
397
+ notIn${typeModifier}: ${enumName}[];
398
+ }`);
399
+ }
400
+ }
401
+ return classes.join("\n\n");
402
+ }
403
+ generateNestedDtoClass(field, referencedModel, dtoName, validatorsUsed, enumsUsed, isTypeScript) {
404
+ const fields = [];
405
+ const refFieldName = field.foreignReferenceField || "id";
406
+ const refFieldAsPrismaField = referencedModel.fields.find((f) => f.name === refFieldName);
407
+ if (refFieldAsPrismaField) {
408
+ if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))
409
+ enumsUsed.add(refFieldAsPrismaField.type);
410
+ const { decorators, type } = this.generateClassValidatorField(refFieldAsPrismaField, false, validatorsUsed);
411
+ const typeModifier = isTypeScript ? "!" : "";
412
+ fields.push(`${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`);
413
+ }
414
+ return `class ${dtoName} {
415
+ ${fields.join("\n\n")}
416
+ }`;
417
+ }
418
+ generateClassValidatorField(field, isUserModule, validatorsUsed) {
419
+ let decorators = [];
420
+ let type = this.mapPrismaTypeToTS(field.type);
421
+ const isOptional = field.isOptional || field.defaultValue !== undefined;
422
+ if (isOptional) {
423
+ decorators.push("@IsOptional()");
424
+ validatorsUsed.add("IsOptional");
425
+ }
426
+ if (field.isArray) {
427
+ decorators.push("@IsArray()");
428
+ validatorsUsed.add("IsArray");
429
+ type = `${type}[]`;
430
+ }
431
+ if (prismaSchemaParser.isEnum(field.type)) {
432
+ decorators.push(`@IsEnum(${field.type}${field.isArray ? ", { each: true }" : ""})`);
433
+ validatorsUsed.add("IsEnum");
434
+ type = field.isArray ? `${field.type}[]` : field.type;
435
+ }
436
+ else {
437
+ const fieldValidators = this.getValidatorsForType(field, isUserModule);
438
+ decorators.push(...fieldValidators);
439
+ fieldValidators.forEach((decorator) => {
440
+ const validatorName = decorator.match(/@(\w+)/)?.[1];
441
+ if (validatorName)
442
+ validatorsUsed.add(validatorName);
443
+ });
444
+ }
445
+ return {
446
+ decorators: decorators.map((d) => ` ${d}`).join("\n") +
447
+ (decorators.length > 0 ? "\n" : ""),
448
+ type,
449
+ };
450
+ }
451
+ generateClassValidatorFieldForUpdate(field, isUserModule, validatorsUsed) {
452
+ let decorators = [];
453
+ let type = this.mapPrismaTypeToTS(field.type);
454
+ decorators.push("@IsOptional()");
455
+ validatorsUsed.add("IsOptional");
456
+ if (field.isArray) {
457
+ decorators.push("@IsArray()");
458
+ validatorsUsed.add("IsArray");
459
+ type = `${type}[]`;
460
+ }
461
+ if (prismaSchemaParser.isEnum(field.type)) {
462
+ decorators.push(`@IsEnum(${field.type}${field.isArray ? ", { each: true }" : ""})`);
463
+ validatorsUsed.add("IsEnum");
464
+ type = field.isArray ? `${field.type}[]` : field.type;
465
+ }
466
+ else {
467
+ const fieldValidators = this.getValidatorsForType(field, isUserModule);
468
+ decorators.push(...fieldValidators);
469
+ fieldValidators.forEach((decorator) => {
470
+ const validatorName = decorator.match(/@(\w+)/)?.[1];
471
+ if (validatorName)
472
+ validatorsUsed.add(validatorName);
473
+ });
474
+ }
475
+ return {
476
+ decorators: decorators.map((d) => ` ${d}`).join("\n") +
477
+ (decorators.length > 0 ? "\n" : ""),
478
+ type,
479
+ };
480
+ }
481
+ getValidatorsForType(field, isUserModule) {
482
+ const validators = [];
483
+ const arrayEach = field.isArray ? "{ each: true }" : "";
484
+ if (isUserModule) {
485
+ if (field.name === "email") {
486
+ return ["@IsEmail()"];
487
+ }
488
+ else if (field.name === "password") {
489
+ return [
490
+ "@IsString()",
491
+ "@MinLength(8)",
492
+ '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)/, { message: "Password must contain at least one uppercase letter, one lowercase letter, and one number" })',
493
+ ];
494
+ }
495
+ }
496
+ switch (field.type) {
497
+ case "String":
498
+ validators.push(`@IsString(${arrayEach})`);
499
+ break;
500
+ case "Int":
501
+ case "Float":
502
+ case "Decimal":
503
+ validators.push(`@IsNumber(${arrayEach})`);
504
+ break;
505
+ case "Boolean":
506
+ validators.push(`@IsBoolean(${arrayEach})`);
507
+ break;
508
+ case "DateTime":
509
+ validators.push(`@IsDate(${arrayEach})`);
510
+ break;
511
+ case "BigInt":
512
+ validators.push(`@IsNumber(${arrayEach})`);
513
+ break;
514
+ case "Json":
515
+ validators.push(`@IsObject(${arrayEach})`);
516
+ break;
517
+ case "Bytes":
518
+ break;
519
+ default:
520
+ break;
521
+ }
522
+ return validators;
523
+ }
524
+ mapPrismaTypeToTS(prismaType) {
525
+ switch (prismaType) {
526
+ case "String":
527
+ return "string";
528
+ case "Int":
529
+ case "Float":
530
+ case "Decimal":
531
+ return "number";
532
+ case "Boolean":
533
+ return "boolean";
534
+ case "DateTime":
535
+ return "Date";
536
+ case "Json":
537
+ return "any";
538
+ case "Bytes":
539
+ return "Buffer";
540
+ case "BigInt":
541
+ return "bigint";
542
+ default:
543
+ return prismaSchemaParser.isEnum(prismaType) ? prismaType : "any";
544
+ }
545
+ }
546
+ }
547
+ const classValidatorDtoGenerator = new ClassValidatorDtoGenerator();
548
+ export default classValidatorDtoGenerator;
549
+ //# sourceMappingURL=class-validator-dto-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-validator-dto-generator.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator-dto-generator.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 class ClassValidatorDtoGenerator {\n private ensureCorrectOptions(options: TemplateOptions) {\n const { modelName } = options;\n if (!modelName) throw new Error(\"Module name is required for DTO template\");\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n return model;\n }\n\n generateCreateDto(options: TemplateOptions): string {\n const { modelName } = options;\n const model = this.ensureCorrectOptions(options);\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 =\n field.isOptional || field.defaultValue !== undefined;\n const optionalDecorator = isOptional ? \" @IsOptional()\\n\" : \"\";\n const typeModifier = isTypeScript ? (isOptional ? \"?\" : \"!\") : \"\";\n\n if (isOptional) validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n transformersUsed.add(\"Type\");\n\n const relationDtoName = `${referencedModel.name}ForCreate${modelName!.pascal}Dto`;\n\n const nestedDtoClass = this.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 } = this.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\n generateUpdateDto(options: TemplateOptions): string {\n const { modelName } = options;\n const model = this.ensureCorrectOptions(options);\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 const nestedDtoClass = this.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 } = this.generateClassValidatorFieldForUpdate(\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\n generateBaseDto(options: TemplateOptions): string {\n const { modelName } = options;\n const model = this.ensureCorrectOptions(options);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\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\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n // Skip password field in base DTO for user module (sensitive data)\n if (isUserModule && field.name === \"password\") {\n continue;\n }\n\n // Skip all relations - user can add them manually if needed\n if (field.isRelation) {\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = this.generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n const isOptional = field.isOptional;\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 return `${validatorImports}${transformerImports}${enumImports}\nexport default class ${modelName!.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n }\n\n generateQueryDto(options: TemplateOptions): string {\n const { modelName } = options;\n const model = this.ensureCorrectOptions(options);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\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 filterClassesNeeded = new Set<string>();\n const relationFilterClasses: string[] = [];\n\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n transformersUsed.add(\"Type\");\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n // Skip password field in query DTO for user module\n if (isUserModule && field.name === \"password\") {\n continue;\n }\n\n // Skip relation array fields and restricted fields\n if (field.isRelation) {\n if (field.isArray) continue; // Skip array relations for now\n\n // Single relation - create a relation filter\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n const relationFilterName = `${referencedModel.name}RelationFilter`;\n\n // Generate relation filter class\n const relationFilterClass = this.generateRelationFilterClass(\n referencedModel,\n relationFilterName,\n validatorsUsed,\n transformersUsed,\n enumsUsed,\n filterClassesNeeded,\n isTypeScript\n );\n relationFilterClasses.push(relationFilterClass);\n\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(\n ` @IsOptional()\\n @ValidateNested()\\n @Type(() => ${relationFilterName})\\n ${field.name}${typeModifier}: ${relationFilterName};`\n );\n }\n continue;\n }\n\n // Regular fields get filter types\n const filterType = this.getFilterTypeForField(field, enumsUsed);\n if (filterType) {\n filterClassesNeeded.add(filterType);\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(\n ` @IsOptional()\\n @ValidateNested()\\n @Type(() => ${filterType})\\n ${field.name}${typeModifier}: ${filterType};`\n );\n }\n }\n\n // Add all validators used by filter classes\n if (filterClassesNeeded.has(\"StringFilter\")) {\n validatorsUsed.add(\"IsString\");\n validatorsUsed.add(\"IsArray\");\n }\n if (filterClassesNeeded.has(\"NumberFilter\")) {\n validatorsUsed.add(\"IsNumber\");\n validatorsUsed.add(\"IsArray\");\n }\n if (filterClassesNeeded.has(\"BooleanFilter\")) {\n validatorsUsed.add(\"IsBoolean\");\n }\n if (filterClassesNeeded.has(\"DateTimeFilter\")) {\n validatorsUsed.add(\"IsString\");\n }\n // Add IsEnum and IsArray for enum filters\n for (const enumName of enumsUsed) {\n if (filterClassesNeeded.has(`${enumName}Filter`)) {\n validatorsUsed.add(\"IsEnum\");\n validatorsUsed.add(\"IsArray\");\n }\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 // Generate filter classes\n const filterClasses = this.generateFilterClasses(\n filterClassesNeeded,\n enumsUsed,\n validatorsUsed,\n isTypeScript\n );\n\n const filterClassesSection = filterClasses ? `\\n${filterClasses}\\n` : \"\";\n\n const relationFilterSection =\n relationFilterClasses.length > 0\n ? `\\n${relationFilterClasses.join(\"\\n\\n\")}\\n`\n : \"\";\n\n return `${validatorImports}${transformerImports}${enumImports}${filterClassesSection}${relationFilterSection}\nexport default class ${modelName!.pascal}QueryDto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n }\n\n private generateRelationFilterClass(\n model: PrismaModel,\n className: string,\n validatorsUsed: Set<string>,\n transformersUsed: Set<string>,\n enumsUsed: Set<string>,\n filterClassesNeeded: Set<string>,\n isTypeScript: boolean\n ): string {\n const fields: string[] = [];\n const isUserModel = model.name.toLowerCase() === \"user\";\n\n for (const field of model.fields) {\n // Skip password field for user model\n if (isUserModel && field.name === \"password\") {\n continue;\n }\n\n // Skip relations in relation filters (only single level)\n if (field.isRelation) continue;\n\n const filterType = this.getFilterTypeForField(field, enumsUsed);\n if (filterType) {\n filterClassesNeeded.add(filterType);\n const typeModifier = isTypeScript ? \"?\" : \"\";\n fields.push(\n ` @IsOptional()\\n @ValidateNested()\\n @Type(() => ${filterType})\\n ${field.name}${typeModifier}: ${filterType};`\n );\n }\n }\n\n return `class ${className} {\n${fields.join(\"\\n\\n\")}\n}`;\n }\n\n private getFilterTypeForField(\n field: PrismaField,\n enumsUsed: Set<string>\n ): string | null {\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n return `${field.type}Filter`;\n }\n\n switch (field.type) {\n case \"String\":\n return \"StringFilter\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n case \"BigInt\":\n return \"NumberFilter\";\n case \"Boolean\":\n return \"BooleanFilter\";\n case \"DateTime\":\n return \"DateTimeFilter\";\n default:\n return null;\n }\n }\n\n private generateFilterClasses(\n filterClassesNeeded: Set<string>,\n enumsUsed: Set<string>,\n validatorsUsed: Set<string>,\n isTypeScript: boolean\n ): string {\n const classes: string[] = [];\n const typeModifier = isTypeScript ? \"?\" : \"\";\n\n if (filterClassesNeeded.has(\"StringFilter\")) {\n classes.push(`class StringFilter {\n @IsOptional()\n @IsString()\n contains${typeModifier}: string;\n\n @IsOptional()\n @IsString()\n icontains${typeModifier}: string;\n\n @IsOptional()\n @IsString()\n equals${typeModifier}: string;\n\n @IsOptional()\n @IsArray()\n @IsString({ each: true })\n in${typeModifier}: string[];\n\n @IsOptional()\n @IsArray()\n @IsString({ each: true })\n notIn${typeModifier}: string[];\n}`);\n }\n\n if (filterClassesNeeded.has(\"NumberFilter\")) {\n classes.push(`class NumberFilter {\n @IsOptional()\n @IsNumber()\n equals${typeModifier}: number;\n\n @IsOptional()\n @IsNumber()\n gte${typeModifier}: number;\n\n @IsOptional()\n @IsNumber()\n lte${typeModifier}: number;\n\n @IsOptional()\n @IsNumber()\n gt${typeModifier}: number;\n\n @IsOptional()\n @IsNumber()\n lt${typeModifier}: number;\n\n @IsOptional()\n @IsArray()\n @IsNumber({}, { each: true })\n in${typeModifier}: number[];\n\n @IsOptional()\n @IsArray()\n @IsNumber({}, { each: true })\n notIn${typeModifier}: number[];\n}`);\n }\n\n if (filterClassesNeeded.has(\"BooleanFilter\")) {\n classes.push(`class BooleanFilter {\n @IsOptional()\n @IsBoolean()\n equals${typeModifier}: boolean;\n}`);\n }\n\n if (filterClassesNeeded.has(\"DateTimeFilter\")) {\n classes.push(`class DateTimeFilter {\n @IsOptional()\n @IsString()\n equals${typeModifier}: string;\n\n @IsOptional()\n @IsString()\n gte${typeModifier}: string;\n\n @IsOptional()\n @IsString()\n lte${typeModifier}: string;\n\n @IsOptional()\n @IsString()\n gt${typeModifier}: string;\n\n @IsOptional()\n @IsString()\n lt${typeModifier}: string;\n}`);\n }\n\n // Generate enum filters\n for (const enumName of enumsUsed) {\n if (filterClassesNeeded.has(`${enumName}Filter`)) {\n classes.push(`class ${enumName}Filter {\n @IsOptional()\n @IsEnum(${enumName})\n equals${typeModifier}: ${enumName};\n\n @IsOptional()\n @IsArray()\n @IsEnum(${enumName}, { each: true })\n in${typeModifier}: ${enumName}[];\n\n @IsOptional()\n @IsArray()\n @IsEnum(${enumName}, { each: true })\n notIn${typeModifier}: ${enumName}[];\n}`);\n }\n }\n\n return classes.join(\"\\n\\n\");\n }\n\n private 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 } = this.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\n private generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n ): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = this.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 = this.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\n private generateClassValidatorFieldForUpdate(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n ): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = this.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 = this.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\n private 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\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"];\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\n private 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 return prismaSchemaParser.isEnum(prismaType) ? prismaType : \"any\";\n }\n }\n}\n\nconst classValidatorDtoGenerator = new ClassValidatorDtoGenerator();\n\nexport default classValidatorDtoGenerator;\n"]}