@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 +77 -8
- package/dist/bin/k6-sync-dto.d.ts +26 -0
- package/dist/bin/k6-sync-dto.js +383 -0
- package/dist/bin/k6-sync-dto.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/fastify.d.ts +11 -0
- package/dist/types/fastify.js +3 -0
- package/dist/types/fastify.js.map +1 -0
- package/package.json +3 -2
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
|
-
|
|
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
|
|
882
|
+
pnpm edifice-generate-entities --schema <schema-name> [options]
|
|
875
883
|
```
|
|
876
884
|
|
|
877
|
-
|
|
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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"}
|