@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cli.js +0 -0
  3. package/dist/generators/controllerGenerator.d.ts +7 -0
  4. package/dist/generators/controllerGenerator.js +56 -17
  5. package/dist/generators/domainLayerGenerator.js +17 -7
  6. package/dist/generators/dtoGenerator.js +13 -8
  7. package/dist/generators/serviceGenerator.d.ts +6 -0
  8. package/dist/generators/serviceGenerator.js +219 -23
  9. package/dist/generators/storeGenerator.d.ts +4 -0
  10. package/dist/generators/storeGenerator.js +116 -9
  11. package/dist/generators/templates/appTemplates.js +1 -1
  12. package/dist/generators/templates/data/frontendScriptTemplate +11 -4
  13. package/dist/generators/templates/data/mainViewTemplate +1 -0
  14. package/dist/generators/templates/storeTemplates.d.ts +1 -1
  15. package/dist/generators/templates/storeTemplates.js +3 -26
  16. package/dist/generators/useCaseGenerator.js +6 -3
  17. package/dist/types/configTypes.d.ts +1 -0
  18. package/dist/utils/typeUtils.d.ts +4 -0
  19. package/dist/utils/typeUtils.js +7 -0
  20. package/package.json +1 -1
  21. package/dist/commands/migratePush.d.ts +0 -1
  22. package/dist/commands/migratePush.js +0 -135
  23. package/dist/commands/migrateUpdate.d.ts +0 -1
  24. package/dist/commands/migrateUpdate.js +0 -147
  25. package/dist/commands/newGenerateAll.d.ts +0 -4
  26. package/dist/commands/newGenerateAll.js +0 -336
  27. package/dist/generators/domainModelGenerator.d.ts +0 -41
  28. package/dist/generators/domainModelGenerator.js +0 -242
  29. package/dist/generators/newControllerGenerator.d.ts +0 -55
  30. package/dist/generators/newControllerGenerator.js +0 -644
  31. package/dist/generators/newServiceGenerator.d.ts +0 -19
  32. package/dist/generators/newServiceGenerator.js +0 -266
  33. package/dist/generators/newStoreGenerator.d.ts +0 -39
  34. package/dist/generators/newStoreGenerator.js +0 -408
  35. package/dist/generators/newTemplateGenerator.d.ts +0 -29
  36. package/dist/generators/newTemplateGenerator.js +0 -510
  37. package/dist/generators/storeGeneratorV2.d.ts +0 -31
  38. package/dist/generators/storeGeneratorV2.js +0 -190
  39. package/dist/generators/templates/controllerTemplates.d.ts +0 -43
  40. package/dist/generators/templates/controllerTemplates.js +0 -82
  41. package/dist/generators/templates/newStoreTemplates.d.ts +0 -5
  42. package/dist/generators/templates/newStoreTemplates.js +0 -141
  43. package/dist/generators/templates/serviceTemplates.d.ts +0 -16
  44. package/dist/generators/templates/serviceTemplates.js +0 -59
  45. package/dist/generators/templates/validationTemplates.d.ts +0 -25
  46. package/dist/generators/templates/validationTemplates.js +0 -66
  47. package/dist/generators/templates/viewTemplates.d.ts +0 -25
  48. package/dist/generators/templates/viewTemplates.js +0 -491
  49. package/dist/generators/validationGenerator.d.ts +0 -29
  50. package/dist/generators/validationGenerator.js +0 -250
  51. package/dist/utils/new_parts_of_migrationUtils.d.ts +0 -0
  52. 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
- }