@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.
Files changed (53) hide show
  1. package/ARCHITECTURE.md +230 -0
  2. package/FORMATS.md +180 -0
  3. package/OPENAPI-COMPARISON.md +355 -0
  4. package/QUICKSTART.md +118 -0
  5. package/README.md +405 -0
  6. package/SUMMARY.md +184 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +49 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/file-writer.d.ts +24 -0
  12. package/dist/file-writer.d.ts.map +1 -0
  13. package/dist/file-writer.js +95 -0
  14. package/dist/file-writer.js.map +1 -0
  15. package/dist/generator.d.ts +6 -0
  16. package/dist/generator.d.ts.map +1 -0
  17. package/dist/generator.js +104 -0
  18. package/dist/generator.js.map +1 -0
  19. package/dist/generators/client-service.generator.d.ts +6 -0
  20. package/dist/generators/client-service.generator.d.ts.map +1 -0
  21. package/dist/generators/client-service.generator.js +203 -0
  22. package/dist/generators/client-service.generator.js.map +1 -0
  23. package/dist/generators/controller.generator.d.ts +6 -0
  24. package/dist/generators/controller.generator.d.ts.map +1 -0
  25. package/dist/generators/controller.generator.js +241 -0
  26. package/dist/generators/controller.generator.js.map +1 -0
  27. package/dist/generators/dto.generator.d.ts +10 -0
  28. package/dist/generators/dto.generator.d.ts.map +1 -0
  29. package/dist/generators/dto.generator.js +221 -0
  30. package/dist/generators/dto.generator.js.map +1 -0
  31. package/dist/generators/module.generator.d.ts +10 -0
  32. package/dist/generators/module.generator.d.ts.map +1 -0
  33. package/dist/generators/module.generator.js +52 -0
  34. package/dist/generators/module.generator.js.map +1 -0
  35. package/dist/generators/service.generator.d.ts +6 -0
  36. package/dist/generators/service.generator.d.ts.map +1 -0
  37. package/dist/generators/service.generator.js +179 -0
  38. package/dist/generators/service.generator.js.map +1 -0
  39. package/dist/parser.d.ts +24 -0
  40. package/dist/parser.d.ts.map +1 -0
  41. package/dist/parser.js +82 -0
  42. package/dist/parser.js.map +1 -0
  43. package/dist/types.d.ts +97 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +3 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/utils.d.ts +38 -0
  48. package/dist/utils.d.ts.map +1 -0
  49. package/dist/utils.js +114 -0
  50. package/dist/utils.js.map +1 -0
  51. package/package.json +40 -0
  52. package/test-all-formats.sh +32 -0
  53. 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"}