@eqxjs/swagger-codegen 1.0.0-beta.0
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/ARCHITECTURE.md +230 -0
- package/FORMATS.md +180 -0
- package/OPENAPI-COMPARISON.md +355 -0
- package/QUICKSTART.md +118 -0
- package/README.md +405 -0
- package/SUMMARY.md +184 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -0
- package/dist/file-writer.d.ts +24 -0
- package/dist/file-writer.d.ts.map +1 -0
- package/dist/file-writer.js +95 -0
- package/dist/file-writer.js.map +1 -0
- package/dist/generator.d.ts +6 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +104 -0
- package/dist/generator.js.map +1 -0
- package/dist/generators/client-service.generator.d.ts +6 -0
- package/dist/generators/client-service.generator.d.ts.map +1 -0
- package/dist/generators/client-service.generator.js +203 -0
- package/dist/generators/client-service.generator.js.map +1 -0
- package/dist/generators/controller.generator.d.ts +6 -0
- package/dist/generators/controller.generator.d.ts.map +1 -0
- package/dist/generators/controller.generator.js +241 -0
- package/dist/generators/controller.generator.js.map +1 -0
- package/dist/generators/dto.generator.d.ts +10 -0
- package/dist/generators/dto.generator.d.ts.map +1 -0
- package/dist/generators/dto.generator.js +221 -0
- package/dist/generators/dto.generator.js.map +1 -0
- package/dist/generators/module.generator.d.ts +10 -0
- package/dist/generators/module.generator.d.ts.map +1 -0
- package/dist/generators/module.generator.js +52 -0
- package/dist/generators/module.generator.js.map +1 -0
- package/dist/generators/service.generator.d.ts +6 -0
- package/dist/generators/service.generator.d.ts.map +1 -0
- package/dist/generators/service.generator.js +179 -0
- package/dist/generators/service.generator.js.map +1 -0
- package/dist/parser.d.ts +24 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +82 -0
- package/dist/parser.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +38 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +114 -0
- package/dist/utils.js.map +1 -0
- package/package.json +40 -0
- package/test-all-formats.sh +32 -0
- package/test.sh +27 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateController = generateController;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
const parser_1 = require("../parser");
|
|
6
|
+
/**
|
|
7
|
+
* Generate a controller for a specific tag/resource
|
|
8
|
+
*/
|
|
9
|
+
function generateController(tag, endpoints, spec) {
|
|
10
|
+
const controllerName = `${(0, utils_1.toPascalCase)(tag)}Controller`;
|
|
11
|
+
const serviceName = `${(0, utils_1.toPascalCase)(tag)}Service`;
|
|
12
|
+
const imports = new Set();
|
|
13
|
+
imports.add("import { Controller, Get, Post, Put, Patch, Delete, Body, Param, Query } from '@nestjs/common';");
|
|
14
|
+
imports.add("import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';");
|
|
15
|
+
imports.add(`import { ${serviceName} } from './${(0, utils_1.toKebabCase)(tag)}.service';`);
|
|
16
|
+
const basePath = getBasePath(endpoints);
|
|
17
|
+
let controllerContent = `@ApiTags('${tag}')\n`;
|
|
18
|
+
controllerContent += `@Controller('${basePath}')\n`;
|
|
19
|
+
controllerContent += `export class ${controllerName} {\n`;
|
|
20
|
+
controllerContent += ` constructor(private readonly ${(0, utils_1.toCamelCase)(tag)}Service: ${serviceName}) {}\n\n`;
|
|
21
|
+
// Generate methods for each endpoint
|
|
22
|
+
for (const endpoint of endpoints) {
|
|
23
|
+
const { method, path, operation } = endpoint;
|
|
24
|
+
const controllerMethod = generateControllerMethod(tag, method, path, operation, basePath, spec, imports);
|
|
25
|
+
controllerContent += controllerMethod;
|
|
26
|
+
}
|
|
27
|
+
controllerContent += '}\n';
|
|
28
|
+
const content = `${Array.from(imports).join('\n')}\n\n${controllerContent}`;
|
|
29
|
+
return {
|
|
30
|
+
name: controllerName,
|
|
31
|
+
content,
|
|
32
|
+
imports,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get base path from endpoints
|
|
37
|
+
*/
|
|
38
|
+
function getBasePath(endpoints) {
|
|
39
|
+
if (endpoints.length === 0)
|
|
40
|
+
return '';
|
|
41
|
+
const firstPath = endpoints[0].path;
|
|
42
|
+
const parts = firstPath.split('/').filter(p => p && !p.startsWith('{'));
|
|
43
|
+
return parts[0] || '';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Generate a controller method
|
|
47
|
+
*/
|
|
48
|
+
function generateControllerMethod(tag, method, path, operation, basePath, spec, imports) {
|
|
49
|
+
const methodName = (0, utils_1.getOperationName)(path, method, operation.operationId);
|
|
50
|
+
const httpDecorator = (0, utils_1.getHttpDecorator)(method);
|
|
51
|
+
const routePath = getRoutePath(path, basePath);
|
|
52
|
+
const decorators = [];
|
|
53
|
+
const parameters = [];
|
|
54
|
+
// Add API Operation decorator
|
|
55
|
+
if (operation.summary) {
|
|
56
|
+
decorators.push(` @ApiOperation({ summary: '${operation.summary.replace(/'/g, "\\'")}' })`);
|
|
57
|
+
}
|
|
58
|
+
// Add API Response decorators
|
|
59
|
+
if (operation.responses) {
|
|
60
|
+
for (const [statusCode, response] of Object.entries(operation.responses)) {
|
|
61
|
+
const responseSchema = getResponseSchema(response);
|
|
62
|
+
if (responseSchema?.$ref) {
|
|
63
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(responseSchema.$ref);
|
|
64
|
+
const typeName = (0, utils_1.toPascalCase)(refName);
|
|
65
|
+
imports.add(`import { ${typeName} } from '../dtos/${(0, utils_1.toKebabCase)(refName)}.dto';`);
|
|
66
|
+
decorators.push(` @ApiResponse({ status: ${statusCode}, type: ${typeName} })`);
|
|
67
|
+
}
|
|
68
|
+
else if (responseSchema?.type === 'array' && responseSchema.items?.$ref) {
|
|
69
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(responseSchema.items.$ref);
|
|
70
|
+
const typeName = (0, utils_1.toPascalCase)(refName);
|
|
71
|
+
imports.add(`import { ${typeName} } from '../dtos/${(0, utils_1.toKebabCase)(refName)}.dto';`);
|
|
72
|
+
decorators.push(` @ApiResponse({ status: ${statusCode}, type: [${typeName}] })`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Add HTTP method decorator
|
|
77
|
+
decorators.push(` @${httpDecorator}('${routePath}')`);
|
|
78
|
+
// Generate method signature
|
|
79
|
+
let returnType = 'Promise<any>';
|
|
80
|
+
// Handle path parameters
|
|
81
|
+
const pathParams = extractPathParams(path);
|
|
82
|
+
for (const param of pathParams) {
|
|
83
|
+
parameters.push(`@Param('${param}') ${(0, utils_1.toCamelCase)(param)}: string`);
|
|
84
|
+
}
|
|
85
|
+
// Handle query parameters
|
|
86
|
+
if (operation.parameters) {
|
|
87
|
+
for (const param of operation.parameters) {
|
|
88
|
+
if (!param.name)
|
|
89
|
+
continue; // Skip parameters without names
|
|
90
|
+
if (param.in === 'query') {
|
|
91
|
+
const paramName = (0, utils_1.toCamelCase)(param.name);
|
|
92
|
+
let paramType = 'string';
|
|
93
|
+
// Get type from schema (OpenAPI 3.x) or directly from param (Swagger 2.0)
|
|
94
|
+
if (param.schema?.type) {
|
|
95
|
+
paramType = getTypeScriptType(param.schema.type);
|
|
96
|
+
}
|
|
97
|
+
else if (param.type) {
|
|
98
|
+
paramType = getTypeScriptType(param.type);
|
|
99
|
+
}
|
|
100
|
+
const optional = param.required === false ? '?' : '';
|
|
101
|
+
parameters.push(`@Query('${param.name}') ${paramName}${optional}: ${paramType}`);
|
|
102
|
+
}
|
|
103
|
+
else if (param.in === 'body' && param.schema?.$ref) {
|
|
104
|
+
// Swagger 2.0 body parameter
|
|
105
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(param.schema.$ref);
|
|
106
|
+
const dtoName = (0, utils_1.toPascalCase)(refName);
|
|
107
|
+
imports.add(`import { ${dtoName} } from '../dtos/${(0, utils_1.toKebabCase)(refName)}.dto';`);
|
|
108
|
+
parameters.push(`@Body() body: ${dtoName}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Handle request body (OpenAPI 3.x)
|
|
113
|
+
if (operation.requestBody) {
|
|
114
|
+
let requestBody = operation.requestBody;
|
|
115
|
+
// If requestBody is a reference, resolve it
|
|
116
|
+
if (requestBody.$ref) {
|
|
117
|
+
const refPath = requestBody.$ref.split('/');
|
|
118
|
+
if (refPath[1] === 'components' && refPath[2] === 'requestBodies') {
|
|
119
|
+
const refName = refPath[3];
|
|
120
|
+
requestBody = spec.components?.requestBodies?.[refName] || requestBody;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const content = requestBody.content;
|
|
124
|
+
if (content) {
|
|
125
|
+
const jsonContent = content['application/json'];
|
|
126
|
+
if (jsonContent?.schema?.$ref) {
|
|
127
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(jsonContent.schema.$ref);
|
|
128
|
+
const dtoName = (0, utils_1.toPascalCase)(refName);
|
|
129
|
+
imports.add(`import { ${dtoName} } from '../dtos/${(0, utils_1.toKebabCase)(refName)}.dto';`);
|
|
130
|
+
parameters.push(`@Body() body: ${dtoName}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Determine return type from response
|
|
135
|
+
if (operation.responses?.['200']) {
|
|
136
|
+
const successResponse = operation.responses['200'];
|
|
137
|
+
const responseSchema = getResponseSchema(successResponse);
|
|
138
|
+
if (responseSchema?.$ref) {
|
|
139
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(responseSchema.$ref);
|
|
140
|
+
const typeName = (0, utils_1.toPascalCase)(refName);
|
|
141
|
+
returnType = `Promise<${typeName}>`;
|
|
142
|
+
}
|
|
143
|
+
else if (responseSchema?.type === 'array' && responseSchema.items?.$ref) {
|
|
144
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(responseSchema.items.$ref);
|
|
145
|
+
const typeName = (0, utils_1.toPascalCase)(refName);
|
|
146
|
+
returnType = `Promise<${typeName}[]>`;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const paramsString = parameters.join(', ');
|
|
150
|
+
const serviceMethodCall = generateServiceMethodCall(tag, methodName, operation, pathParams);
|
|
151
|
+
let methodContent = '';
|
|
152
|
+
if (decorators.length > 0) {
|
|
153
|
+
methodContent += decorators.join('\n') + '\n';
|
|
154
|
+
}
|
|
155
|
+
methodContent += ` async ${methodName}(${paramsString}): ${returnType} {\n`;
|
|
156
|
+
methodContent += ` return this.${(0, utils_1.toCamelCase)(tag)}Service.${serviceMethodCall};\n`;
|
|
157
|
+
methodContent += ` }\n\n`;
|
|
158
|
+
return methodContent;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get route path relative to base path
|
|
162
|
+
*/
|
|
163
|
+
function getRoutePath(fullPath, basePath) {
|
|
164
|
+
let routePath = fullPath;
|
|
165
|
+
// Remove base path
|
|
166
|
+
if (basePath) {
|
|
167
|
+
routePath = routePath.replace(new RegExp(`^/${basePath}`), '');
|
|
168
|
+
}
|
|
169
|
+
// Convert path parameters to NestJS format
|
|
170
|
+
routePath = (0, utils_1.convertPathParams)(routePath);
|
|
171
|
+
// Remove leading slash
|
|
172
|
+
if (routePath.startsWith('/')) {
|
|
173
|
+
routePath = routePath.substring(1);
|
|
174
|
+
}
|
|
175
|
+
return routePath;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Extract path parameters from a path
|
|
179
|
+
*/
|
|
180
|
+
function extractPathParams(path) {
|
|
181
|
+
const matches = path.match(/\{([^}]+)\}/g);
|
|
182
|
+
if (!matches)
|
|
183
|
+
return [];
|
|
184
|
+
return matches.map(match => match.slice(1, -1));
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Generate service method call
|
|
188
|
+
*/
|
|
189
|
+
function generateServiceMethodCall(tag, methodName, operation, pathParams) {
|
|
190
|
+
const args = [];
|
|
191
|
+
// Add path parameters
|
|
192
|
+
for (const param of pathParams) {
|
|
193
|
+
args.push((0, utils_1.toCamelCase)(param));
|
|
194
|
+
}
|
|
195
|
+
// Add query parameters
|
|
196
|
+
if (operation.parameters) {
|
|
197
|
+
for (const param of operation.parameters) {
|
|
198
|
+
if (param.in === 'query') {
|
|
199
|
+
args.push((0, utils_1.toCamelCase)(param.name));
|
|
200
|
+
}
|
|
201
|
+
else if (param.in === 'body') {
|
|
202
|
+
args.push('body');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Add request body
|
|
207
|
+
if (operation.requestBody) {
|
|
208
|
+
args.push('body');
|
|
209
|
+
}
|
|
210
|
+
return `${methodName}(${args.join(', ')})`;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get response schema from response object
|
|
214
|
+
*/
|
|
215
|
+
function getResponseSchema(response) {
|
|
216
|
+
// OpenAPI 3.x
|
|
217
|
+
if (response.content) {
|
|
218
|
+
const jsonContent = response.content['application/json'];
|
|
219
|
+
return jsonContent?.schema;
|
|
220
|
+
}
|
|
221
|
+
// Swagger 2.0
|
|
222
|
+
return response.schema;
|
|
223
|
+
}
|
|
224
|
+
function getTypeScriptType(type) {
|
|
225
|
+
switch (type) {
|
|
226
|
+
case 'integer':
|
|
227
|
+
case 'number':
|
|
228
|
+
return 'number';
|
|
229
|
+
case 'string':
|
|
230
|
+
return 'string';
|
|
231
|
+
case 'boolean':
|
|
232
|
+
return 'boolean';
|
|
233
|
+
case 'array':
|
|
234
|
+
return 'any[]';
|
|
235
|
+
case 'object':
|
|
236
|
+
return 'Record<string, any>';
|
|
237
|
+
default:
|
|
238
|
+
return 'any';
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=controller.generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.generator.js","sourceRoot":"","sources":["../../src/generators/controller.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SwaggerSpec, SwaggerSchema, GeneratedDto } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate DTOs from Swagger schemas
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateDtos(spec: SwaggerSpec): GeneratedDto[];
|
|
6
|
+
/**
|
|
7
|
+
* Generate DTOs from request body
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateDtoFromRequestBody(operationId: string, schema: SwaggerSchema | undefined, spec: SwaggerSpec): GeneratedDto | null;
|
|
10
|
+
//# sourceMappingURL=dto.generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dto.generator.d.ts","sourceRoot":"","sources":["../../src/generators/dto.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIpE;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,EAAE,CAY9D;AAuOD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,IAAI,EAAE,WAAW,GAChB,YAAY,GAAG,IAAI,CAUrB"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateDtos = generateDtos;
|
|
4
|
+
exports.generateDtoFromRequestBody = generateDtoFromRequestBody;
|
|
5
|
+
const parser_1 = require("../parser");
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
/**
|
|
8
|
+
* Generate DTOs from Swagger schemas
|
|
9
|
+
*/
|
|
10
|
+
function generateDtos(spec) {
|
|
11
|
+
const schemas = (0, parser_1.getSchemas)(spec);
|
|
12
|
+
const dtos = [];
|
|
13
|
+
for (const [schemaName, schema] of Object.entries(schemas)) {
|
|
14
|
+
const dto = generateDtoFromSchema(schemaName, schema, spec);
|
|
15
|
+
if (dto) {
|
|
16
|
+
dtos.push(dto);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return dtos;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Resolve schema composition (allOf, oneOf, anyOf) and merge properties
|
|
23
|
+
*/
|
|
24
|
+
function resolveSchemaComposition(schema, spec) {
|
|
25
|
+
const mergedProperties = {};
|
|
26
|
+
const mergedRequired = [];
|
|
27
|
+
let extendsClass = undefined;
|
|
28
|
+
let baseProperties = undefined;
|
|
29
|
+
// Handle direct properties
|
|
30
|
+
if (schema.properties) {
|
|
31
|
+
Object.assign(mergedProperties, schema.properties);
|
|
32
|
+
}
|
|
33
|
+
if (schema.required) {
|
|
34
|
+
mergedRequired.push(...schema.required);
|
|
35
|
+
}
|
|
36
|
+
// Handle allOf - check if we should use extends
|
|
37
|
+
if (schema.allOf && Array.isArray(schema.allOf)) {
|
|
38
|
+
// Check if allOf follows the pattern: one $ref + one inline object with properties
|
|
39
|
+
// This pattern should use 'extends' instead of merging
|
|
40
|
+
const refItems = schema.allOf.filter((item) => item.$ref);
|
|
41
|
+
const inlineItems = schema.allOf.filter((item) => !item.$ref);
|
|
42
|
+
if (refItems.length === 1 && refItems[0].$ref && inlineItems.length >= 0) {
|
|
43
|
+
// Use extends pattern
|
|
44
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(refItems[0].$ref);
|
|
45
|
+
extendsClass = (0, utils_1.toPascalCase)(refName);
|
|
46
|
+
// Get base class properties to exclude from derived class
|
|
47
|
+
const baseSchema = (0, parser_1.resolveSchemaRef)(refItems[0].$ref, spec);
|
|
48
|
+
const baseResult = resolveSchemaComposition(baseSchema, spec);
|
|
49
|
+
baseProperties = new Set(Object.keys(baseResult.properties));
|
|
50
|
+
// Only merge properties from inline items, not from the $ref
|
|
51
|
+
for (const subSchema of inlineItems) {
|
|
52
|
+
if (subSchema.properties) {
|
|
53
|
+
Object.assign(mergedProperties, subSchema.properties);
|
|
54
|
+
}
|
|
55
|
+
if (subSchema.required) {
|
|
56
|
+
mergedRequired.push(...subSchema.required);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Multiple $refs or no clear inheritance pattern - merge all
|
|
62
|
+
for (const subSchema of schema.allOf) {
|
|
63
|
+
let resolvedSchema = subSchema;
|
|
64
|
+
if (subSchema.$ref) {
|
|
65
|
+
resolvedSchema = (0, parser_1.resolveSchemaRef)(subSchema.$ref, spec);
|
|
66
|
+
}
|
|
67
|
+
const result = resolveSchemaComposition(resolvedSchema, spec);
|
|
68
|
+
Object.assign(mergedProperties, result.properties);
|
|
69
|
+
mergedRequired.push(...result.required);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Handle oneOf - merge all possible schemas
|
|
74
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
75
|
+
for (const subSchema of schema.oneOf) {
|
|
76
|
+
let resolvedSchema = subSchema;
|
|
77
|
+
if (subSchema.$ref) {
|
|
78
|
+
resolvedSchema = (0, parser_1.resolveSchemaRef)(subSchema.$ref, spec);
|
|
79
|
+
}
|
|
80
|
+
const { properties, required } = resolveSchemaComposition(resolvedSchema, spec);
|
|
81
|
+
Object.assign(mergedProperties, properties);
|
|
82
|
+
// For oneOf, properties are optional since only one schema applies
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Handle anyOf - merge all possible schemas
|
|
86
|
+
if (schema.anyOf && Array.isArray(schema.anyOf)) {
|
|
87
|
+
for (const subSchema of schema.anyOf) {
|
|
88
|
+
let resolvedSchema = subSchema;
|
|
89
|
+
if (subSchema.$ref) {
|
|
90
|
+
resolvedSchema = (0, parser_1.resolveSchemaRef)(subSchema.$ref, spec);
|
|
91
|
+
}
|
|
92
|
+
const { properties, required } = resolveSchemaComposition(resolvedSchema, spec);
|
|
93
|
+
Object.assign(mergedProperties, properties);
|
|
94
|
+
// For anyOf, properties are optional since any combination is valid
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { properties: mergedProperties, required: mergedRequired, extendsClass, baseProperties };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if property name needs quotes (contains special characters)
|
|
101
|
+
*/
|
|
102
|
+
function needsQuotes(propName) {
|
|
103
|
+
// Property names with special characters need quotes
|
|
104
|
+
// Valid JavaScript identifier: starts with letter, $, or _, contains only letters, numbers, $, _
|
|
105
|
+
return !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(propName);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Format property name with quotes if needed
|
|
109
|
+
*/
|
|
110
|
+
function formatPropertyName(propName) {
|
|
111
|
+
return needsQuotes(propName) ? `"${propName}"` : propName;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Generate a single DTO from a schema
|
|
115
|
+
*/
|
|
116
|
+
function generateDtoFromSchema(schemaName, schema, spec) {
|
|
117
|
+
const className = (0, utils_1.toPascalCase)(schemaName);
|
|
118
|
+
const imports = new Set();
|
|
119
|
+
imports.add("import { ApiProperty } from '@nestjs/swagger';");
|
|
120
|
+
// Resolve schema composition (allOf, oneOf, anyOf)
|
|
121
|
+
const { properties, required, extendsClass, baseProperties } = resolveSchemaComposition(schema, spec);
|
|
122
|
+
// Add import for base class if using extends
|
|
123
|
+
if (extendsClass) {
|
|
124
|
+
const baseClassFileName = (0, utils_1.toKebabCase)(extendsClass);
|
|
125
|
+
imports.add(`import { ${extendsClass} } from './${baseClassFileName}.dto';`);
|
|
126
|
+
}
|
|
127
|
+
// Generate class declaration with optional extends
|
|
128
|
+
const extendsClause = extendsClass ? ` extends ${extendsClass}` : '';
|
|
129
|
+
let classContent = `export class ${className}${extendsClause} {\n`;
|
|
130
|
+
for (const [propName, propSchema] of Object.entries(properties)) {
|
|
131
|
+
// Skip properties that are inherited from base class to avoid overwrite errors
|
|
132
|
+
if (baseProperties && baseProperties.has(propName)) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const isRequired = required.includes(propName);
|
|
136
|
+
const { type, decoratorOptions } = resolvePropertyType(propSchema, spec, imports);
|
|
137
|
+
// Add ApiProperty decorator
|
|
138
|
+
classContent += ` @ApiProperty(${decoratorOptions})\n`;
|
|
139
|
+
// Add property with definite assignment assertion for required, optional modifier for not required
|
|
140
|
+
const modifier = isRequired ? '!' : '?';
|
|
141
|
+
const formattedPropName = formatPropertyName(propName);
|
|
142
|
+
classContent += ` ${formattedPropName}${modifier}: ${type};\n\n`;
|
|
143
|
+
}
|
|
144
|
+
classContent += '}\n';
|
|
145
|
+
const content = `${Array.from(imports).join('\n')}\n\n${classContent}`;
|
|
146
|
+
return {
|
|
147
|
+
name: className,
|
|
148
|
+
content,
|
|
149
|
+
imports,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Resolve property type and decorator options
|
|
154
|
+
*/
|
|
155
|
+
function resolvePropertyType(schema, spec, imports) {
|
|
156
|
+
const options = [];
|
|
157
|
+
if (schema.description) {
|
|
158
|
+
// Replace newlines and carriage returns with spaces, and escape single quotes
|
|
159
|
+
const cleanDescription = schema.description.replace(/\n/g, ' ').replace(/\r/g, ' ').replace(/'/g, "\\'");
|
|
160
|
+
options.push(`description: '${cleanDescription}'`);
|
|
161
|
+
}
|
|
162
|
+
// Handle $ref
|
|
163
|
+
if (schema.$ref) {
|
|
164
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(schema.$ref);
|
|
165
|
+
const className = (0, utils_1.toPascalCase)(refName);
|
|
166
|
+
imports.add(`import { ${className} } from './${(0, utils_1.toKebabCase)(refName)}.dto';`);
|
|
167
|
+
options.push(`type: () => ${className}`);
|
|
168
|
+
return { type: className, decoratorOptions: `{ ${options.join(', ')} }` };
|
|
169
|
+
}
|
|
170
|
+
// Handle array
|
|
171
|
+
if (schema.type === 'array' && schema.items) {
|
|
172
|
+
if (schema.items.$ref) {
|
|
173
|
+
const refName = (0, parser_1.getSchemaNameFromRef)(schema.items.$ref);
|
|
174
|
+
const className = (0, utils_1.toPascalCase)(refName);
|
|
175
|
+
imports.add(`import { ${className} } from './${(0, utils_1.toKebabCase)(refName)}.dto';`);
|
|
176
|
+
options.push(`type: () => [${className}]`);
|
|
177
|
+
options.push('isArray: true');
|
|
178
|
+
return { type: `${className}[]`, decoratorOptions: `{ ${options.join(', ')} }` };
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const itemType = (0, utils_1.getTypeScriptType)(schema.items.type, schema.items.format);
|
|
182
|
+
options.push('isArray: true');
|
|
183
|
+
return { type: `${itemType}[]`, decoratorOptions: `{ ${options.join(', ')} }` };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Handle enum
|
|
187
|
+
if (schema.enum) {
|
|
188
|
+
options.push(`enum: [${schema.enum.map((v) => `'${v}'`).join(', ')}]`);
|
|
189
|
+
return { type: 'string', decoratorOptions: `{ ${options.join(', ')} }` };
|
|
190
|
+
}
|
|
191
|
+
// Handle basic types
|
|
192
|
+
const type = (0, utils_1.getTypeScriptType)(schema.type, schema.format);
|
|
193
|
+
// Handle date/date-time format first (to avoid duplicate type property)
|
|
194
|
+
if (schema.format === 'date' || schema.format === 'date-time') {
|
|
195
|
+
options.push('type: Date');
|
|
196
|
+
}
|
|
197
|
+
else if (schema.type === 'number' || schema.type === 'integer') {
|
|
198
|
+
options.push('type: Number');
|
|
199
|
+
}
|
|
200
|
+
else if (schema.type === 'string') {
|
|
201
|
+
options.push('type: String');
|
|
202
|
+
}
|
|
203
|
+
else if (schema.type === 'boolean') {
|
|
204
|
+
options.push('type: Boolean');
|
|
205
|
+
}
|
|
206
|
+
return { type, decoratorOptions: `{ ${options.join(', ')} }` };
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Generate DTOs from request body
|
|
210
|
+
*/
|
|
211
|
+
function generateDtoFromRequestBody(operationId, schema, spec) {
|
|
212
|
+
if (!schema)
|
|
213
|
+
return null;
|
|
214
|
+
if (schema.$ref) {
|
|
215
|
+
// If it's a reference, we don't need to generate a new DTO
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
const dtoName = `${(0, utils_1.toPascalCase)(operationId)}Dto`;
|
|
219
|
+
return generateDtoFromSchema(dtoName, schema, spec);
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=dto.generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dto.generator.js","sourceRoot":"","sources":["../../src/generators/dto.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { GeneratedModule } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a module for a specific tag/resource
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateModule(tag: string): GeneratedModule;
|
|
6
|
+
/**
|
|
7
|
+
* Generate a root app module that imports all generated modules
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateAppModule(tags: string[]): string;
|
|
10
|
+
//# sourceMappingURL=module.generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.generator.d.ts","sourceRoot":"","sources":["../../src/generators/module.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAyB3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBxD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateModule = generateModule;
|
|
4
|
+
exports.generateAppModule = generateAppModule;
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
/**
|
|
7
|
+
* Generate a module for a specific tag/resource
|
|
8
|
+
*/
|
|
9
|
+
function generateModule(tag) {
|
|
10
|
+
const moduleName = `${(0, utils_1.toPascalCase)(tag)}Module`;
|
|
11
|
+
const controllerName = `${(0, utils_1.toPascalCase)(tag)}Controller`;
|
|
12
|
+
const serviceName = `${(0, utils_1.toPascalCase)(tag)}Service`;
|
|
13
|
+
const kebabTag = (0, utils_1.toKebabCase)(tag);
|
|
14
|
+
const imports = new Set();
|
|
15
|
+
imports.add("import { Module } from '@nestjs/common';");
|
|
16
|
+
imports.add(`import { ${controllerName} } from './${kebabTag}.controller';`);
|
|
17
|
+
imports.add(`import { ${serviceName} } from './${kebabTag}.service';`);
|
|
18
|
+
let moduleContent = `@Module({\n`;
|
|
19
|
+
moduleContent += ` controllers: [${controllerName}],\n`;
|
|
20
|
+
moduleContent += ` providers: [${serviceName}],\n`;
|
|
21
|
+
moduleContent += ` exports: [${serviceName}],\n`;
|
|
22
|
+
moduleContent += `})\n`;
|
|
23
|
+
moduleContent += `export class ${moduleName} {}\n`;
|
|
24
|
+
const content = `${Array.from(imports).join('\n')}\n\n${moduleContent}`;
|
|
25
|
+
return {
|
|
26
|
+
name: moduleName,
|
|
27
|
+
content,
|
|
28
|
+
imports,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generate a root app module that imports all generated modules
|
|
33
|
+
*/
|
|
34
|
+
function generateAppModule(tags) {
|
|
35
|
+
const imports = new Set();
|
|
36
|
+
imports.add("import { Module } from '@nestjs/common';");
|
|
37
|
+
const moduleNames = [];
|
|
38
|
+
for (const tag of tags) {
|
|
39
|
+
const moduleName = `${(0, utils_1.toPascalCase)(tag)}Module`;
|
|
40
|
+
const kebabTag = (0, utils_1.toKebabCase)(tag);
|
|
41
|
+
moduleNames.push(moduleName);
|
|
42
|
+
imports.add(`import { ${moduleName} } from './${kebabTag}/${kebabTag}.module';`);
|
|
43
|
+
}
|
|
44
|
+
let appModuleContent = `@Module({\n`;
|
|
45
|
+
appModuleContent += ` imports: [\n`;
|
|
46
|
+
appModuleContent += moduleNames.map(name => ` ${name}`).join(',\n');
|
|
47
|
+
appModuleContent += `\n ],\n`;
|
|
48
|
+
appModuleContent += `})\n`;
|
|
49
|
+
appModuleContent += `export class AppModule {}\n`;
|
|
50
|
+
return `${Array.from(imports).join('\n')}\n\n${appModuleContent}`;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=module.generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.generator.js","sourceRoot":"","sources":["../../src/generators/module.generator.ts"],"names":[],"mappings":";;AAMA,wCAyBC;AAKD,8CAqBC;AAxDD,oCAAqD;AAErD;;GAEG;AACH,SAAgB,cAAc,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,GAAG,IAAA,oBAAY,EAAC,GAAG,CAAC,QAAQ,CAAC;IAChD,MAAM,cAAc,GAAG,GAAG,IAAA,oBAAY,EAAC,GAAG,CAAC,YAAY,CAAC;IACxD,MAAM,WAAW,GAAG,GAAG,IAAA,oBAAY,EAAC,GAAG,CAAC,SAAS,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,GAAG,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,YAAY,cAAc,cAAc,QAAQ,eAAe,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,cAAc,QAAQ,YAAY,CAAC,CAAC;IAEvE,IAAI,aAAa,GAAG,aAAa,CAAC;IAClC,aAAa,IAAI,mBAAmB,cAAc,MAAM,CAAC;IACzD,aAAa,IAAI,iBAAiB,WAAW,MAAM,CAAC;IACpD,aAAa,IAAI,eAAe,WAAW,MAAM,CAAC;IAClD,aAAa,IAAI,MAAM,CAAC;IACxB,aAAa,IAAI,gBAAgB,UAAU,OAAO,CAAC;IAEnD,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,aAAa,EAAE,CAAC;IAExE,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,OAAO;QACP,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,IAAc;IAC9C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAExD,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,GAAG,IAAA,oBAAY,EAAC,GAAG,CAAC,QAAQ,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,GAAG,CAAC,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,cAAc,QAAQ,IAAI,QAAQ,WAAW,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,gBAAgB,GAAG,aAAa,CAAC;IACrC,gBAAgB,IAAI,gBAAgB,CAAC;IACrC,gBAAgB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvE,gBAAgB,IAAI,UAAU,CAAC;IAC/B,gBAAgB,IAAI,MAAM,CAAC;IAC3B,gBAAgB,IAAI,6BAA6B,CAAC;IAElD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,gBAAgB,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SwaggerSpec, EndpointInfo, GeneratedService } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a service for a specific tag/resource
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateService(tag: string, endpoints: EndpointInfo[], spec: SwaggerSpec): GeneratedService;
|
|
6
|
+
//# sourceMappingURL=service.generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.generator.d.ts","sourceRoot":"","sources":["../../src/generators/service.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIvE;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,YAAY,EAAE,EACzB,IAAI,EAAE,WAAW,GAChB,gBAAgB,CAyBlB"}
|