@edifice.io/edifice-nestjs-core 1.0.0-develop-pedago.1 → 1.0.0-develop-pedago.3

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/README.md CHANGED
@@ -845,11 +845,6 @@ Access your API documentation at `/openapi`.
845
845
  - **Entity Naming**: Database entity naming conventions
846
846
  - **Static Assets**: Static file serving utilities
847
847
 
848
- ### CLI Tools
849
-
850
- - **edifice-generate-entities**: Generate MikroORM entities from database schema
851
- - **edifice-generate-metadata**: Generate application metadata file
852
-
853
848
  ## 📖 Usage
854
849
 
855
850
  ### Basic Setup
@@ -868,18 +863,92 @@ export class AppModule {}
868
863
 
869
864
  ### CLI Tools
870
865
 
871
- #### Generate Entities
866
+ This package provides several CLI tools to help you automate common backend tasks.
867
+ Each tool is available as a binary when you install `@edifice.io/edifice-nestjs-core`.
868
+
869
+ - **edifice-generate-entities**: Generate MikroORM entities from database schema
870
+ - **edifice-generate-metadata**: Generate application metadata file
871
+ - **edifice-k6-sync-dto**: Synchronize DTOs for K6 Testing
872
+
873
+ ---
874
+
875
+ #### Generate entities
872
876
 
877
+ **Purpose:**
878
+ Generate MikroORM entity files from your PostgreSQL database schema.
879
+
880
+ **Usage:**
873
881
  ```bash
874
- pnpm edifice-generate-entities --schema myschema
882
+ pnpm edifice-generate-entities --schema <schema-name> [options]
875
883
  ```
876
884
 
877
- #### Generate Metadata
885
+ **Arguments:**
886
+ - `--schema` (required): Name of the database schema to use for entity generation.
887
+ - `--path`: Target directory for generated entities (default: `./src/entities`).
888
+ - `--temp-dir`: Temporary directory for initial generation (default: `./src/temp/entities`).
889
+ - `--mapping-config`: Path to entity-module mapping file (default: `./src/config/entity-mapping.config.json`).
890
+ - `--keep-temp`: Keep temporary directory after generation (`true` or `false`, default: `false`).
878
891
 
892
+ **Examples:**
893
+ ```bash
894
+ pnpm edifice-generate-entities --schema community
895
+ pnpm edifice-generate-entities --schema community --temp-dir ./src/temp --path ./src/entities
896
+ pnpm edifice-generate-entities --schema community --mapping-config ./src/config/entity-mapping.config.json
897
+ pnpm edifice-generate-entities --schema community --keep-temp true
898
+ ```
899
+
900
+ ---
901
+
902
+ #### Generate metadata
903
+
904
+ **Purpose:**
905
+ Generate a build metadata file containing build date, git commit hash, and branch name.
906
+
907
+ **Usage:**
908
+ ```bash
909
+ pnpm edifice-generate-metadata <target-file-path>
910
+ ```
911
+
912
+ **Arguments:**
913
+ - `<target-file-path>` (required): Path to the file where metadata will be written.
914
+
915
+ **Example:**
879
916
  ```bash
880
917
  pnpm edifice-generate-metadata ./dist/metadata.txt
881
918
  ```
882
919
 
920
+ ---
921
+
922
+ #### Sync K6 DTO
923
+
924
+ **Purpose:**
925
+ Synchronize DTO TypeScript definitions to K6-compatible types for API testing.
926
+
927
+ **Usage:**
928
+ ```bash
929
+ pnpm edifice-k6-sync-dto
930
+ ```
931
+
932
+ **Arguments:**
933
+ This script uses configuration constants for DTOs and output paths.
934
+ You can adjust the paths in the script or via environment variables if supported.
935
+
936
+ **Example:**
937
+ ```bash
938
+ pnpm edifice-k6-sync-dto
939
+ ```
940
+
941
+ **Details:**
942
+ - Parses DTOs from `client/rest/src/dtos`.
943
+ - Generates K6-compatible types in `types/generated`.
944
+ - Excludes files named `index.ts` by default.
945
+
946
+ ---
947
+
948
+ **Note:**
949
+ All CLI tools are available after installing the package.
950
+ You can run them with `pnpm` or `npx` from your project root.
951
+
883
952
  ## 🔧 Configuration
884
953
 
