@currentjs/gen 0.5.0 → 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 +10 -0
- package/dist/cli.js +0 -0
- package/dist/generators/controllerGenerator.d.ts +7 -0
- package/dist/generators/controllerGenerator.js +56 -17
- package/dist/generators/domainLayerGenerator.js +17 -7
- package/dist/generators/dtoGenerator.js +13 -8
- package/dist/generators/serviceGenerator.d.ts +6 -0
- package/dist/generators/serviceGenerator.js +219 -23
- package/dist/generators/storeGenerator.d.ts +4 -0
- package/dist/generators/storeGenerator.js +116 -9
- package/dist/generators/templates/appTemplates.js +1 -1
- package/dist/generators/templates/data/frontendScriptTemplate +11 -4
- package/dist/generators/templates/data/mainViewTemplate +1 -0
- package/dist/generators/templates/storeTemplates.d.ts +1 -1
- package/dist/generators/templates/storeTemplates.js +3 -26
- package/dist/generators/useCaseGenerator.js +6 -3
- package/dist/types/configTypes.d.ts +1 -0
- package/dist/utils/typeUtils.d.ts +4 -0
- package/dist/utils/typeUtils.js +7 -0
- package/package.json +1 -1
- package/dist/commands/migratePush.d.ts +0 -1
- package/dist/commands/migratePush.js +0 -135
- package/dist/commands/migrateUpdate.d.ts +0 -1
- package/dist/commands/migrateUpdate.js +0 -147
- package/dist/commands/newGenerateAll.d.ts +0 -4
- package/dist/commands/newGenerateAll.js +0 -336
- package/dist/generators/domainModelGenerator.d.ts +0 -41
- package/dist/generators/domainModelGenerator.js +0 -242
- package/dist/generators/newControllerGenerator.d.ts +0 -55
- package/dist/generators/newControllerGenerator.js +0 -644
- package/dist/generators/newServiceGenerator.d.ts +0 -19
- package/dist/generators/newServiceGenerator.js +0 -266
- package/dist/generators/newStoreGenerator.d.ts +0 -39
- package/dist/generators/newStoreGenerator.js +0 -408
- package/dist/generators/newTemplateGenerator.d.ts +0 -29
- package/dist/generators/newTemplateGenerator.js +0 -510
- package/dist/generators/storeGeneratorV2.d.ts +0 -31
- package/dist/generators/storeGeneratorV2.js +0 -190
- package/dist/generators/templates/controllerTemplates.d.ts +0 -43
- package/dist/generators/templates/controllerTemplates.js +0 -82
- package/dist/generators/templates/newStoreTemplates.d.ts +0 -5
- package/dist/generators/templates/newStoreTemplates.js +0 -141
- 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
- package/dist/utils/new_parts_of_migrationUtils.d.ts +0 -0
- package/dist/utils/new_parts_of_migrationUtils.js +0 -164
|
@@ -1,242 +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.DomainModelGenerator = void 0;
|
|
37
|
-
const yaml_1 = require("yaml");
|
|
38
|
-
const fs = __importStar(require("fs"));
|
|
39
|
-
const path = __importStar(require("path"));
|
|
40
|
-
const generationRegistry_1 = require("../utils/generationRegistry");
|
|
41
|
-
const colors_1 = require("../utils/colors");
|
|
42
|
-
class DomainModelGenerator {
|
|
43
|
-
constructor() {
|
|
44
|
-
this.typeMapping = {
|
|
45
|
-
string: 'string',
|
|
46
|
-
number: 'number',
|
|
47
|
-
boolean: 'boolean',
|
|
48
|
-
datetime: 'Date',
|
|
49
|
-
json: 'any',
|
|
50
|
-
array: 'any[]',
|
|
51
|
-
object: 'object'
|
|
52
|
-
};
|
|
53
|
-
this.availableModels = new Set();
|
|
54
|
-
}
|
|
55
|
-
getDefaultValue(type) {
|
|
56
|
-
switch (type) {
|
|
57
|
-
case 'datetime':
|
|
58
|
-
return 'new Date()';
|
|
59
|
-
case 'string':
|
|
60
|
-
return "''";
|
|
61
|
-
case 'number':
|
|
62
|
-
return '0';
|
|
63
|
-
case 'boolean':
|
|
64
|
-
return 'false';
|
|
65
|
-
case 'array':
|
|
66
|
-
return '[]';
|
|
67
|
-
case 'object':
|
|
68
|
-
case 'json':
|
|
69
|
-
return '{}';
|
|
70
|
-
default:
|
|
71
|
-
return 'undefined';
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
mapType(yamlType) {
|
|
75
|
-
// Check if this is a known model (relationship)
|
|
76
|
-
if (this.availableModels.has(yamlType)) {
|
|
77
|
-
return yamlType;
|
|
78
|
-
}
|
|
79
|
-
return this.typeMapping[yamlType] || 'any';
|
|
80
|
-
}
|
|
81
|
-
setAvailableModels(models) {
|
|
82
|
-
this.availableModels.clear();
|
|
83
|
-
models.forEach(model => {
|
|
84
|
-
this.availableModels.add(model.name);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
getRelatedModelImports(modelConfig) {
|
|
88
|
-
const imports = [];
|
|
89
|
-
modelConfig.fields.forEach(field => {
|
|
90
|
-
if (this.availableModels.has(field.type) && field.type !== modelConfig.name) {
|
|
91
|
-
imports.push(`import { ${field.type} } from './${field.type}';`);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
return imports;
|
|
95
|
-
}
|
|
96
|
-
generateConstructorParameter(field) {
|
|
97
|
-
const tsType = this.mapType(field.type);
|
|
98
|
-
const isOptional = !field.required && !field.auto;
|
|
99
|
-
const hasDefault = field.auto;
|
|
100
|
-
let param = `public ${field.name}`;
|
|
101
|
-
if (isOptional && !hasDefault) {
|
|
102
|
-
param += '?';
|
|
103
|
-
}
|
|
104
|
-
param += `: ${tsType}`;
|
|
105
|
-
if (hasDefault) {
|
|
106
|
-
param += ` = ${this.getDefaultValue(field.type)}`;
|
|
107
|
-
}
|
|
108
|
-
return param;
|
|
109
|
-
}
|
|
110
|
-
isRelationshipField(field) {
|
|
111
|
-
return this.availableModels.has(field.type);
|
|
112
|
-
}
|
|
113
|
-
getForeignKeyFieldName(field) {
|
|
114
|
-
// Convention: fieldName + 'Id' (e.g., owner -> ownerId)
|
|
115
|
-
return field.name + 'Id';
|
|
116
|
-
}
|
|
117
|
-
generateForeignKeyParameter(field) {
|
|
118
|
-
const foreignKeyName = this.getForeignKeyFieldName(field);
|
|
119
|
-
const isOptional = !field.required && !field.auto;
|
|
120
|
-
let param = `public ${foreignKeyName}`;
|
|
121
|
-
if (isOptional) {
|
|
122
|
-
param += '?';
|
|
123
|
-
}
|
|
124
|
-
param += ': number';
|
|
125
|
-
return param;
|
|
126
|
-
}
|
|
127
|
-
generateSetterMethods(modelConfig) {
|
|
128
|
-
const setterMethods = [];
|
|
129
|
-
modelConfig.fields.forEach(field => {
|
|
130
|
-
if (!field.auto && field.name !== 'id') {
|
|
131
|
-
const tsType = this.mapType(field.type);
|
|
132
|
-
const methodName = `set${field.name.charAt(0).toUpperCase() + field.name.slice(1)}`;
|
|
133
|
-
// For all fields (including relationships), generate simple setter
|
|
134
|
-
// Domain model doesn't care about FKs - that's infrastructure concern
|
|
135
|
-
const isOptional = !field.required && !field.auto;
|
|
136
|
-
const setter = `
|
|
137
|
-
${methodName}(${field.name}: ${tsType}${isOptional ? ' | undefined' : ''}): void {
|
|
138
|
-
this.${field.name} = ${field.name};
|
|
139
|
-
}`;
|
|
140
|
-
setterMethods.push(setter);
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
return setterMethods.join('\n');
|
|
144
|
-
}
|
|
145
|
-
sortFieldsByRequired(fields) {
|
|
146
|
-
// Sort fields: required fields first, then optional fields
|
|
147
|
-
return [...fields].sort((a, b) => {
|
|
148
|
-
const aRequired = a.required !== false && !a.auto;
|
|
149
|
-
const bRequired = b.required !== false && !b.auto;
|
|
150
|
-
if (aRequired === bRequired) {
|
|
151
|
-
return 0; // Keep original order if both have same required status
|
|
152
|
-
}
|
|
153
|
-
return aRequired ? -1 : 1; // Required fields come first
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
generateModel(modelConfig) {
|
|
157
|
-
const className = modelConfig.name;
|
|
158
|
-
// Always add id field first
|
|
159
|
-
const constructorParams = ['public id: number'];
|
|
160
|
-
// Sort fields to put required fields before optional ones
|
|
161
|
-
const sortedFields = this.sortFieldsByRequired(modelConfig.fields);
|
|
162
|
-
// Process other fields
|
|
163
|
-
sortedFields.forEach(field => {
|
|
164
|
-
// For relationship fields, only add the relationship object (not FK)
|
|
165
|
-
// Domain model works with objects only - FK is infrastructure concern
|
|
166
|
-
constructorParams.push(this.generateConstructorParameter(field));
|
|
167
|
-
});
|
|
168
|
-
const constructorParamsStr = constructorParams.join(',\n ');
|
|
169
|
-
const setterMethods = this.generateSetterMethods(modelConfig);
|
|
170
|
-
// Generate imports for related models
|
|
171
|
-
const imports = this.getRelatedModelImports(modelConfig);
|
|
172
|
-
const importsStr = imports.length > 0 ? imports.join('\n') + '\n\n' : '';
|
|
173
|
-
return `${importsStr}export class ${className} {
|
|
174
|
-
public constructor(
|
|
175
|
-
${constructorParamsStr}
|
|
176
|
-
) { }
|
|
177
|
-
${setterMethods}
|
|
178
|
-
}`;
|
|
179
|
-
}
|
|
180
|
-
generateModels(models) {
|
|
181
|
-
return models.map(model => this.generateModel(model)).join('\n\n');
|
|
182
|
-
}
|
|
183
|
-
generateFromYamlFile(yamlFilePath) {
|
|
184
|
-
const yamlContent = fs.readFileSync(yamlFilePath, 'utf8');
|
|
185
|
-
const config = (0, yaml_1.parse)(yamlContent);
|
|
186
|
-
const result = {};
|
|
187
|
-
if (config.modules) {
|
|
188
|
-
const app = config;
|
|
189
|
-
Object.values(app.modules).forEach(moduleConfig => {
|
|
190
|
-
if (moduleConfig.models && moduleConfig.models.length > 0) {
|
|
191
|
-
// Set available models for relationship detection
|
|
192
|
-
this.setAvailableModels(moduleConfig.models);
|
|
193
|
-
moduleConfig.models.forEach(m => {
|
|
194
|
-
result[m.name] = this.generateModel(m);
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
else if (config.models) {
|
|
200
|
-
const module = config;
|
|
201
|
-
// Set available models for relationship detection
|
|
202
|
-
this.setAvailableModels(module.models);
|
|
203
|
-
module.models.forEach(m => {
|
|
204
|
-
result[m.name] = this.generateModel(m);
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
return result;
|
|
208
|
-
}
|
|
209
|
-
generateFromConfig(config) {
|
|
210
|
-
const result = {};
|
|
211
|
-
if (config.modules) {
|
|
212
|
-
Object.values(config.modules).forEach(moduleConfig => {
|
|
213
|
-
if (moduleConfig.models && moduleConfig.models.length > 0) {
|
|
214
|
-
// Set available models for relationship detection
|
|
215
|
-
this.setAvailableModels(moduleConfig.models);
|
|
216
|
-
moduleConfig.models.forEach(m => {
|
|
217
|
-
result[m.name] = this.generateModel(m);
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
else if (config.models) {
|
|
223
|
-
const module = config;
|
|
224
|
-
// Set available models for relationship detection
|
|
225
|
-
this.setAvailableModels(module.models);
|
|
226
|
-
module.models.forEach(m => {
|
|
227
|
-
result[m.name] = this.generateModel(m);
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
return result;
|
|
231
|
-
}
|
|
232
|
-
async generateAndSaveFiles(yamlFilePath, outputDir, opts) {
|
|
233
|
-
const codeByEntity = this.generateFromYamlFile(yamlFilePath);
|
|
234
|
-
await Promise.all(Object.entries(codeByEntity).map(([entity, code]) => {
|
|
235
|
-
const filePath = path.join(outputDir, `${entity}.ts`);
|
|
236
|
-
return (0, generationRegistry_1.writeGeneratedFile)(filePath, code, { force: !!(opts === null || opts === void 0 ? void 0 : opts.force), skipOnConflict: !!(opts === null || opts === void 0 ? void 0 : opts.skipOnConflict) });
|
|
237
|
-
}));
|
|
238
|
-
// eslint-disable-next-line no-console
|
|
239
|
-
console.log('\n' + colors_1.colors.green('Domain model files generated successfully!') + '\n');
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
exports.DomainModelGenerator = DomainModelGenerator;
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { NewModuleConfig } from '../types/configTypes';
|
|
2
|
-
export declare class NewControllerGenerator {
|
|
3
|
-
private capitalize;
|
|
4
|
-
private getHttpDecorator;
|
|
5
|
-
private parseUseCase;
|
|
6
|
-
/**
|
|
7
|
-
* Normalize auth config to an array of roles
|
|
8
|
-
*/
|
|
9
|
-
private normalizeAuth;
|
|
10
|
-
/**
|
|
11
|
-
* Check if auth config includes owner permission
|
|
12
|
-
*/
|
|
13
|
-
private hasOwnerAuth;
|
|
14
|
-
/**
|
|
15
|
-
* Generate pre-fetch authentication/authorization check code.
|
|
16
|
-
* This runs before fetching the entity and validates authentication and role-based access.
|
|
17
|
-
* @param auth - The auth requirement: 'all', 'authenticated', 'owner', role names, or array of roles
|
|
18
|
-
* @returns Code string for the auth check, or empty string if no check needed
|
|
19
|
-
*/
|
|
20
|
-
private generateAuthCheck;
|
|
21
|
-
/**
|
|
22
|
-
* Generate post-fetch authorization check for owner validation.
|
|
23
|
-
* This runs after fetching the entity and validates ownership.
|
|
24
|
-
* Used for READ operations (get, list) where we check after fetch.
|
|
25
|
-
* For child entities, uses getResourceOwner() since result has no ownerId.
|
|
26
|
-
*/
|
|
27
|
-
private generatePostFetchOwnerCheck;
|
|
28
|
-
/**
|
|
29
|
-
* Generate pre-mutation authorization check for owner validation.
|
|
30
|
-
* This runs BEFORE the mutation to prevent unauthorized changes.
|
|
31
|
-
* Used for WRITE operations (update, delete).
|
|
32
|
-
* @param auth - The auth requirement
|
|
33
|
-
* @param useCaseVar - The use case variable name
|
|
34
|
-
* @returns Code string for the pre-mutation owner check, or empty string if not needed
|
|
35
|
-
*/
|
|
36
|
-
private generatePreMutationOwnerCheck;
|
|
37
|
-
private generateApiEndpointMethod;
|
|
38
|
-
private generateWebPageMethod;
|
|
39
|
-
private generateOnSuccessHandler;
|
|
40
|
-
private generateOnErrorHandler;
|
|
41
|
-
/**
|
|
42
|
-
* Sort routes so static paths are registered before parameterized ones.
|
|
43
|
-
* This prevents parameterized routes (e.g. /:id) from catching requests
|
|
44
|
-
* meant for static routes (e.g. /create).
|
|
45
|
-
*/
|
|
46
|
-
private sortRoutesBySpecificity;
|
|
47
|
-
private generateApiController;
|
|
48
|
-
private generateWebController;
|
|
49
|
-
generateFromConfig(config: NewModuleConfig): Record<string, string>;
|
|
50
|
-
generateFromYamlFile(yamlFilePath: string): Record<string, string>;
|
|
51
|
-
generateAndSaveFiles(yamlFilePath: string, moduleDir: string, opts?: {
|
|
52
|
-
force?: boolean;
|
|
53
|
-
skipOnConflict?: boolean;
|
|
54
|
-
}): Promise<string[]>;
|
|
55
|
-
}
|