@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.
Files changed (60) hide show
  1. package/CHANGELOG.md +18 -609
  2. package/README.md +623 -427
  3. package/dist/cli.js +2 -1
  4. package/dist/commands/commit.js +25 -42
  5. package/dist/commands/createApp.js +1 -0
  6. package/dist/commands/createModule.js +151 -45
  7. package/dist/commands/diff.js +27 -40
  8. package/dist/commands/generateAll.js +141 -291
  9. package/dist/commands/migrateCommit.js +6 -18
  10. package/dist/generators/controllerGenerator.d.ts +50 -19
  11. package/dist/generators/controllerGenerator.js +588 -331
  12. package/dist/generators/domainLayerGenerator.d.ts +21 -0
  13. package/dist/generators/domainLayerGenerator.js +286 -0
  14. package/dist/generators/dtoGenerator.d.ts +21 -0
  15. package/dist/generators/dtoGenerator.js +523 -0
  16. package/dist/generators/serviceGenerator.d.ts +22 -51
  17. package/dist/generators/serviceGenerator.js +345 -568
  18. package/dist/generators/storeGenerator.d.ts +39 -32
  19. package/dist/generators/storeGenerator.js +396 -236
  20. package/dist/generators/templateGenerator.d.ts +21 -21
  21. package/dist/generators/templateGenerator.js +393 -268
  22. package/dist/generators/templates/appTemplates.d.ts +3 -1
  23. package/dist/generators/templates/appTemplates.js +16 -11
  24. package/dist/generators/templates/data/appYamlTemplate +5 -2
  25. package/dist/generators/templates/data/cursorRulesTemplate +315 -221
  26. package/dist/generators/templates/data/frontendScriptTemplate +56 -15
  27. package/dist/generators/templates/data/mainViewTemplate +2 -1
  28. package/dist/generators/templates/data/systemTsTemplate +5 -0
  29. package/dist/generators/templates/index.d.ts +0 -3
  30. package/dist/generators/templates/index.js +0 -3
  31. package/dist/generators/templates/storeTemplates.d.ts +1 -5
  32. package/dist/generators/templates/storeTemplates.js +84 -224
  33. package/dist/generators/useCaseGenerator.d.ts +13 -0
  34. package/dist/generators/useCaseGenerator.js +191 -0
  35. package/dist/types/configTypes.d.ts +149 -0
  36. package/dist/types/configTypes.js +10 -0
  37. package/dist/utils/childEntityUtils.d.ts +18 -0
  38. package/dist/utils/childEntityUtils.js +78 -0
  39. package/dist/utils/commandUtils.d.ts +43 -0
  40. package/dist/utils/commandUtils.js +124 -0
  41. package/dist/utils/commitUtils.d.ts +4 -1
  42. package/dist/utils/constants.d.ts +10 -0
  43. package/dist/utils/constants.js +13 -1
  44. package/dist/utils/diResolver.d.ts +32 -0
  45. package/dist/utils/diResolver.js +204 -0
  46. package/dist/utils/typeUtils.d.ts +23 -0
  47. package/dist/utils/typeUtils.js +77 -0
  48. package/package.json +7 -3
  49. package/dist/generators/domainModelGenerator.d.ts +0 -41
  50. package/dist/generators/domainModelGenerator.js +0 -242
  51. package/dist/generators/templates/controllerTemplates.d.ts +0 -43
  52. package/dist/generators/templates/controllerTemplates.js +0 -82
  53. package/dist/generators/templates/serviceTemplates.d.ts +0 -16
  54. package/dist/generators/templates/serviceTemplates.js +0 -59
  55. package/dist/generators/templates/validationTemplates.d.ts +0 -25
  56. package/dist/generators/templates/validationTemplates.js +0 -66
  57. package/dist/generators/templates/viewTemplates.d.ts +0 -25
  58. package/dist/generators/templates/viewTemplates.js +0 -491
  59. package/dist/generators/validationGenerator.d.ts +0 -29
  60. 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;