@currentjs/gen 0.3.2 → 0.5.0
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 +10 -611
- 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/commands/migratePush.d.ts +1 -0
- package/dist/commands/migratePush.js +135 -0
- package/dist/commands/migrateUpdate.d.ts +1 -0
- package/dist/commands/migrateUpdate.js +147 -0
- package/dist/commands/newGenerateAll.d.ts +4 -0
- package/dist/commands/newGenerateAll.js +336 -0
- package/dist/generators/controllerGenerator.d.ts +43 -19
- package/dist/generators/controllerGenerator.js +547 -329
- package/dist/generators/domainLayerGenerator.d.ts +21 -0
- package/dist/generators/domainLayerGenerator.js +276 -0
- package/dist/generators/dtoGenerator.d.ts +21 -0
- package/dist/generators/dtoGenerator.js +518 -0
- package/dist/generators/newControllerGenerator.d.ts +55 -0
- package/dist/generators/newControllerGenerator.js +644 -0
- package/dist/generators/newServiceGenerator.d.ts +19 -0
- package/dist/generators/newServiceGenerator.js +266 -0
- package/dist/generators/newStoreGenerator.d.ts +39 -0
- package/dist/generators/newStoreGenerator.js +408 -0
- package/dist/generators/newTemplateGenerator.d.ts +29 -0
- package/dist/generators/newTemplateGenerator.js +510 -0
- package/dist/generators/serviceGenerator.d.ts +16 -51
- package/dist/generators/serviceGenerator.js +167 -586
- package/dist/generators/storeGenerator.d.ts +35 -32
- package/dist/generators/storeGenerator.js +291 -238
- package/dist/generators/storeGeneratorV2.d.ts +31 -0
- package/dist/generators/storeGeneratorV2.js +190 -0
- 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 +15 -10
- package/dist/generators/templates/data/appYamlTemplate +5 -2
- package/dist/generators/templates/data/cursorRulesTemplate +315 -221
- package/dist/generators/templates/data/frontendScriptTemplate +45 -11
- package/dist/generators/templates/data/mainViewTemplate +1 -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/newStoreTemplates.d.ts +5 -0
- package/dist/generators/templates/newStoreTemplates.js +141 -0
- package/dist/generators/templates/storeTemplates.d.ts +1 -5
- package/dist/generators/templates/storeTemplates.js +102 -219
- package/dist/generators/templates/viewTemplates.js +1 -1
- package/dist/generators/useCaseGenerator.d.ts +13 -0
- package/dist/generators/useCaseGenerator.js +188 -0
- package/dist/types/configTypes.d.ts +148 -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/new_parts_of_migrationUtils.d.ts +0 -0
- package/dist/utils/new_parts_of_migrationUtils.js +164 -0
- package/dist/utils/typeUtils.d.ts +19 -0
- package/dist/utils/typeUtils.js +70 -0
- package/package.json +7 -3
|
@@ -0,0 +1,190 @@
|
|
|
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.StoreGeneratorV2 = void 0;
|
|
37
|
+
const yaml_1 = require("yaml");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const storeTemplates_1 = require("./templates/storeTemplates");
|
|
41
|
+
const generationRegistry_1 = require("../utils/generationRegistry");
|
|
42
|
+
const colors_1 = require("../utils/colors");
|
|
43
|
+
class StoreGeneratorV2 {
|
|
44
|
+
constructor() {
|
|
45
|
+
this.typeMapping = {
|
|
46
|
+
string: 'string',
|
|
47
|
+
number: 'number',
|
|
48
|
+
boolean: 'boolean',
|
|
49
|
+
datetime: 'Date',
|
|
50
|
+
json: 'any',
|
|
51
|
+
array: 'any[]',
|
|
52
|
+
object: 'object'
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
mapType(yamlType) {
|
|
56
|
+
return this.typeMapping[yamlType] || 'any';
|
|
57
|
+
}
|
|
58
|
+
generateRowFields(modelConfig) {
|
|
59
|
+
const fields = [];
|
|
60
|
+
modelConfig.fields.forEach(field => {
|
|
61
|
+
if (field.name === 'createdAt') {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const tsType = this.mapType(field.type);
|
|
65
|
+
const isOptional = !field.required && !field.auto;
|
|
66
|
+
const fieldDef = ` ${field.name}${isOptional ? '?' : ''}: ${tsType};`;
|
|
67
|
+
fields.push(fieldDef);
|
|
68
|
+
});
|
|
69
|
+
return fields.join('\n');
|
|
70
|
+
}
|
|
71
|
+
generateFilterableFields(modelConfig) {
|
|
72
|
+
const filterableFields = modelConfig.fields
|
|
73
|
+
.filter(field => ['string', 'number', 'boolean'].includes(field.type))
|
|
74
|
+
.map(field => `'${field.name}'`);
|
|
75
|
+
return filterableFields.join(' | ');
|
|
76
|
+
}
|
|
77
|
+
generateFilterableFieldsArray(modelConfig) {
|
|
78
|
+
const filterableFields = modelConfig.fields
|
|
79
|
+
.filter(field => ['string', 'number', 'boolean'].includes(field.type))
|
|
80
|
+
.map(field => `'${field.name}'`);
|
|
81
|
+
return filterableFields.join(', ');
|
|
82
|
+
}
|
|
83
|
+
generateUpdatableFieldsArray(modelConfig) {
|
|
84
|
+
const updatableFields = modelConfig.fields
|
|
85
|
+
.filter(field => field.name !== 'id' && field.name !== 'createdAt')
|
|
86
|
+
.map(field => `'${field.name}'`);
|
|
87
|
+
return updatableFields.join(', ');
|
|
88
|
+
}
|
|
89
|
+
generateRowToModelMapping(modelConfig) {
|
|
90
|
+
const mappings = modelConfig.fields.map(field => {
|
|
91
|
+
if (field.name === 'createdAt') {
|
|
92
|
+
return ' row.created_at';
|
|
93
|
+
}
|
|
94
|
+
return ` row.${field.name}`;
|
|
95
|
+
});
|
|
96
|
+
return mappings.join(',\n');
|
|
97
|
+
}
|
|
98
|
+
generateModelToRowMapping(modelConfig) {
|
|
99
|
+
const mappings = modelConfig.fields.map(field => {
|
|
100
|
+
if (field.name === 'createdAt') {
|
|
101
|
+
return ' created_at: model.createdAt';
|
|
102
|
+
}
|
|
103
|
+
return ` ${field.name}: model.${field.name}`;
|
|
104
|
+
});
|
|
105
|
+
return mappings.join(',\n');
|
|
106
|
+
}
|
|
107
|
+
replaceTemplateVars(template, variables) {
|
|
108
|
+
let result = template;
|
|
109
|
+
Object.entries(variables).forEach(([key, value]) => {
|
|
110
|
+
const regex = new RegExp(`{{${key}}}`, 'g');
|
|
111
|
+
result = result.replace(regex, value);
|
|
112
|
+
});
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
generateStoreInterface() {
|
|
116
|
+
return storeTemplates_1.fileTemplates.storeInterface;
|
|
117
|
+
}
|
|
118
|
+
generateStore(modelConfig) {
|
|
119
|
+
const entityName = modelConfig.name;
|
|
120
|
+
const tableName = entityName.toLowerCase() + 's';
|
|
121
|
+
const variables = {
|
|
122
|
+
ENTITY_NAME: entityName,
|
|
123
|
+
TABLE_NAME: tableName,
|
|
124
|
+
ROW_FIELDS: this.generateRowFields(modelConfig),
|
|
125
|
+
FILTERABLE_FIELDS: this.generateFilterableFields(modelConfig),
|
|
126
|
+
FILTERABLE_FIELDS_ARRAY: this.generateFilterableFieldsArray(modelConfig),
|
|
127
|
+
UPDATABLE_FIELDS_ARRAY: this.generateUpdatableFieldsArray(modelConfig),
|
|
128
|
+
ROW_TO_MODEL_MAPPING: this.generateRowToModelMapping(modelConfig),
|
|
129
|
+
MODEL_TO_ROW_MAPPING: this.generateModelToRowMapping(modelConfig)
|
|
130
|
+
};
|
|
131
|
+
const rowInterface = this.replaceTemplateVars(storeTemplates_1.storeTemplates.rowInterface, variables);
|
|
132
|
+
const conversionMethods = this.replaceTemplateVars(storeTemplates_1.storeTemplates.conversionMethods, variables);
|
|
133
|
+
const storeClass = this.replaceTemplateVars(storeTemplates_1.storeTemplates.storeClass, {
|
|
134
|
+
...variables,
|
|
135
|
+
CONVERSION_METHODS: conversionMethods
|
|
136
|
+
});
|
|
137
|
+
return this.replaceTemplateVars(storeTemplates_1.fileTemplates.storeFile, {
|
|
138
|
+
ENTITY_NAME: entityName,
|
|
139
|
+
ROW_INTERFACE: rowInterface,
|
|
140
|
+
STORE_CLASS: storeClass
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
generateStores(models) {
|
|
144
|
+
const result = {};
|
|
145
|
+
models.forEach(model => {
|
|
146
|
+
result[model.name] = this.generateStore(model);
|
|
147
|
+
});
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
generateFromYamlFile(yamlFilePath) {
|
|
151
|
+
const yamlContent = fs.readFileSync(yamlFilePath, 'utf8');
|
|
152
|
+
const config = (0, yaml_1.parse)(yamlContent);
|
|
153
|
+
const result = {};
|
|
154
|
+
if (config.modules) {
|
|
155
|
+
Object.values(config.modules).forEach(moduleConfig => {
|
|
156
|
+
if (moduleConfig.models && moduleConfig.models.length > 0) {
|
|
157
|
+
const stores = this.generateStores(moduleConfig.models);
|
|
158
|
+
Object.assign(result, stores);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
else if (config.models) {
|
|
163
|
+
const module = config;
|
|
164
|
+
if (module.models && module.models.length > 0) {
|
|
165
|
+
const stores = this.generateStores(module.models);
|
|
166
|
+
Object.assign(result, stores);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
async generateAndSaveFiles(yamlFilePath = 'app.yaml', outputDir = 'infrastructure', opts) {
|
|
172
|
+
const stores = this.generateFromYamlFile(yamlFilePath);
|
|
173
|
+
const storesDir = path.join(outputDir, 'stores');
|
|
174
|
+
const interfacesDir = path.join(outputDir, 'interfaces');
|
|
175
|
+
fs.mkdirSync(storesDir, { recursive: true });
|
|
176
|
+
fs.mkdirSync(interfacesDir, { recursive: true });
|
|
177
|
+
const storeInterface = this.generateStoreInterface();
|
|
178
|
+
const interfaceFilePath = path.join(interfacesDir, 'StoreInterface.ts');
|
|
179
|
+
await (0, generationRegistry_1.writeGeneratedFile)(interfaceFilePath, storeInterface, { force: !!(opts === null || opts === void 0 ? void 0 : opts.force), skipOnConflict: !!(opts === null || opts === void 0 ? void 0 : opts.skipOnConflict) });
|
|
180
|
+
for (const [entityName, storeCode] of Object.entries(stores)) {
|
|
181
|
+
const fileName = `${entityName}Store.ts`;
|
|
182
|
+
const filePath = path.join(storesDir, fileName);
|
|
183
|
+
// eslint-disable-next-line no-await-in-loop
|
|
184
|
+
await (0, generationRegistry_1.writeGeneratedFile)(filePath, storeCode, { force: !!(opts === null || opts === void 0 ? void 0 : opts.force), skipOnConflict: !!(opts === null || opts === void 0 ? void 0 : opts.skipOnConflict) });
|
|
185
|
+
}
|
|
186
|
+
// eslint-disable-next-line no-console
|
|
187
|
+
console.log('\n' + colors_1.colors.green('All store files generated successfully!') + '\n');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.StoreGeneratorV2 = StoreGeneratorV2;
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
+
import { ModuleConfig } from '../types/configTypes';
|
|
1
2
|
export declare class TemplateGenerator {
|
|
3
|
+
private valueObjects;
|
|
2
4
|
/**
|
|
3
|
-
*
|
|
5
|
+
* Convert a route prefix like "/invoice/:invoiceId/items" into a
|
|
6
|
+
* template-ready path like "/invoice/{{ invoiceId }}/items".
|
|
4
7
|
*/
|
|
5
|
-
private
|
|
8
|
+
private prefixToTemplatePath;
|
|
6
9
|
/**
|
|
7
|
-
*
|
|
10
|
+
* Replace a single path param in prefix with a template expression (e.g. for list: item.id, for detail: id).
|
|
8
11
|
*/
|
|
9
|
-
private
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
generateFromYamlFile(yamlFilePath: string): Record<string,
|
|
23
|
-
|
|
24
|
-
contents: string;
|
|
25
|
-
}>;
|
|
26
|
-
generateAndSaveFiles(yamlFilePath: string, _outputDir: string | undefined, opts?: {
|
|
12
|
+
private prefixWithParam;
|
|
13
|
+
private renderListTemplate;
|
|
14
|
+
private renderChildTableSection;
|
|
15
|
+
private renderDetailTemplate;
|
|
16
|
+
private buildFieldTypesJson;
|
|
17
|
+
private renderFormTemplate;
|
|
18
|
+
private renderCreateTemplate;
|
|
19
|
+
private renderEditTemplate;
|
|
20
|
+
private getInputType;
|
|
21
|
+
private renderValueObjectField;
|
|
22
|
+
private renderFormField;
|
|
23
|
+
private getEnumValuesMap;
|
|
24
|
+
generateFromConfig(config: ModuleConfig): Record<string, string>;
|
|
25
|
+
generateFromYamlFile(yamlFilePath: string): Record<string, string>;
|
|
26
|
+
generateAndSaveFiles(yamlFilePath: string, moduleDir: string, opts?: {
|
|
27
27
|
force?: boolean;
|
|
28
28
|
skipOnConflict?: boolean;
|
|
29
29
|
}): Promise<void>;
|