@edifice.io/edifice-nestjs-core 1.0.0-develop-pedago.20251210153355 → 1.0.0-develop-pedago.20251218101723
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 +35 -0
- package/dist/bin/generate-rest-clients.d.ts +2 -0
- package/dist/bin/generate-rest-clients.js +581 -0
- package/dist/bin/generate-rest-clients.js.map +1 -0
- package/dist/bin/generate-swagger-pdf.d.ts +1 -0
- package/dist/bin/generate-swagger-pdf.js +172 -0
- package/dist/bin/generate-swagger-pdf.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -6
package/README.md
CHANGED
|
@@ -988,6 +988,7 @@ Each tool is available as a binary when you install `@edifice.io/edifice-nestjs-
|
|
|
988
988
|
- **edifice-generate-entities**: Generate MikroORM entities from database schema
|
|
989
989
|
- **edifice-generate-metadata**: Generate application metadata file
|
|
990
990
|
- **edifice-k6-sync-dto**: Synchronize DTOs for K6 Testing
|
|
991
|
+
- **generate-swagger-pdf**: Generate a PDF from your NestJS API Swagger documentation
|
|
991
992
|
|
|
992
993
|
---
|
|
993
994
|
|
|
@@ -1073,6 +1074,40 @@ pnpm edifice-k6-sync-dto
|
|
|
1073
1074
|
|
|
1074
1075
|
---
|
|
1075
1076
|
|
|
1077
|
+
#### generate-swagger-pdf
|
|
1078
|
+
|
|
1079
|
+
**Purpose:**
|
|
1080
|
+
Generate a PDF from the Swagger (OpenAPI) documentation exposed by your NestJS server.
|
|
1081
|
+
|
|
1082
|
+
**Usage:**
|
|
1083
|
+
|
|
1084
|
+
```bash
|
|
1085
|
+
npx generate-swagger-pdf --host <host> --port <port>
|
|
1086
|
+
```
|
|
1087
|
+
|
|
1088
|
+
**Options:**
|
|
1089
|
+
|
|
1090
|
+
- `--host`, `-h`: Swagger server host (default: `127.0.0.1`)
|
|
1091
|
+
- `--port`, `-p`: Swagger server port (default: `3002`)
|
|
1092
|
+
|
|
1093
|
+
The PDF will be generated in the `documentation/api-docs.pdf` folder of your project.
|
|
1094
|
+
|
|
1095
|
+
**Example:**
|
|
1096
|
+
|
|
1097
|
+
```bash
|
|
1098
|
+
npx generate-swagger-pdf --host 127.0.0.1 --port 4000
|
|
1099
|
+
```
|
|
1100
|
+
|
|
1101
|
+
This package provides several CLI tools to help you automate common backend tasks.
|
|
1102
|
+
Each tool is available as a binary when you install `@edifice.io/edifice-nestjs-core`.
|
|
1103
|
+
|
|
1104
|
+
- **edifice-generate-entities**: Generate MikroORM entities from database schema
|
|
1105
|
+
- **edifice-generate-metadata**: Generate application metadata file
|
|
1106
|
+
- **edifice-k6-sync-dto**: Synchronize DTOs for K6 Testing
|
|
1107
|
+
- **generate-swagger-pdf**: Generate a PDF from your NestJS API Swagger documentation
|
|
1108
|
+
|
|
1109
|
+
---
|
|
1110
|
+
|
|
1076
1111
|
**Note:**
|
|
1077
1112
|
All CLI tools are available after installing the package.
|
|
1078
1113
|
You can run them with `pnpm` or `npx` from your project root.
|
|
@@ -0,0 +1,581 @@
|
|
|
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
|
+
const ts = __importStar(require("typescript"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const PRIMITIVE_TYPES = new Set([
|
|
41
|
+
'string',
|
|
42
|
+
'number',
|
|
43
|
+
'boolean',
|
|
44
|
+
'Date',
|
|
45
|
+
'any',
|
|
46
|
+
'void',
|
|
47
|
+
'object',
|
|
48
|
+
'never',
|
|
49
|
+
'unknown',
|
|
50
|
+
'null',
|
|
51
|
+
'undefined',
|
|
52
|
+
]);
|
|
53
|
+
function parseControllers(filePath) {
|
|
54
|
+
const program = ts.createProgram([filePath], {
|
|
55
|
+
target: ts.ScriptTarget.ES2020,
|
|
56
|
+
module: ts.ModuleKind.CommonJS,
|
|
57
|
+
});
|
|
58
|
+
const sourceFile = program.getSourceFile(filePath);
|
|
59
|
+
if (!sourceFile) {
|
|
60
|
+
throw new Error(`Could not load source file: ${filePath}`);
|
|
61
|
+
}
|
|
62
|
+
const controllers = [];
|
|
63
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
64
|
+
if (ts.isClassDeclaration(node) && node.name) {
|
|
65
|
+
const controllerDecorator = getDecorator(node, 'Controller');
|
|
66
|
+
if (!controllerDecorator)
|
|
67
|
+
return;
|
|
68
|
+
const basePath = getDecoratorArgument(controllerDecorator) || '';
|
|
69
|
+
const apiTagDecorator = getDecorator(node, 'ApiTags');
|
|
70
|
+
const tag = apiTagDecorator
|
|
71
|
+
? getDecoratorArgument(apiTagDecorator)
|
|
72
|
+
: undefined;
|
|
73
|
+
const controller = {
|
|
74
|
+
name: node.name.text,
|
|
75
|
+
basePath,
|
|
76
|
+
methods: [],
|
|
77
|
+
jsdoc: getJsDoc(node),
|
|
78
|
+
tag,
|
|
79
|
+
};
|
|
80
|
+
node.members.forEach((member) => {
|
|
81
|
+
if (ts.isMethodDeclaration(member) && member.name) {
|
|
82
|
+
const methodMetadata = parseMethod(member);
|
|
83
|
+
if (methodMetadata) {
|
|
84
|
+
controller.methods.push(methodMetadata);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
controllers.push(controller);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return controllers;
|
|
92
|
+
}
|
|
93
|
+
function parseMethod(method) {
|
|
94
|
+
const httpMethods = ['Get', 'Post', 'Put', 'Patch', 'Delete'];
|
|
95
|
+
let httpMethod = null;
|
|
96
|
+
let routePath = '';
|
|
97
|
+
for (const httpMethodName of httpMethods) {
|
|
98
|
+
const decorator = getDecorator(method, httpMethodName);
|
|
99
|
+
if (decorator) {
|
|
100
|
+
httpMethod = httpMethodName.toUpperCase();
|
|
101
|
+
routePath = getDecoratorArgument(decorator) || '';
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (!httpMethod)
|
|
106
|
+
return null;
|
|
107
|
+
const methodName = method.name.text;
|
|
108
|
+
const params = [];
|
|
109
|
+
const reservedNames = new Set(['options', 'queryParams']);
|
|
110
|
+
method.parameters.forEach((param) => {
|
|
111
|
+
let paramName = param.name.text;
|
|
112
|
+
if (getDecorator(param, 'Req'))
|
|
113
|
+
return;
|
|
114
|
+
const paramDecorator = getDecorator(param, 'Param');
|
|
115
|
+
const queryDecorator = getDecorator(param, 'Query');
|
|
116
|
+
const bodyDecorator = getDecorator(param, 'Body');
|
|
117
|
+
let paramType = getTypeName(param.type);
|
|
118
|
+
if (paramDecorator) {
|
|
119
|
+
const expression = paramDecorator.expression;
|
|
120
|
+
if (ts.isCallExpression(expression) && expression.arguments.length > 1) {
|
|
121
|
+
const pipeArg = expression.arguments[1];
|
|
122
|
+
let pipeName = '';
|
|
123
|
+
if (ts.isIdentifier(pipeArg)) {
|
|
124
|
+
pipeName = pipeArg.text;
|
|
125
|
+
}
|
|
126
|
+
else if (ts.isNewExpression(pipeArg) &&
|
|
127
|
+
ts.isIdentifier(pipeArg.expression)) {
|
|
128
|
+
pipeName = pipeArg.expression.text;
|
|
129
|
+
}
|
|
130
|
+
const pipeTypeMap = {
|
|
131
|
+
ParseIntPipe: 'number',
|
|
132
|
+
ParseBoolPipe: 'boolean',
|
|
133
|
+
ParseFloatPipe: 'number',
|
|
134
|
+
ParseUUIDPipe: 'string',
|
|
135
|
+
ParseEnumPipe: 'string',
|
|
136
|
+
};
|
|
137
|
+
for (const [pipe, type] of Object.entries(pipeTypeMap)) {
|
|
138
|
+
if (pipeName.includes(pipe)) {
|
|
139
|
+
paramType = type;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (bodyDecorator) {
|
|
146
|
+
const bodyFieldArg = getDecoratorArgument(bodyDecorator);
|
|
147
|
+
if (bodyFieldArg) {
|
|
148
|
+
paramName = bodyFieldArg;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (queryDecorator) {
|
|
152
|
+
const queryFieldArg = getDecoratorArgument(queryDecorator);
|
|
153
|
+
if (queryFieldArg) {
|
|
154
|
+
paramName = queryFieldArg;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (reservedNames.has(paramName)) {
|
|
158
|
+
paramName = `_${paramName}`;
|
|
159
|
+
}
|
|
160
|
+
if (paramDecorator) {
|
|
161
|
+
params.push({
|
|
162
|
+
name: paramName,
|
|
163
|
+
type: paramType,
|
|
164
|
+
decorator: 'Param',
|
|
165
|
+
isOptional: !!param.questionToken,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
else if (queryDecorator) {
|
|
169
|
+
params.push({
|
|
170
|
+
name: paramName,
|
|
171
|
+
type: paramType,
|
|
172
|
+
decorator: 'Query',
|
|
173
|
+
isOptional: !!param.questionToken,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else if (bodyDecorator) {
|
|
177
|
+
params.push({
|
|
178
|
+
name: paramName,
|
|
179
|
+
type: paramType,
|
|
180
|
+
decorator: 'Body',
|
|
181
|
+
isOptional: !!param.questionToken,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
const returnType = getReturnType(method);
|
|
186
|
+
const apiOperationDecorator = getDecorator(method, 'ApiOperation');
|
|
187
|
+
const operationSummary = apiOperationDecorator
|
|
188
|
+
? getDecoratorObjectProperty(apiOperationDecorator, 'summary')
|
|
189
|
+
: undefined;
|
|
190
|
+
return {
|
|
191
|
+
name: methodName,
|
|
192
|
+
httpMethod,
|
|
193
|
+
path: routePath,
|
|
194
|
+
params,
|
|
195
|
+
returnType,
|
|
196
|
+
jsdoc: getJsDoc(method),
|
|
197
|
+
operationSummary,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function getDecorator(node, decoratorName) {
|
|
201
|
+
const decorators = ts.getDecorators(node);
|
|
202
|
+
if (!decorators)
|
|
203
|
+
return undefined;
|
|
204
|
+
return decorators.find((decorator) => {
|
|
205
|
+
try {
|
|
206
|
+
const expression = decorator.expression;
|
|
207
|
+
if (ts.isCallExpression(expression)) {
|
|
208
|
+
const callExpression = expression.expression;
|
|
209
|
+
if (ts.isIdentifier(callExpression)) {
|
|
210
|
+
return callExpression.text === decoratorName;
|
|
211
|
+
}
|
|
212
|
+
if (ts.isPropertyAccessExpression(callExpression)) {
|
|
213
|
+
const name = callExpression.name;
|
|
214
|
+
if (ts.isIdentifier(name)) {
|
|
215
|
+
return name.text === decoratorName;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
if (ts.isIdentifier(expression)) {
|
|
221
|
+
return expression.text === decoratorName;
|
|
222
|
+
}
|
|
223
|
+
if (ts.isPropertyAccessExpression(expression)) {
|
|
224
|
+
const name = expression.name;
|
|
225
|
+
if (ts.isIdentifier(name)) {
|
|
226
|
+
return name.text === decoratorName;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
catch (_) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
function getDecoratorArgument(decorator) {
|
|
237
|
+
const expression = decorator.expression;
|
|
238
|
+
if (ts.isCallExpression(expression) && expression.arguments.length > 0) {
|
|
239
|
+
const arg = expression.arguments[0];
|
|
240
|
+
if (ts.isStringLiteral(arg)) {
|
|
241
|
+
return arg.text;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
function getDecoratorObjectProperty(decorator, propertyName) {
|
|
247
|
+
const expression = decorator.expression;
|
|
248
|
+
if (ts.isCallExpression(expression) && expression.arguments.length > 0) {
|
|
249
|
+
const arg = expression.arguments[0];
|
|
250
|
+
if (ts.isObjectLiteralExpression(arg)) {
|
|
251
|
+
const property = arg.properties.find((prop) => {
|
|
252
|
+
if (!ts.isPropertyAssignment(prop))
|
|
253
|
+
return false;
|
|
254
|
+
let propName;
|
|
255
|
+
if (ts.isIdentifier(prop.name)) {
|
|
256
|
+
propName = prop.name.text;
|
|
257
|
+
}
|
|
258
|
+
else if (ts.isStringLiteral(prop.name)) {
|
|
259
|
+
propName = prop.name.text;
|
|
260
|
+
}
|
|
261
|
+
return propName === propertyName;
|
|
262
|
+
});
|
|
263
|
+
if (property && ts.isPropertyAssignment(property)) {
|
|
264
|
+
if (ts.isStringLiteral(property.initializer)) {
|
|
265
|
+
return property.initializer.text;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
function getReturnType(method) {
|
|
273
|
+
if (!method.type)
|
|
274
|
+
return 'void';
|
|
275
|
+
try {
|
|
276
|
+
const typeNode = method.type;
|
|
277
|
+
if (ts.isTypeReferenceNode(typeNode)) {
|
|
278
|
+
const typeName = ts.isIdentifier(typeNode.typeName)
|
|
279
|
+
? typeNode.typeName.text
|
|
280
|
+
: 'any';
|
|
281
|
+
if (typeName === 'Promise' &&
|
|
282
|
+
typeNode.typeArguments &&
|
|
283
|
+
typeNode.typeArguments.length > 0) {
|
|
284
|
+
const innerType = getTypeName(typeNode.typeArguments[0]);
|
|
285
|
+
return innerType === 'void' ? 'void' : innerType;
|
|
286
|
+
}
|
|
287
|
+
return typeName;
|
|
288
|
+
}
|
|
289
|
+
if (ts.isIdentifier(typeNode)) {
|
|
290
|
+
return typeNode.text;
|
|
291
|
+
}
|
|
292
|
+
if (typeNode.kind === ts.SyntaxKind.VoidKeyword) {
|
|
293
|
+
return 'void';
|
|
294
|
+
}
|
|
295
|
+
return 'void';
|
|
296
|
+
}
|
|
297
|
+
catch (_) {
|
|
298
|
+
return 'void';
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function getTypeName(typeNode) {
|
|
302
|
+
if (!typeNode)
|
|
303
|
+
return 'any';
|
|
304
|
+
try {
|
|
305
|
+
if (typeNode.kind === ts.SyntaxKind.VoidKeyword) {
|
|
306
|
+
return 'void';
|
|
307
|
+
}
|
|
308
|
+
if (typeNode.kind === ts.SyntaxKind.StringKeyword) {
|
|
309
|
+
return 'string';
|
|
310
|
+
}
|
|
311
|
+
if (typeNode.kind === ts.SyntaxKind.NumberKeyword) {
|
|
312
|
+
return 'number';
|
|
313
|
+
}
|
|
314
|
+
if (typeNode.kind === ts.SyntaxKind.BooleanKeyword) {
|
|
315
|
+
return 'boolean';
|
|
316
|
+
}
|
|
317
|
+
if (ts.isIdentifier(typeNode)) {
|
|
318
|
+
return typeNode.text;
|
|
319
|
+
}
|
|
320
|
+
if (ts.isArrayTypeNode(typeNode)) {
|
|
321
|
+
const elementType = getTypeName(typeNode.elementType);
|
|
322
|
+
return `${elementType}[]`;
|
|
323
|
+
}
|
|
324
|
+
if (ts.isTypeReferenceNode(typeNode)) {
|
|
325
|
+
const typeName = ts.isIdentifier(typeNode.typeName)
|
|
326
|
+
? typeNode.typeName.text
|
|
327
|
+
: typeNode.typeName.getText?.();
|
|
328
|
+
if (typeNode.typeArguments && typeNode.typeArguments.length > 0) {
|
|
329
|
+
const args = typeNode.typeArguments
|
|
330
|
+
.map((arg) => getTypeName(arg))
|
|
331
|
+
.join(', ');
|
|
332
|
+
return `${typeName}<${args}>`;
|
|
333
|
+
}
|
|
334
|
+
return typeName || 'any';
|
|
335
|
+
}
|
|
336
|
+
if (ts.isUnionTypeNode(typeNode)) {
|
|
337
|
+
return typeNode.types.map((t) => getTypeName(t)).join(' | ');
|
|
338
|
+
}
|
|
339
|
+
if (ts.isTypeLiteralNode(typeNode)) {
|
|
340
|
+
const members = typeNode.members
|
|
341
|
+
.map((member) => {
|
|
342
|
+
if (ts.isPropertySignature(member) && member.name && member.type) {
|
|
343
|
+
const propName = ts.isIdentifier(member.name)
|
|
344
|
+
? member.name.text
|
|
345
|
+
: member.name.getText?.() || 'unknown';
|
|
346
|
+
const propType = getTypeName(member.type);
|
|
347
|
+
const optional = member.questionToken ? '?' : '';
|
|
348
|
+
return `${propName}${optional}: ${propType}`;
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
})
|
|
352
|
+
.filter(Boolean)
|
|
353
|
+
.join('; ');
|
|
354
|
+
return `{ ${members} }`;
|
|
355
|
+
}
|
|
356
|
+
if (typeNode.getText && typeNode.getSourceFile?.()) {
|
|
357
|
+
return typeNode.getText();
|
|
358
|
+
}
|
|
359
|
+
return 'any';
|
|
360
|
+
}
|
|
361
|
+
catch (_) {
|
|
362
|
+
return 'any';
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
function getJsDoc(node) {
|
|
366
|
+
const jsDocTags = ts.getJSDocTags(node);
|
|
367
|
+
if (jsDocTags.length > 0) {
|
|
368
|
+
return jsDocTags.map((tag) => tag.comment).join('\n');
|
|
369
|
+
}
|
|
370
|
+
return undefined;
|
|
371
|
+
}
|
|
372
|
+
function generateClientClass(controller) {
|
|
373
|
+
const clientName = controller.name.replace('Controller', 'Client');
|
|
374
|
+
const methods = controller.methods.map((method) => generateClientMethod(controller.basePath, method));
|
|
375
|
+
const dtoImports = new Set();
|
|
376
|
+
const shouldImportType = (type) => {
|
|
377
|
+
if (PRIMITIVE_TYPES.has(type))
|
|
378
|
+
return false;
|
|
379
|
+
if (type.startsWith('{'))
|
|
380
|
+
return false;
|
|
381
|
+
if (type.includes('{') && type.includes('}'))
|
|
382
|
+
return false;
|
|
383
|
+
return true;
|
|
384
|
+
};
|
|
385
|
+
controller.methods.forEach((method) => {
|
|
386
|
+
method.params.forEach((param) => {
|
|
387
|
+
const baseType = param.type.replace('[]', '');
|
|
388
|
+
if (shouldImportType(baseType)) {
|
|
389
|
+
dtoImports.add(baseType);
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
const baseReturnType = method.returnType.replace('[]', '');
|
|
393
|
+
if (shouldImportType(baseReturnType)) {
|
|
394
|
+
dtoImports.add(baseReturnType);
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
const imports = Array.from(dtoImports).join(', ');
|
|
398
|
+
const importsSection = imports
|
|
399
|
+
? `import {
|
|
400
|
+
${imports}
|
|
401
|
+
} from "../../../dtos";
|
|
402
|
+
`
|
|
403
|
+
: '';
|
|
404
|
+
return `import {
|
|
405
|
+
BaseApiClient,
|
|
406
|
+
ApiClientOptions,
|
|
407
|
+
RequestOptions,
|
|
408
|
+
} from "@edifice.io/rest-client-base";
|
|
409
|
+
${importsSection}
|
|
410
|
+
/**
|
|
411
|
+
* Client for interacting with the ${controller.tag || controller.name} API
|
|
412
|
+
* ${controller.jsdoc || ''}
|
|
413
|
+
*
|
|
414
|
+
* @example
|
|
415
|
+
* // Basic usage with fetch (default)
|
|
416
|
+
* const client = new ${clientName}();
|
|
417
|
+
*
|
|
418
|
+
* @example
|
|
419
|
+
* // With Edifice HttpService
|
|
420
|
+
* import { odeServices } from '@edifice.io/client';
|
|
421
|
+
*
|
|
422
|
+
* const httpService = odeServices.http();
|
|
423
|
+
* const client = new ${clientName}({
|
|
424
|
+
* httpService: httpService
|
|
425
|
+
* });
|
|
426
|
+
*/
|
|
427
|
+
export class ${clientName} extends BaseApiClient {
|
|
428
|
+
/**
|
|
429
|
+
* Creates a new ${clientName}
|
|
430
|
+
* @param options Client configuration options
|
|
431
|
+
*/
|
|
432
|
+
constructor(options: ApiClientOptions = {}) {
|
|
433
|
+
super(options);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
${methods.join('\n\n')}
|
|
437
|
+
}
|
|
438
|
+
`;
|
|
439
|
+
}
|
|
440
|
+
function generateClientMethod(basePath, method) {
|
|
441
|
+
const methodName = toCamelCase(method.name);
|
|
442
|
+
const params = [];
|
|
443
|
+
const queryParams = [];
|
|
444
|
+
const pathParams = new Map();
|
|
445
|
+
let bodyParam = null;
|
|
446
|
+
method.params.forEach((param) => {
|
|
447
|
+
const paramDeclaration = `${param.name}${param.isOptional ? '?' : ''}: ${param.type}`;
|
|
448
|
+
if (param.decorator === 'Param') {
|
|
449
|
+
params.push(paramDeclaration);
|
|
450
|
+
pathParams.set(param.name, param.type);
|
|
451
|
+
}
|
|
452
|
+
else if (param.decorator === 'Query') {
|
|
453
|
+
params.push(paramDeclaration);
|
|
454
|
+
queryParams.push(param.name);
|
|
455
|
+
}
|
|
456
|
+
else if (param.decorator === 'Body') {
|
|
457
|
+
params.push(paramDeclaration);
|
|
458
|
+
bodyParam = param.name;
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
params.push('options?: RequestOptions');
|
|
462
|
+
let url = basePath;
|
|
463
|
+
if (method.path) {
|
|
464
|
+
if (!basePath.endsWith('/') && !method.path.startsWith('/')) {
|
|
465
|
+
url += '/';
|
|
466
|
+
}
|
|
467
|
+
url += method.path;
|
|
468
|
+
}
|
|
469
|
+
pathParams.forEach((_, paramName) => {
|
|
470
|
+
url = url.replace(`:${paramName}`, `\${${paramName}}`);
|
|
471
|
+
});
|
|
472
|
+
const queryParamsCode = queryParams.length > 0
|
|
473
|
+
? `
|
|
474
|
+
const queryParams = new URLSearchParams();
|
|
475
|
+
${queryParams
|
|
476
|
+
.map((param) => {
|
|
477
|
+
const paramMeta = method.params.find((p) => p.name === param);
|
|
478
|
+
if (paramMeta?.isOptional) {
|
|
479
|
+
return ` if (${param}) queryParams.append("${param}", String(${param}));`;
|
|
480
|
+
}
|
|
481
|
+
return ` queryParams.append("${param}", String(${param}));`;
|
|
482
|
+
})
|
|
483
|
+
.join('\n')}
|
|
484
|
+
`
|
|
485
|
+
: '';
|
|
486
|
+
const queryArg = queryParams.length > 0 ? 'queryParams' : 'undefined';
|
|
487
|
+
const httpMethodLower = method.httpMethod.toLowerCase();
|
|
488
|
+
const returnType = method.returnType === 'void'
|
|
489
|
+
? 'Promise<void>'
|
|
490
|
+
: `Promise<${method.returnType}>`;
|
|
491
|
+
const jsdoc = method.operationSummary || method.jsdoc || '';
|
|
492
|
+
let methodCall;
|
|
493
|
+
if (httpMethodLower === 'get' || httpMethodLower === 'delete') {
|
|
494
|
+
const genericType = method.returnType === 'void' ? '' : `<${method.returnType}>`;
|
|
495
|
+
methodCall = `this.${httpMethodLower}${genericType}(
|
|
496
|
+
\`${url}\`,
|
|
497
|
+
${queryArg},
|
|
498
|
+
options
|
|
499
|
+
)`;
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
const bodyArg = bodyParam || 'undefined';
|
|
503
|
+
const genericType = method.returnType === 'void' ? '' : `<${method.returnType}>`;
|
|
504
|
+
methodCall = `this.${httpMethodLower}${genericType}(
|
|
505
|
+
\`${url}\`,
|
|
506
|
+
${bodyArg},
|
|
507
|
+
${queryArg},
|
|
508
|
+
options
|
|
509
|
+
)`;
|
|
510
|
+
}
|
|
511
|
+
return ` /**
|
|
512
|
+
* ${jsdoc}
|
|
513
|
+
${method.params.map((p) => ` * @param ${p.name} ${p.type}`).join('\n')}
|
|
514
|
+
* @param options Additional request options
|
|
515
|
+
* @returns ${method.returnType === 'void' ? 'void' : method.returnType}
|
|
516
|
+
*/
|
|
517
|
+
async ${methodName}(
|
|
518
|
+
${params.join(',\n ')}
|
|
519
|
+
): ${returnType} {${queryParamsCode}
|
|
520
|
+
return ${methodCall};
|
|
521
|
+
}`;
|
|
522
|
+
}
|
|
523
|
+
function toCamelCase(str) {
|
|
524
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
525
|
+
}
|
|
526
|
+
function generateIndexFile(clientOutputDir, controllers) {
|
|
527
|
+
const clientNames = controllers.map((controller) => controller.name.replace('Controller', 'Client'));
|
|
528
|
+
const imports = clientNames
|
|
529
|
+
.map((name) => {
|
|
530
|
+
const fileName = toCamelCase(name.replace('Client', ''));
|
|
531
|
+
return `export { ${name} } from "./${fileName}.client";`;
|
|
532
|
+
})
|
|
533
|
+
.join('\n');
|
|
534
|
+
const indexFilePath = path.join(clientOutputDir, 'clients', 'index.ts');
|
|
535
|
+
const indexContent = `// This file is auto-generated by generate-rest-clients.ts
|
|
536
|
+
// Do not edit manually
|
|
537
|
+
|
|
538
|
+
${imports}
|
|
539
|
+
`;
|
|
540
|
+
fs.writeFileSync(indexFilePath, indexContent, 'utf-8');
|
|
541
|
+
console.log(`✅ Generated ${indexFilePath}`);
|
|
542
|
+
}
|
|
543
|
+
const args = process.argv.slice(2);
|
|
544
|
+
if (args.length < 2) {
|
|
545
|
+
console.warn('Usage: generate-rest-clients <backend-src-dir> <client-output-dir>');
|
|
546
|
+
}
|
|
547
|
+
const backendSrcDir = path.resolve(args[0] || './backend/src');
|
|
548
|
+
const clientOutputDir = path.resolve(args[1] || './client/rest/src/clients/generated');
|
|
549
|
+
const controllerFiles = [];
|
|
550
|
+
function findControllerFiles(dir) {
|
|
551
|
+
const files = fs.readdirSync(dir);
|
|
552
|
+
files.forEach((file) => {
|
|
553
|
+
const fullPath = path.join(dir, file);
|
|
554
|
+
if (fs.statSync(fullPath).isDirectory()) {
|
|
555
|
+
findControllerFiles(fullPath);
|
|
556
|
+
}
|
|
557
|
+
else if (file.endsWith('.controller.ts')) {
|
|
558
|
+
controllerFiles.push(fullPath);
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
findControllerFiles(backendSrcDir);
|
|
563
|
+
console.log(`Found ${controllerFiles.length} controller files`);
|
|
564
|
+
const allControllers = [];
|
|
565
|
+
controllerFiles.forEach((controllerFile) => {
|
|
566
|
+
console.log(`Processing ${controllerFile}...`);
|
|
567
|
+
const controllers = parseControllers(controllerFile);
|
|
568
|
+
allControllers.push(...controllers);
|
|
569
|
+
controllers.forEach((controller) => {
|
|
570
|
+
const clientName = controller.name.replace('Controller', 'Client');
|
|
571
|
+
const clientFileName = `${toCamelCase(clientName.replace('Client', ''))}.client.ts`;
|
|
572
|
+
const clientFilePath = path.join(clientOutputDir, 'clients', clientFileName);
|
|
573
|
+
const clientCode = generateClientClass(controller);
|
|
574
|
+
fs.mkdirSync(path.dirname(clientFilePath), { recursive: true });
|
|
575
|
+
fs.writeFileSync(clientFilePath, clientCode, 'utf-8');
|
|
576
|
+
console.log(`✅ Generated ${clientFilePath}`);
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
generateIndexFile(clientOutputDir, allControllers);
|
|
580
|
+
console.log('✅ Client generation complete!');
|
|
581
|
+
//# sourceMappingURL=generate-rest-clients.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-rest-clients.js","sourceRoot":"","sources":["../../src/bin/generate-rest-clients.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|