@currentjs/gen 0.3.2 → 0.5.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.
- package/CHANGELOG.md +18 -609
- package/README.md +623 -427
- package/dist/cli.js +2 -1
- package/dist/commands/commit.js +25 -42
- package/dist/commands/createApp.js +1 -0
- package/dist/commands/createModule.js +151 -45
- package/dist/commands/diff.js +27 -40
- package/dist/commands/generateAll.js +141 -291
- package/dist/commands/migrateCommit.js +6 -18
- package/dist/generators/controllerGenerator.d.ts +50 -19
- package/dist/generators/controllerGenerator.js +588 -331
- package/dist/generators/domainLayerGenerator.d.ts +21 -0
- package/dist/generators/domainLayerGenerator.js +286 -0
- package/dist/generators/dtoGenerator.d.ts +21 -0
- package/dist/generators/dtoGenerator.js +523 -0
- package/dist/generators/serviceGenerator.d.ts +22 -51
- package/dist/generators/serviceGenerator.js +345 -568
- package/dist/generators/storeGenerator.d.ts +39 -32
- package/dist/generators/storeGenerator.js +396 -236
- package/dist/generators/templateGenerator.d.ts +21 -21
- package/dist/generators/templateGenerator.js +393 -268
- package/dist/generators/templates/appTemplates.d.ts +3 -1
- package/dist/generators/templates/appTemplates.js +16 -11
- package/dist/generators/templates/data/appYamlTemplate +5 -2
- package/dist/generators/templates/data/cursorRulesTemplate +315 -221
- package/dist/generators/templates/data/frontendScriptTemplate +56 -15
- package/dist/generators/templates/data/mainViewTemplate +2 -1
- package/dist/generators/templates/data/systemTsTemplate +5 -0
- package/dist/generators/templates/index.d.ts +0 -3
- package/dist/generators/templates/index.js +0 -3
- package/dist/generators/templates/storeTemplates.d.ts +1 -5
- package/dist/generators/templates/storeTemplates.js +84 -224
- package/dist/generators/useCaseGenerator.d.ts +13 -0
- package/dist/generators/useCaseGenerator.js +191 -0
- package/dist/types/configTypes.d.ts +149 -0
- package/dist/types/configTypes.js +10 -0
- package/dist/utils/childEntityUtils.d.ts +18 -0
- package/dist/utils/childEntityUtils.js +78 -0
- package/dist/utils/commandUtils.d.ts +43 -0
- package/dist/utils/commandUtils.js +124 -0
- package/dist/utils/commitUtils.d.ts +4 -1
- package/dist/utils/constants.d.ts +10 -0
- package/dist/utils/constants.js +13 -1
- package/dist/utils/diResolver.d.ts +32 -0
- package/dist/utils/diResolver.js +204 -0
- package/dist/utils/typeUtils.d.ts +23 -0
- package/dist/utils/typeUtils.js +77 -0
- package/package.json +7 -3
- package/dist/generators/domainModelGenerator.d.ts +0 -41
- package/dist/generators/domainModelGenerator.js +0 -242
- package/dist/generators/templates/controllerTemplates.d.ts +0 -43
- package/dist/generators/templates/controllerTemplates.js +0 -82
- package/dist/generators/templates/serviceTemplates.d.ts +0 -16
- package/dist/generators/templates/serviceTemplates.js +0 -59
- package/dist/generators/templates/validationTemplates.d.ts +0 -25
- package/dist/generators/templates/validationTemplates.js +0 -66
- package/dist/generators/templates/viewTemplates.d.ts +0 -25
- package/dist/generators/templates/viewTemplates.js +0 -491
- package/dist/generators/validationGenerator.d.ts +0 -29
- package/dist/generators/validationGenerator.js +0 -250
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.ValidationGenerator = void 0;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
const yaml_1 = require("yaml");
|
|
40
|
-
const validationTemplates_1 = require("./templates/validationTemplates");
|
|
41
|
-
const generationRegistry_1 = require("../utils/generationRegistry");
|
|
42
|
-
const colors_1 = require("../utils/colors");
|
|
43
|
-
const constants_1 = require("../utils/constants");
|
|
44
|
-
class ValidationGenerator {
|
|
45
|
-
constructor() {
|
|
46
|
-
this.availableModels = new Set();
|
|
47
|
-
}
|
|
48
|
-
setAvailableModels(models) {
|
|
49
|
-
this.availableModels.clear();
|
|
50
|
-
models.forEach(model => {
|
|
51
|
-
this.availableModels.add(model.name);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
isRelationshipField(field) {
|
|
55
|
-
return this.availableModels.has(field.type);
|
|
56
|
-
}
|
|
57
|
-
getForeignKeyFieldName(field) {
|
|
58
|
-
// Convention: fieldName + 'Id' (e.g., owner -> ownerId)
|
|
59
|
-
return field.name + 'Id';
|
|
60
|
-
}
|
|
61
|
-
replaceTemplateVars(template, variables) {
|
|
62
|
-
let result = template;
|
|
63
|
-
Object.entries(variables).forEach(([key, value]) => {
|
|
64
|
-
const regex = new RegExp(`{{${key}}}`, 'g');
|
|
65
|
-
result = result.replace(regex, value);
|
|
66
|
-
});
|
|
67
|
-
return result;
|
|
68
|
-
}
|
|
69
|
-
getTypeScriptType(yamlType) {
|
|
70
|
-
return validationTemplates_1.typeMapping[yamlType] || 'any';
|
|
71
|
-
}
|
|
72
|
-
generateInterfaceField(field, isCreate) {
|
|
73
|
-
// For relationship fields, use the foreign key field instead
|
|
74
|
-
if (this.isRelationshipField(field)) {
|
|
75
|
-
const foreignKeyName = this.getForeignKeyFieldName(field);
|
|
76
|
-
const tsType = 'number'; // Foreign keys are always numbers
|
|
77
|
-
if (isCreate) {
|
|
78
|
-
const optional = !field.required ? '?' : '';
|
|
79
|
-
return ` ${foreignKeyName}${optional}: ${tsType};`;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
return ` ${foreignKeyName}?: ${tsType};`;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
const tsType = this.getTypeScriptType(field.type);
|
|
86
|
-
if (isCreate) {
|
|
87
|
-
if (field.auto || field.name === 'id') {
|
|
88
|
-
return '';
|
|
89
|
-
}
|
|
90
|
-
const optional = !field.required ? '?' : '';
|
|
91
|
-
return ` ${field.name}${optional}: ${tsType};`;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
if (field.name === 'id' || field.auto) {
|
|
95
|
-
return '';
|
|
96
|
-
}
|
|
97
|
-
return ` ${field.name}?: ${tsType};`;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
generateValidationLogic(field, isCreate) {
|
|
101
|
-
// For relationship fields, validate the foreign key
|
|
102
|
-
if (this.isRelationshipField(field)) {
|
|
103
|
-
const foreignKeyName = this.getForeignKeyFieldName(field);
|
|
104
|
-
const isRequired = isCreate && field.required;
|
|
105
|
-
const template = isRequired ? validationTemplates_1.validationTemplates.requiredNumberValidation : validationTemplates_1.validationTemplates.optionalNumberValidation;
|
|
106
|
-
return this.replaceTemplateVars(template, { FIELD_NAME: foreignKeyName });
|
|
107
|
-
}
|
|
108
|
-
const fieldName = field.name;
|
|
109
|
-
if (field.auto || field.name === 'id') {
|
|
110
|
-
return '';
|
|
111
|
-
}
|
|
112
|
-
let template = '';
|
|
113
|
-
const isRequired = isCreate && field.required;
|
|
114
|
-
switch (field.type) {
|
|
115
|
-
case 'string':
|
|
116
|
-
template = isRequired ? validationTemplates_1.validationTemplates.requiredStringValidation : validationTemplates_1.validationTemplates.optionalStringValidation;
|
|
117
|
-
break;
|
|
118
|
-
case 'number':
|
|
119
|
-
template = isRequired ? validationTemplates_1.validationTemplates.requiredNumberValidation : validationTemplates_1.validationTemplates.optionalNumberValidation;
|
|
120
|
-
break;
|
|
121
|
-
case 'boolean':
|
|
122
|
-
template = isRequired ? validationTemplates_1.validationTemplates.requiredBooleanValidation : validationTemplates_1.validationTemplates.optionalBooleanValidation;
|
|
123
|
-
break;
|
|
124
|
-
case 'datetime':
|
|
125
|
-
template = isRequired ? validationTemplates_1.validationTemplates.requiredDateValidation : validationTemplates_1.validationTemplates.optionalDateValidation;
|
|
126
|
-
break;
|
|
127
|
-
default:
|
|
128
|
-
template = isRequired ? validationTemplates_1.validationTemplates.requiredComplexValidation : validationTemplates_1.validationTemplates.optionalComplexValidation;
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
131
|
-
return this.replaceTemplateVars(template, { FIELD_NAME: fieldName });
|
|
132
|
-
}
|
|
133
|
-
generateDtoField(field, isCreate) {
|
|
134
|
-
// For relationship fields, use the foreign key field instead
|
|
135
|
-
if (this.isRelationshipField(field)) {
|
|
136
|
-
const foreignKeyName = this.getForeignKeyFieldName(field);
|
|
137
|
-
const tsType = 'number'; // Foreign keys are always numbers
|
|
138
|
-
if (isCreate) {
|
|
139
|
-
const optional = !field.required ? '?' : '';
|
|
140
|
-
return ` ${foreignKeyName}${optional}: ${tsType};`;
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
return ` ${foreignKeyName}?: ${tsType};`;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
const tsType = this.getTypeScriptType(field.type);
|
|
147
|
-
if (isCreate) {
|
|
148
|
-
if (field.auto || field.name === 'id') {
|
|
149
|
-
return '';
|
|
150
|
-
}
|
|
151
|
-
const optional = !field.required ? '?' : '';
|
|
152
|
-
return ` ${field.name}${optional}: ${tsType};`;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
if (field.name === 'id' || field.auto) {
|
|
156
|
-
return '';
|
|
157
|
-
}
|
|
158
|
-
return ` ${field.name}?: ${tsType};`;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
generateDtoInterface(entityName, fields, isCreate) {
|
|
162
|
-
const dtoName = `${entityName}DTO`;
|
|
163
|
-
const dtoFields = fields
|
|
164
|
-
.map(field => this.generateDtoField(field, isCreate))
|
|
165
|
-
.filter(field => field !== '')
|
|
166
|
-
.join('\n');
|
|
167
|
-
return this.replaceTemplateVars(validationTemplates_1.validationTemplates.dtoInterface, {
|
|
168
|
-
DTO_NAME: dtoName,
|
|
169
|
-
DTO_FIELDS: dtoFields
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
generateInputInterface(entityName, fields, isCreate) {
|
|
173
|
-
const interfaceName = `${isCreate ? 'Create' : 'Update'}${entityName}Input`;
|
|
174
|
-
const interfaceFields = fields
|
|
175
|
-
.map(field => this.generateInterfaceField(field, isCreate))
|
|
176
|
-
.filter(field => field !== '')
|
|
177
|
-
.join('\n');
|
|
178
|
-
return this.replaceTemplateVars(validationTemplates_1.validationTemplates.inputInterface, {
|
|
179
|
-
INTERFACE_NAME: interfaceName,
|
|
180
|
-
INTERFACE_FIELDS: interfaceFields
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
generateValidationFunction(entityName, fields, isCreate) {
|
|
184
|
-
const functionName = `validate${isCreate ? 'Create' : 'Update'}${entityName}`;
|
|
185
|
-
const dtoParam = `${entityName.toLowerCase()}Data: ${entityName}DTO`;
|
|
186
|
-
const validationLogic = fields
|
|
187
|
-
.map(field => this.generateValidationLogic(field, isCreate))
|
|
188
|
-
.filter(logic => logic !== '')
|
|
189
|
-
.join('\n');
|
|
190
|
-
return this.replaceTemplateVars(validationTemplates_1.validationTemplates.validationFunction, {
|
|
191
|
-
FUNCTION_NAME: functionName,
|
|
192
|
-
VALIDATION_LOGIC: validationLogic
|
|
193
|
-
}).replace('(data: any)', `(${dtoParam})`).replace(/data\./g, `${entityName.toLowerCase()}Data.`);
|
|
194
|
-
}
|
|
195
|
-
generateValidation(entityName, fields) {
|
|
196
|
-
const dtoInterface = this.generateDtoInterface(entityName, fields, true);
|
|
197
|
-
const createValidation = this.generateValidationFunction(entityName, fields, true);
|
|
198
|
-
const updateValidation = this.generateValidationFunction(entityName, fields, false);
|
|
199
|
-
const validationFunctions = `${createValidation}\n\n${updateValidation}`;
|
|
200
|
-
return this.replaceTemplateVars(validationTemplates_1.validationTemplates.validationFileTemplate, {
|
|
201
|
-
ENTITY_NAME: entityName,
|
|
202
|
-
DTO_INTERFACES: dtoInterface,
|
|
203
|
-
VALIDATION_FUNCTIONS: validationFunctions
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
generateFromYamlFile(yamlFilePath) {
|
|
207
|
-
const yamlContent = fs.readFileSync(yamlFilePath, 'utf8');
|
|
208
|
-
const config = (0, yaml_1.parse)(yamlContent);
|
|
209
|
-
const validations = {};
|
|
210
|
-
if (config.modules) {
|
|
211
|
-
Object.values(config.modules).forEach(moduleConfig => {
|
|
212
|
-
if (moduleConfig.models && moduleConfig.models.length > 0) {
|
|
213
|
-
// Set available models for relationship detection
|
|
214
|
-
this.setAvailableModels(moduleConfig.models);
|
|
215
|
-
moduleConfig.models.forEach(model => {
|
|
216
|
-
const validationCode = this.generateValidation(model.name, model.fields);
|
|
217
|
-
validations[model.name] = validationCode;
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
else if (config.models) {
|
|
223
|
-
const module = config;
|
|
224
|
-
if (module.models) {
|
|
225
|
-
// Set available models for relationship detection
|
|
226
|
-
this.setAvailableModels(module.models);
|
|
227
|
-
module.models.forEach(model => {
|
|
228
|
-
const validationCode = this.generateValidation(model.name, model.fields);
|
|
229
|
-
validations[model.name] = validationCode;
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return validations;
|
|
234
|
-
}
|
|
235
|
-
async generateAndSaveFiles(yamlFilePath = constants_1.COMMON_FILES.APP_YAML, outputDir = 'application', opts) {
|
|
236
|
-
const validations = this.generateFromYamlFile(yamlFilePath);
|
|
237
|
-
const validationDir = path.join(outputDir, 'validation');
|
|
238
|
-
fs.mkdirSync(validationDir, { recursive: true });
|
|
239
|
-
for (const [entityName, validationCode] of Object.entries(validations)) {
|
|
240
|
-
const fileName = `${entityName}Validation.ts`;
|
|
241
|
-
const filePath = path.join(validationDir, fileName);
|
|
242
|
-
// Sequential to avoid multiple prompts overlapping
|
|
243
|
-
// eslint-disable-next-line no-await-in-loop
|
|
244
|
-
await (0, generationRegistry_1.writeGeneratedFile)(filePath, validationCode, { force: !!(opts === null || opts === void 0 ? void 0 : opts.force), skipOnConflict: !!(opts === null || opts === void 0 ? void 0 : opts.skipOnConflict) });
|
|
245
|
-
}
|
|
246
|
-
// eslint-disable-next-line no-console
|
|
247
|
-
console.log('\n' + colors_1.colors.green('Validation files generated successfully!') + '\n');
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
exports.ValidationGenerator = ValidationGenerator;
|