885
954
  The core module uses NestJS `ConfigModule` for configuration. You can provide configuration through environment variables or configuration files.
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ interface ParsedType {
3
+ name: string;
4
+ kind: 'interface' | 'enum' | 'type' | 'class';
5
+ properties?: Array<{
6
+ name: string;
7
+ type: string;
8
+ optional: boolean;
9
+ description?: string;
10
+ }>;
11
+ enumValues?: Array<{
12
+ name: string;
13
+ value: string;
14
+ description?: string;
15
+ }>;
16
+ description?: string;
17
+ dependencies?: Set<string>;
18
+ extendsClause?: string;
19
+ }
20
+ export interface GeneratedFile {
21
+ filename: string;
22
+ types: ParsedType[];
23
+ dependencies: Set<string>;
24
+ }
25
+ declare function main(): Promise<void>;
26
+ export { main as syncDtoTypes };
@@ -0,0 +1,383 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.syncDtoTypes = main;
38
+ const ts = __importStar(require("typescript"));
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const CONFIG = {
42
+ DTOS_PATH: '../../../../client/rest/src/dtos',
43
+ OUTPUT_PATH: '../types/generated',
44
+ EXCLUDE_FILES: ['index.ts'],
45
+ DTO_SUFFIX: 'Dto',
46
+ };
47
+ function parseTypeScriptFile(filePath) {
48
+ const program = ts.createProgram([filePath], {
49
+ target: ts.ScriptTarget.ES2020,
50
+ module: ts.ModuleKind.ESNext,
51
+ allowJs: false,
52
+ skipLibCheck: true,
53
+ skipDefaultLibCheck: true,
54
+ });
55
+ const sourceFile = program.getSourceFile(filePath);
56
+ if (!sourceFile) {
57
+ throw new Error(`Could not parse file: ${filePath}`);
58
+ }
59
+ const checker = program.getTypeChecker();
60
+ const types = [];
61
+ function visit(node) {
62
+ if (ts.isEnumDeclaration(node) && hasExportModifier(node)) {
63
+ const enumType = parseEnum(node);
64
+ if (enumType)
65
+ types.push(enumType);
66
+ }
67
+ if (ts.isClassDeclaration(node) && hasExportModifier(node)) {
68
+ const classType = parseClass(node, checker);
69
+ if (classType)
70
+ types.push(classType);
71
+ }
72
+ if (ts.isInterfaceDeclaration(node) && hasExportModifier(node)) {
73
+ const interfaceType = parseInterface(node, checker);
74
+ if (interfaceType)
75
+ types.push(interfaceType);
76
+ }
77
+ if (ts.isTypeAliasDeclaration(node) && hasExportModifier(node)) {
78
+ const typeAlias = parseTypeAlias(node, checker);
79
+ if (typeAlias)
80
+ types.push(typeAlias);
81
+ }
82
+ ts.forEachChild(node, visit);
83
+ }
84
+ visit(sourceFile);
85
+ return types;
86
+ }
87
+ function hasExportModifier(node) {
88
+ return ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Export
89
+ ? true
90
+ : false;
91
+ }
92
+ function parseEnum(node) {
93
+ const name = node.name.text;
94
+ const enumValues = [];
95
+ for (const member of node.members) {
96
+ const memberName = member.name?.getText() || '';
97
+ let memberValue = memberName;
98
+ if (member.initializer && ts.isStringLiteral(member.initializer)) {
99
+ memberValue = member.initializer.text;
100
+ }
101
+ const description = getJSDocDescription(member);
102
+ enumValues.push({
103
+ name: memberName,
104
+ value: memberValue,
105
+ description,
106
+ });
107
+ }
108
+ return {
109
+ name,
110
+ kind: 'enum',
111
+ enumValues,
112
+ description: getJSDocDescription(node),
113
+ };
114
+ }
115
+ function parseClass(node, _checker) {
116
+ if (!node.name)
117
+ return null;
118
+ const className = node.name.text;
119
+ const name = className;
120
+ const properties = [];
121
+ const dependencies = new Set();
122
+ let extendsClause = '';
123
+ if (node.heritageClauses) {
124
+ for (const heritage of node.heritageClauses) {
125
+ if (heritage.token === ts.SyntaxKind.ExtendsKeyword) {
126
+ for (const type of heritage.types) {
127
+ const baseClassName = type.expression.getText();
128
+ extendsClause = baseClassName;
129
+ dependencies.add(baseClassName);
130
+ break;
131
+ }
132
+ }
133
+ }
134
+ }
135
+ for (const member of node.members) {
136
+ if (ts.isPropertyDeclaration(member) && member.name) {
137
+ const propertyName = member.name.getText();
138
+ const optional = !!member.questionToken;
139
+ let typeString = 'unknown';
140
+ if (member.type) {
141
+ typeString = convertTypeNode(member.type, dependencies);
142
+ }
143
+ const description = getJSDocDescription(member);
144
+ properties.push({
145
+ name: propertyName,
146
+ type: typeString,
147
+ optional,
148
+ description,
149
+ });
150
+ }
151
+ }
152
+ return {
153
+ name,
154
+ kind: 'interface',
155
+ properties,
156
+ dependencies,
157
+ description: getJSDocDescription(node),
158
+ extendsClause,
159
+ };
160
+ }
161
+ function parseInterface(node, _checker) {
162
+ const name = node.name.text;
163
+ const properties = [];
164
+ const dependencies = new Set();
165
+ for (const member of node.members) {
166
+ if (ts.isPropertySignature(member) && member.name) {
167
+ const propertyName = member.name.getText();
168
+ const optional = !!member.questionToken;
169
+ let typeString = 'unknown';
170
+ if (member.type) {
171
+ typeString = convertTypeNode(member.type, dependencies);
172
+ }
173
+ const description = getJSDocDescription(member);
174
+ properties.push({
175
+ name: propertyName,
176
+ type: typeString,
177
+ optional,
178
+ description,
179
+ });
180
+ }
181
+ }
182
+ return {
183
+ name,
184
+ kind: 'interface',
185
+ properties,
186
+ dependencies,
187
+ description: getJSDocDescription(node),
188
+ };
189
+ }
190
+ function parseTypeAlias(node, _checker) {
191
+ const name = node.name.text;
192
+ const dependencies = new Set();
193
+ let typeString = 'unknown';
194
+ if (node.type) {
195
+ typeString = convertTypeNode(node.type, dependencies);
196
+ }
197
+ return {
198
+ name,
199
+ kind: 'type',
200
+ properties: [
201
+ {
202
+ name: name,
203
+ type: typeString,
204
+ optional: false,
205
+ description: getJSDocDescription(node),
206
+ },
207
+ ],
208
+ dependencies,
209
+ description: getJSDocDescription(node),
210
+ };
211
+ }
212
+ function convertTypeNode(typeNode, dependencies) {
213
+ switch (typeNode.kind) {
214
+ case ts.SyntaxKind.StringKeyword:
215
+ return 'string';
216
+ case ts.SyntaxKind.NumberKeyword:
217
+ return 'number';
218
+ case ts.SyntaxKind.BooleanKeyword:
219
+ return 'boolean';
220
+ case ts.SyntaxKind.AnyKeyword:
221
+ return 'unknown';
222
+ case ts.SyntaxKind.ArrayType: {
223
+ const arrayType = typeNode;
224
+ return `${convertTypeNode(arrayType.elementType, dependencies)}[]`;
225
+ }
226
+ case ts.SyntaxKind.TypeReference: {
227
+ const typeRef = typeNode;
228
+ const typeName = typeRef.typeName.getText();
229
+ dependencies.add(typeName);
230
+ return typeName;
231
+ }
232
+ default: {
233
+ const fullText = typeNode.getText();
234
+ return fullText;
235
+ }
236
+ }
237
+ }
238
+ function getJSDocDescription(node) {
239
+ const jsDocTags = ts.getJSDocTags(node);
240
+ const jsDoc = jsDocTags.find((tag) => tag.kind === ts.SyntaxKind.JSDoc);
241
+ if (jsDoc && 'comment' in jsDoc && jsDoc.comment) {
242
+ return typeof jsDoc.comment === 'string'
243
+ ? jsDoc.comment
244
+ : jsDoc.comment.map((c) => c.text).join('');
245
+ }
246
+ return undefined;
247
+ }
248
+ function generateTypeScript(types, category, allGeneratedFiles) {
249
+ let content = `// Types automatically generated from DTOs using TypeScript Compiler API\n`;
250
+ content += `// Category: ${category}\n`;
251
+ content += `// Generated on: ${new Date().toISOString()}\n\n`;
252
+ const allDependencies = new Set();
253
+ for (const type of types) {
254
+ if (type.dependencies) {
255
+ type.dependencies.forEach((dep) => allDependencies.add(dep));
256
+ }
257
+ }
258
+ const imports = new Map();
259
+ for (const dependency of allDependencies) {
260
+ for (const [filename, fileTypes] of allGeneratedFiles) {
261
+ if (filename !== category &&
262
+ fileTypes.some((t) => t.name === dependency)) {
263
+ if (!imports.has(filename)) {
264
+ imports.set(filename, new Set());
265
+ }
266
+ imports.get(filename).add(dependency);
267
+ break;
268
+ }
269
+ }
270
+ }
271
+ for (const [filename, importedTypes] of imports) {
272
+ const sortedTypes = Array.from(importedTypes).sort();
273
+ content += `import { ${sortedTypes.join(', ')} } from "./${filename}";\n`;
274
+ }
275
+ if (imports.size > 0) {
276
+ content += '\n';
277
+ }
278
+ const enums = types.filter((t) => t.kind === 'enum');
279
+ for (const enumType of enums) {
280
+ if (enumType.description) {
281
+ content += `/**\n * ${enumType.description}\n */\n`;
282
+ }
283
+ content += `export enum ${enumType.name} {\n`;
284
+ for (const value of enumType.enumValues || []) {
285
+ if (value.description) {
286
+ content += ` /** ${value.description} */\n`;
287
+ }
288
+ content += ` ${value.name} = "${value.value}",\n`;
289
+ }
290
+ content += `}\n\n`;
291
+ }
292
+ const interfaces = types.filter((t) => t.kind === 'interface');
293
+ for (const interfaceType of interfaces) {
294
+ if (interfaceType.description) {
295
+ content += `/**\n * ${interfaceType.description}\n */\n`;
296
+ }
297
+ let extendsClause = '';
298
+ if (interfaceType.extendsClause) {
299
+ extendsClause = ` extends ${interfaceType.extendsClause}`;
300
+ }
301
+ content += `export interface ${interfaceType.name}${extendsClause} {\n`;
302
+ for (const prop of interfaceType.properties || []) {
303
+ if (prop.description) {
304
+ content += ` /** ${prop.description} */\n`;
305
+ }
306
+ const optional = prop.optional ? '?' : '';
307
+ content += ` ${prop.name}${optional}: ${prop.type};\n`;
308
+ }
309
+ content += `}\n\n`;
310
+ }
311
+ const typeAliases = types.filter((t) => t.kind === 'type');
312
+ for (const typeAlias of typeAliases) {
313
+ if (typeAlias.description) {
314
+ content += `/**\n * ${typeAlias.description}\n */\n`;
315
+ }
316
+ const typeDefinition = typeAlias.properties?.[0]?.type || 'unknown';
317
+ content += `export type ${typeAlias.name} = ${typeDefinition};\n\n`;
318
+ }
319
+ return content;
320
+ }
321
+ async function main() {
322
+ console.log('🚀 Advanced DTO to K6 types synchronization started...');
323
+ try {
324
+ const dtosDir = path.resolve(__dirname, CONFIG.DTOS_PATH);
325
+ const outputDir = path.resolve(__dirname, CONFIG.OUTPUT_PATH);
326
+ if (!fs.existsSync(dtosDir)) {
327
+ console.error(`❌ DTOs folder not found: ${dtosDir}`);
328
+ process.exit(1);
329
+ }
330
+ if (fs.existsSync(outputDir)) {
331
+ fs.rmSync(outputDir, { recursive: true });
332
+ }
333
+ fs.mkdirSync(outputDir, { recursive: true });
334
+ const dtoFiles = fs
335
+ .readdirSync(dtosDir)
336
+ .filter((file) => file.endsWith('.ts') && !CONFIG.EXCLUDE_FILES.includes(file));
337
+ console.log(`📁 Found ${dtoFiles.length} DTO files to process`);
338
+ const allParsedFiles = new Map();
339
+ for (const file of dtoFiles) {
340
+ const filePath = path.join(dtosDir, file);
341
+ const category = path.basename(file, '.ts');
342
+ console.log(`⚙️ Parsing ${file} with TypeScript Compiler API...`);
343
+ try {
344
+ const types = parseTypeScriptFile(filePath);
345
+ allParsedFiles.set(category, types);
346
+ }
347
+ catch (error) {
348
+ console.error(`❌ Error parsing ${file}:`, error);
349
+ }
350
+ }
351
+ const generatedFiles = [];
352
+ for (const [category, types] of allParsedFiles) {
353
+ if (types.length > 0) {
354
+ const outputPath = path.join(outputDir, `${category}.ts`);
355
+ const content = generateTypeScript(types, category, allParsedFiles);
356
+ fs.writeFileSync(outputPath, content);
357
+ generatedFiles.push(category);
358
+ console.log(`✅ Generated ${types.length} types in ${outputPath}`);
359
+ }
360
+ else {
361
+ console.log(`⚠️ No exportable types found in ${category}.ts`);
362
+ }
363
+ }
364
+ generateIndex(outputDir, generatedFiles);
365
+ console.log(`✨ Synchronization completed! Generated ${generatedFiles.length} files.`);
366
+ }
367
+ catch (error) {
368
+ console.error('❌ Error during synchronization:', error);
369
+ process.exit(1);
370
+ }
371
+ }
372
+ function generateIndex(outputDir, files) {
373
+ let indexContent = '// Index of automatically generated K6 types\n';
374
+ indexContent += `// Generated on: ${new Date().toISOString()}\n\n`;
375
+ for (const file of files) {
376
+ indexContent += `export * from "./${file}.ts";\n`;
377
+ }
378
+ const indexPath = path.join(outputDir, 'index.ts');
379
+ fs.writeFileSync(indexPath, indexContent);
380
+ console.log(`📝 Index file generated: ${indexPath}`);
381
+ }
382
+ main();
383
+ //# sourceMappingURL=k6-sync-dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k6-sync-dto.js","sourceRoot":"","sources":["../../src/bin/k6-sync-dto.ts"],"names":[],"mappings":"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"}