@eqxjs/swagger-codegen 1.0.0-beta.0 โ†’ 1.0.0-beta.2

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 (33) hide show
  1. package/ARCHITECTURE.md +251 -161
  2. package/QUICKSTART.md +404 -70
  3. package/README.md +179 -12
  4. package/SUMMARY.md +273 -40
  5. package/dist/cli.js +13 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/generator.d.ts +1 -1
  8. package/dist/generator.d.ts.map +1 -1
  9. package/dist/generator.js +52 -2
  10. package/dist/generator.js.map +1 -1
  11. package/dist/generators/app-module.generator.d.ts +5 -0
  12. package/dist/generators/app-module.generator.d.ts.map +1 -0
  13. package/dist/generators/app-module.generator.js +107 -0
  14. package/dist/generators/app-module.generator.js.map +1 -0
  15. package/dist/generators/controller.spec.generator.d.ts +7 -0
  16. package/dist/generators/controller.spec.generator.d.ts.map +1 -0
  17. package/dist/generators/controller.spec.generator.js +82 -0
  18. package/dist/generators/controller.spec.generator.js.map +1 -0
  19. package/dist/generators/dto.generator.d.ts +2 -2
  20. package/dist/generators/dto.generator.d.ts.map +1 -1
  21. package/dist/generators/dto.generator.js +127 -15
  22. package/dist/generators/dto.generator.js.map +1 -1
  23. package/dist/generators/dto.spec.generator.d.ts +6 -0
  24. package/dist/generators/dto.spec.generator.d.ts.map +1 -0
  25. package/dist/generators/dto.spec.generator.js +42 -0
  26. package/dist/generators/dto.spec.generator.js.map +1 -0
  27. package/dist/generators/service.spec.generator.d.ts +7 -0
  28. package/dist/generators/service.spec.generator.d.ts.map +1 -0
  29. package/dist/generators/service.spec.generator.js +49 -0
  30. package/dist/generators/service.spec.generator.js.map +1 -0
  31. package/dist/types.d.ts +17 -0
  32. package/dist/types.d.ts.map +1 -1
  33. package/package.json +7 -7
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,2CAAkD;AAClD,gDAAwB;AAExB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,wBAAwB,CAAC;KAC9B,WAAW,CAAC,qFAAqF,CAAC;KAClG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,0CAA0C,CAAC;KACvD,cAAc,CAAC,oBAAoB,EAAE,6CAA6C,CAAC;KACnF,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,EAAE,aAAa,CAAC;KACpF,MAAM,CAAC,mBAAmB,EAAE,0CAA0C,EAAE,QAAQ,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,IAAI,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEjD,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE/D,MAAM,IAAA,+BAAmB,EAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAE/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@ export type GenerationMode = 'server' | 'client' | 'both';
2
2
  /**
3
3
  * Main generator function
4
4
  */
5
- export declare function generateFromSwagger(inputPath: string, outputPath: string, mode?: GenerationMode): Promise<void>;
5
+ export declare function generateFromSwagger(inputPath: string, outputPath: string, mode?: GenerationMode, withTest?: boolean, withValidate?: boolean, onlyDtos?: boolean): Promise<void>;
6
6
  //# sourceMappingURL=generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,cAAyB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA2Df"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,cAAyB,EAC/B,QAAQ,GAAE,OAAe,EACzB,YAAY,GAAE,OAAe,EAC7B,QAAQ,GAAE,OAAe,GACxB,OAAO,CAAC,IAAI,CAAC,CAiHf"}
package/dist/generator.js CHANGED
@@ -45,12 +45,16 @@ const service_generator_1 = require("./generators/service.generator");
45
45
  const client_service_generator_1 = require("./generators/client-service.generator");
46
46
  const controller_generator_1 = require("./generators/controller.generator");
47
47
  const module_generator_1 = require("./generators/module.generator");
48
+ const app_module_generator_1 = require("./generators/app-module.generator");
49
+ const controller_spec_generator_1 = require("./generators/controller.spec.generator");
50
+ const service_spec_generator_1 = require("./generators/service.spec.generator");
51
+ const dto_spec_generator_1 = require("./generators/dto.spec.generator");
48
52
  const file_writer_1 = require("./file-writer");
49
53
  const utils_1 = require("./utils");
50
54
  /**
51
55
  * Main generator function
52
56
  */
53
- async function generateFromSwagger(inputPath, outputPath, mode = 'server') {
57
+ async function generateFromSwagger(inputPath, outputPath, mode = 'server', withTest = false, withValidate = false, onlyDtos = false) {
54
58
  console.log(chalk_1.default.blue('\n๐Ÿ“‹ Parsing Swagger file...'));
55
59
  const spec = await (0, parser_1.parseSwaggerFile)(inputPath);
56
60
  // Group endpoints by tag
@@ -60,11 +64,29 @@ async function generateFromSwagger(inputPath, outputPath, mode = 'server') {
60
64
  const dirs = await (0, file_writer_1.createDirectoryStructure)(outputPath, tags);
61
65
  // Generate DTOs
62
66
  console.log(chalk_1.default.blue('\n๐Ÿ“ฆ Generating DTOs...'));
63
- const dtos = (0, dto_generator_1.generateDtos)(spec);
67
+ const dtos = (0, dto_generator_1.generateDtos)(spec, withValidate);
68
+ console.log(chalk_1.default.green(`โœ… Generated ${dtos.length} DTOs`));
64
69
  for (const dto of dtos) {
65
70
  const filePath = path.join(dirs.dtos, `${(0, utils_1.toKebabCase)(dto.name)}.dto.ts`);
66
71
  await (0, file_writer_1.writeFile)(filePath, dto.content);
67
72
  }
73
+ // If only-dtos flag is set, skip everything else
74
+ if (onlyDtos) {
75
+ console.log(chalk_1.default.blue('\nโœ… All files generated successfully!'));
76
+ console.log(chalk_1.default.gray(`\nGenerated files in: ${outputPath}`));
77
+ console.log(chalk_1.default.gray(` - ${dtos.length} DTOs`));
78
+ return;
79
+ }
80
+ // Generate DTO test files if requested
81
+ if (withTest && (mode === 'server' || mode === 'both')) {
82
+ console.log(chalk_1.default.blue('\n๐Ÿงช Generating DTO test files...'));
83
+ const testsDtosDir = path.join(outputPath, 'tests', 'dtos');
84
+ for (const dto of dtos) {
85
+ const testSpec = (0, dto_spec_generator_1.generateDtoSpec)(dto.name);
86
+ const testPath = path.join(testsDtosDir, `${(0, utils_1.toKebabCase)(dto.name)}.dto.spec.ts`);
87
+ await (0, file_writer_1.writeFile)(testPath, testSpec.content);
88
+ }
89
+ }
68
90
  // Generate services, controllers, and modules for each tag
69
91
  console.log(chalk_1.default.blue('\n๐Ÿ”ง Generating Services, Controllers, and Modules...'));
70
92
  for (const [tag, endpoints] of endpointsByTag.entries()) {
@@ -83,6 +105,26 @@ async function generateFromSwagger(inputPath, outputPath, mode = 'server') {
83
105
  const module = (0, module_generator_1.generateModule)(tag);
84
106
  const modulePath = path.join(tagDir, `${kebabTag}.module.ts`);
85
107
  await (0, file_writer_1.writeFile)(modulePath, module.content);
108
+ // Generate test files if requested
109
+ if (withTest) {
110
+ const testsTagDir = path.join(outputPath, 'tests', kebabTag);
111
+ // Convert endpoints to SwaggerEndpoint format
112
+ const swaggerEndpoints = endpoints.map(ep => ({
113
+ method: ep.method,
114
+ path: ep.path,
115
+ operationId: ep.operation.operationId,
116
+ operation: ep.operation,
117
+ parameters: ep.operation.parameters
118
+ }));
119
+ // Generate controller spec (in tests directory)
120
+ const controllerSpec = (0, controller_spec_generator_1.generateControllerSpec)(tag, swaggerEndpoints);
121
+ const controllerSpecPath = path.join(testsTagDir, `${kebabTag}.controller.spec.ts`);
122
+ await (0, file_writer_1.writeFile)(controllerSpecPath, controllerSpec.content);
123
+ // Generate service spec (in tests directory)
124
+ const serviceSpec = (0, service_spec_generator_1.generateServiceSpec)(tag, swaggerEndpoints);
125
+ const serviceSpecPath = path.join(testsTagDir, `${kebabTag}.service.spec.ts`);
126
+ await (0, file_writer_1.writeFile)(serviceSpecPath, serviceSpec.content);
127
+ }
86
128
  }
87
129
  if (mode === 'client' || mode === 'both') {
88
130
  // Generate client service
@@ -92,6 +134,11 @@ async function generateFromSwagger(inputPath, outputPath, mode = 'server') {
92
134
  }
93
135
  }
94
136
  console.log(chalk_1.default.green('\nโœ… All files generated successfully!'));
137
+ // Generate or update app.module.ts if generating server modules
138
+ if (mode === 'server' || mode === 'both') {
139
+ console.log(chalk_1.default.blue('\n๐Ÿ“ Updating app.module.ts...'));
140
+ await (0, app_module_generator_1.generateOrUpdateAppModule)(outputPath, tags);
141
+ }
95
142
  console.log(chalk_1.default.gray(`\nGenerated files in: ${outputPath}`));
96
143
  console.log(chalk_1.default.gray(` - ${dtos.length} DTOs`));
97
144
  if (mode === 'server' || mode === 'both') {
@@ -100,5 +147,8 @@ async function generateFromSwagger(inputPath, outputPath, mode = 'server') {
100
147
  if (mode === 'client' || mode === 'both') {
101
148
  console.log(chalk_1.default.gray(` - ${tags.length} Client services`));
102
149
  }
150
+ if (withTest && (mode === 'server' || mode === 'both')) {
151
+ console.log(chalk_1.default.gray(` - ${dtos.length + tags.length * 2} Test files (.spec.ts)`));
152
+ }
103
153
  }
104
154
  //# sourceMappingURL=generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generate or update app.module.ts with all generated modules
3
+ */
4
+ export declare function generateOrUpdateAppModule(outputPath: string, tags: string[]): Promise<void>;
5
+ //# sourceMappingURL=app-module.generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-module.generator.d.ts","sourceRoot":"","sources":["../../src/generators/app-module.generator.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateOrUpdateAppModule = generateOrUpdateAppModule;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const utils_1 = require("../utils");
40
+ /**
41
+ * Generate or update app.module.ts with all generated modules
42
+ */
43
+ async function generateOrUpdateAppModule(outputPath, tags) {
44
+ const appModulePath = path.join(outputPath, 'app.module.ts');
45
+ const moduleImports = [];
46
+ const moduleNames = [];
47
+ // Prepare imports and module names
48
+ for (const tag of tags) {
49
+ const moduleName = `${(0, utils_1.toPascalCase)(tag)}Module`;
50
+ const kebabTag = (0, utils_1.toKebabCase)(tag);
51
+ moduleNames.push(moduleName);
52
+ moduleImports.push(`import { ${moduleName} } from './${kebabTag}/${kebabTag}.module';`);
53
+ }
54
+ // Check if app.module.ts exists
55
+ const appModuleExists = fs.existsSync(appModulePath);
56
+ if (appModuleExists) {
57
+ // Update existing app.module.ts
58
+ await updateExistingAppModule(appModulePath, moduleImports, moduleNames);
59
+ }
60
+ else {
61
+ // Create new app.module.ts
62
+ const content = generateAppModuleContent(moduleImports, moduleNames);
63
+ fs.writeFileSync(appModulePath, content, 'utf-8');
64
+ }
65
+ }
66
+ /**
67
+ * Update existing app.module.ts file
68
+ */
69
+ async function updateExistingAppModule(filePath, newImports, newModuleNames) {
70
+ const content = fs.readFileSync(filePath, 'utf-8');
71
+ // Extract existing imports that are NOT generated module imports
72
+ const lines = content.split('\n');
73
+ const existingNonModuleImports = [];
74
+ for (const line of lines) {
75
+ const trimmed = line.trim();
76
+ // Keep imports that:
77
+ // 1. Start with 'import'
78
+ // 2. Contain 'from' keyword (to ensure it's an actual import statement)
79
+ // 3. Are not our generated module imports
80
+ // 4. Are not from '@nestjs/common' (we'll add it back automatically)
81
+ if (trimmed.startsWith('import') &&
82
+ trimmed.includes(' from ') &&
83
+ !line.includes('.module') &&
84
+ !trimmed.includes("from '@nestjs/common'")) {
85
+ existingNonModuleImports.push(line);
86
+ }
87
+ }
88
+ // Generate the complete new content
89
+ const updatedContent = generateAppModuleContent(newImports, newModuleNames, existingNonModuleImports);
90
+ fs.writeFileSync(filePath, updatedContent, 'utf-8');
91
+ }
92
+ /**
93
+ * Generate complete app.module.ts content
94
+ */
95
+ function generateAppModuleContent(moduleImports, moduleNames, additionalImports = []) {
96
+ const coreImport = "import { Module } from '@nestjs/common';";
97
+ // Combine all imports
98
+ const allImports = [
99
+ coreImport,
100
+ ...additionalImports.filter(imp => !imp.includes('@nestjs/common')),
101
+ ...moduleImports
102
+ ].join('\n');
103
+ const moduleDecorator = `@Module({\n imports: [\n${moduleNames.map(name => ` ${name}`).join(',\n')}\n ],\n})`;
104
+ const classDefinition = 'export class AppModule {}';
105
+ return `${allImports}\n\n${moduleDecorator}\n${classDefinition}\n`;
106
+ }
107
+ //# sourceMappingURL=app-module.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-module.generator.js","sourceRoot":"","sources":["../../src/generators/app-module.generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { GeneratedTest } from '../types';
2
+ import { SwaggerEndpoint } from '../types';
3
+ /**
4
+ * Generate test file for a controller
5
+ */
6
+ export declare function generateControllerSpec(tag: string, endpoints: SwaggerEndpoint[]): GeneratedTest;
7
+ //# sourceMappingURL=controller.spec.generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.spec.generator.d.ts","sourceRoot":"","sources":["../../src/generators/controller.spec.generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,eAAe,EAAE,GAC3B,aAAa,CAqFf"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateControllerSpec = generateControllerSpec;
4
+ const utils_1 = require("../utils");
5
+ /**
6
+ * Generate test file for a controller
7
+ */
8
+ function generateControllerSpec(tag, endpoints) {
9
+ const controllerName = `${(0, utils_1.toPascalCase)(tag)}Controller`;
10
+ const serviceName = `${(0, utils_1.toPascalCase)(tag)}Service`;
11
+ const kebabTag = (0, utils_1.toKebabCase)(tag);
12
+ const imports = new Set();
13
+ imports.add("import { Test, TestingModule } from '@nestjs/testing';");
14
+ imports.add(`import { ${controllerName} } from '../../${kebabTag}/${kebabTag}.controller';`);
15
+ imports.add(`import { ${serviceName} } from '../../${kebabTag}/${kebabTag}.service';`);
16
+ // Generate test cases for each endpoint
17
+ const testCases = [];
18
+ for (const endpoint of endpoints) {
19
+ const methodName = endpoint.operationId || `${endpoint.method}${endpoint.path.replace(/[^a-zA-Z0-9]/g, '')}`;
20
+ const testName = `should call ${methodName}`;
21
+ let testCase = ` it('${testName}', async () => {\n`;
22
+ testCase += ` const result = { data: 'test' };\n`;
23
+ testCase += ` jest.spyOn(service, '${methodName}').mockResolvedValue(result as any);\n\n`;
24
+ // Generate method call with appropriate parameters
25
+ const params = [];
26
+ // Check for path parameters
27
+ const pathParams = endpoint.path.match(/{([^}]+)}/g);
28
+ if (pathParams) {
29
+ pathParams.forEach(() => params.push("'test-id'"));
30
+ }
31
+ // Check for body parameter
32
+ if (endpoint.method === 'post' || endpoint.method === 'put' || endpoint.method === 'patch') {
33
+ params.push('{}');
34
+ }
35
+ // Check for query parameters
36
+ if (endpoint.parameters?.some(p => p.in === 'query')) {
37
+ // Query params are usually optional, so we can skip them in tests
38
+ }
39
+ testCase += ` expect(await controller.${methodName}(${params.join(', ')})).toBe(result);\n`;
40
+ testCase += ` expect(service.${methodName}).toHaveBeenCalled();\n`;
41
+ testCase += ` });\n`;
42
+ testCases.push(testCase);
43
+ }
44
+ const content = `${Array.from(imports).join('\n')}
45
+
46
+ describe('${controllerName}', () => {
47
+ let controller: ${controllerName};
48
+ let service: ${serviceName};
49
+
50
+ beforeEach(async () => {
51
+ const module: TestingModule = await Test.createTestingModule({
52
+ controllers: [${controllerName}],
53
+ providers: [
54
+ {
55
+ provide: ${serviceName},
56
+ useValue: {
57
+ ${endpoints.map(ep => {
58
+ const methodName = ep.operationId || `${ep.method}${ep.path.replace(/[^a-zA-Z0-9]/g, '')}`;
59
+ return ` ${methodName}: jest.fn()`;
60
+ }).join(',\n')}
61
+ },
62
+ },
63
+ ],
64
+ }).compile();
65
+
66
+ controller = module.get<${controllerName}>(${controllerName});
67
+ service = module.get<${serviceName}>(${serviceName});
68
+ });
69
+
70
+ it('should be defined', () => {
71
+ expect(controller).toBeDefined();
72
+ });
73
+
74
+ ${testCases.join('\n')}});
75
+ `;
76
+ return {
77
+ name: `${controllerName}Spec`,
78
+ content,
79
+ imports,
80
+ };
81
+ }
82
+ //# sourceMappingURL=controller.spec.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.spec.generator.js","sourceRoot":"","sources":["../../src/generators/controller.spec.generator.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,9 @@ import { SwaggerSpec, SwaggerSchema, GeneratedDto } from '../types';
2
2
  /**
3
3
  * Generate DTOs from Swagger schemas
4
4
  */
5
- export declare function generateDtos(spec: SwaggerSpec): GeneratedDto[];
5
+ export declare function generateDtos(spec: SwaggerSpec, withValidate?: boolean): GeneratedDto[];
6
6
  /**
7
7
  * Generate DTOs from request body
8
8
  */
9
- export declare function generateDtoFromRequestBody(operationId: string, schema: SwaggerSchema | undefined, spec: SwaggerSpec): GeneratedDto | null;
9
+ export declare function generateDtoFromRequestBody(operationId: string, schema: SwaggerSchema | undefined, spec: SwaggerSpec, withValidate?: boolean): GeneratedDto | null;
10
10
  //# sourceMappingURL=dto.generator.d.ts.map
@@ -1 +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"}
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,EAAE,YAAY,GAAE,OAAe,GAAG,YAAY,EAAE,CAY7F;AAkWD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,IAAI,EAAE,WAAW,EACjB,YAAY,GAAE,OAAe,GAC5B,YAAY,GAAG,IAAI,CAUrB"}
@@ -7,11 +7,11 @@ const utils_1 = require("../utils");
7
7
  /**
8
8
  * Generate DTOs from Swagger schemas
9
9
  */
10
- function generateDtos(spec) {
10
+ function generateDtos(spec, withValidate = false) {
11
11
  const schemas = (0, parser_1.getSchemas)(spec);
12
12
  const dtos = [];
13
13
  for (const [schemaName, schema] of Object.entries(schemas)) {
14
- const dto = generateDtoFromSchema(schemaName, schema, spec);
14
+ const dto = generateDtoFromSchema(schemaName, schema, spec, withValidate);
15
15
  if (dto) {
16
16
  dtos.push(dto);
17
17
  }
@@ -113,10 +113,16 @@ function formatPropertyName(propName) {
113
113
  /**
114
114
  * Generate a single DTO from a schema
115
115
  */
116
- function generateDtoFromSchema(schemaName, schema, spec) {
116
+ function generateDtoFromSchema(schemaName, schema, spec, withValidate = false) {
117
117
  const className = (0, utils_1.toPascalCase)(schemaName);
118
118
  const imports = new Set();
119
119
  imports.add("import { ApiProperty } from '@nestjs/swagger';");
120
+ // Add class-validator imports if validation is enabled
121
+ const validatorImports = new Set();
122
+ const transformerImports = new Set();
123
+ if (withValidate) {
124
+ // We'll add specific imports as we encounter them
125
+ }
120
126
  // Resolve schema composition (allOf, oneOf, anyOf)
121
127
  const { properties, required, extendsClass, baseProperties } = resolveSchemaComposition(schema, spec);
122
128
  // Add import for base class if using extends
@@ -133,7 +139,19 @@ function generateDtoFromSchema(schemaName, schema, spec) {
133
139
  continue;
134
140
  }
135
141
  const isRequired = required.includes(propName);
136
- const { type, decoratorOptions } = resolvePropertyType(propSchema, spec, imports);
142
+ const { type, decoratorOptions, validators } = resolvePropertyType(propSchema, spec, imports, className, withValidate);
143
+ // Add validator decorators if validation is enabled
144
+ if (withValidate && validators.length > 0) {
145
+ validators.forEach(validator => {
146
+ if (validator.import === 'Type') {
147
+ transformerImports.add(validator.import);
148
+ }
149
+ else {
150
+ validatorImports.add(validator.import);
151
+ }
152
+ classContent += ` ${validator.decorator}\n`;
153
+ });
154
+ }
137
155
  // Add ApiProperty decorator
138
156
  classContent += ` @ApiProperty(${decoratorOptions})\n`;
139
157
  // Add property with definite assignment assertion for required, optional modifier for not required
@@ -142,7 +160,17 @@ function generateDtoFromSchema(schemaName, schema, spec) {
142
160
  classContent += ` ${formattedPropName}${modifier}: ${type};\n\n`;
143
161
  }
144
162
  classContent += '}\n';
145
- const content = `${Array.from(imports).join('\n')}\n\n${classContent}`;
163
+ // Build final imports
164
+ const allImports = Array.from(imports);
165
+ if (validatorImports.size > 0) {
166
+ const validatorImportsList = Array.from(validatorImports).sort();
167
+ allImports.push(`import { ${validatorImportsList.join(', ')} } from 'class-validator';`);
168
+ }
169
+ if (transformerImports.size > 0) {
170
+ const transformerImportsList = Array.from(transformerImports).sort();
171
+ allImports.push(`import { ${transformerImportsList.join(', ')} } from 'class-transformer';`);
172
+ }
173
+ const content = `${allImports.join('\n')}\n\n${classContent}`;
146
174
  return {
147
175
  name: className,
148
176
  content,
@@ -152,8 +180,9 @@ function generateDtoFromSchema(schemaName, schema, spec) {
152
180
  /**
153
181
  * Resolve property type and decorator options
154
182
  */
155
- function resolvePropertyType(schema, spec, imports) {
183
+ function resolvePropertyType(schema, spec, imports, currentClassName, withValidate = false) {
156
184
  const options = [];
185
+ const validators = [];
157
186
  if (schema.description) {
158
187
  // Replace newlines and carriage returns with spaces, and escape single quotes
159
188
  const cleanDescription = schema.description.replace(/\n/g, ' ').replace(/\r/g, ' ').replace(/'/g, "\\'");
@@ -163,52 +192,135 @@ function resolvePropertyType(schema, spec, imports) {
163
192
  if (schema.$ref) {
164
193
  const refName = (0, parser_1.getSchemaNameFromRef)(schema.$ref);
165
194
  const className = (0, utils_1.toPascalCase)(refName);
166
- imports.add(`import { ${className} } from './${(0, utils_1.toKebabCase)(refName)}.dto';`);
195
+ // Only add import if it's not a self-reference
196
+ if (className !== currentClassName) {
197
+ imports.add(`import { ${className} } from './${(0, utils_1.toKebabCase)(refName)}.dto';`);
198
+ }
167
199
  options.push(`type: () => ${className}`);
168
- return { type: className, decoratorOptions: `{ ${options.join(', ')} }` };
200
+ // Add validation decorators
201
+ if (withValidate) {
202
+ validators.push({ import: 'ValidateNested', decorator: '@ValidateNested()' });
203
+ validators.push({ import: 'Type', decorator: `@Type(() => ${className})` });
204
+ }
205
+ return { type: className, decoratorOptions: `{ ${options.join(', ')} }`, validators };
169
206
  }
170
207
  // Handle array
171
208
  if (schema.type === 'array' && schema.items) {
172
209
  if (schema.items.$ref) {
173
210
  const refName = (0, parser_1.getSchemaNameFromRef)(schema.items.$ref);
174
211
  const className = (0, utils_1.toPascalCase)(refName);
175
- imports.add(`import { ${className} } from './${(0, utils_1.toKebabCase)(refName)}.dto';`);
212
+ // Only add import if it's not a self-reference
213
+ if (className !== currentClassName) {
214
+ imports.add(`import { ${className} } from './${(0, utils_1.toKebabCase)(refName)}.dto';`);
215
+ }
176
216
  options.push(`type: () => [${className}]`);
177
217
  options.push('isArray: true');
178
- return { type: `${className}[]`, decoratorOptions: `{ ${options.join(', ')} }` };
218
+ // Add validation decorators for arrays
219
+ if (withValidate) {
220
+ validators.push({ import: 'IsArray', decorator: '@IsArray()' });
221
+ validators.push({ import: 'ValidateNested', decorator: '@ValidateNested({ each: true })' });
222
+ validators.push({ import: 'Type', decorator: `@Type(() => ${className})` });
223
+ }
224
+ return { type: `${className}[]`, decoratorOptions: `{ ${options.join(', ')} }`, validators };
179
225
  }
180
226
  else {
181
227
  const itemType = (0, utils_1.getTypeScriptType)(schema.items.type, schema.items.format);
182
228
  options.push('isArray: true');
183
- return { type: `${itemType}[]`, decoratorOptions: `{ ${options.join(', ')} }` };
229
+ // Add validation decorator for simple arrays
230
+ if (withValidate) {
231
+ validators.push({ import: 'IsArray', decorator: '@IsArray()' });
232
+ // Add type-specific validators for array items
233
+ if (schema.items.type === 'string') {
234
+ validators.push({ import: 'IsString', decorator: '@IsString({ each: true })' });
235
+ }
236
+ else if (schema.items.type === 'number' || schema.items.type === 'integer') {
237
+ validators.push({ import: 'IsNumber', decorator: '@IsNumber({}, { each: true })' });
238
+ }
239
+ else if (schema.items.type === 'boolean') {
240
+ validators.push({ import: 'IsBoolean', decorator: '@IsBoolean({ each: true })' });
241
+ }
242
+ }
243
+ return { type: `${itemType}[]`, decoratorOptions: `{ ${options.join(', ')} }`, validators };
184
244
  }
185
245
  }
186
246
  // Handle enum
187
247
  if (schema.enum) {
188
248
  options.push(`enum: [${schema.enum.map((v) => `'${v}'`).join(', ')}]`);
189
- return { type: 'string', decoratorOptions: `{ ${options.join(', ')} }` };
249
+ // Add validation decorator for enums
250
+ if (withValidate) {
251
+ validators.push({ import: 'IsEnum', decorator: `@IsEnum([${schema.enum.map((v) => `'${v}'`).join(', ')}])` });
252
+ }
253
+ return { type: 'string', decoratorOptions: `{ ${options.join(', ')} }`, validators };
190
254
  }
191
255
  // Handle basic types
192
256
  const type = (0, utils_1.getTypeScriptType)(schema.type, schema.format);
193
257
  // Handle date/date-time format first (to avoid duplicate type property)
194
258
  if (schema.format === 'date' || schema.format === 'date-time') {
195
259
  options.push('type: Date');
260
+ if (withValidate) {
261
+ validators.push({ import: 'IsDate', decorator: '@IsDate()' });
262
+ validators.push({ import: 'Type', decorator: '@Type(() => Date)' });
263
+ }
196
264
  }
197
265
  else if (schema.type === 'number' || schema.type === 'integer') {
198
266
  options.push('type: Number');
267
+ if (withValidate) {
268
+ if (schema.type === 'integer') {
269
+ validators.push({ import: 'IsInt', decorator: '@IsInt()' });
270
+ }
271
+ else {
272
+ validators.push({ import: 'IsNumber', decorator: '@IsNumber()' });
273
+ }
274
+ // Add min/max validators if specified
275
+ if (schema.minimum !== undefined) {
276
+ validators.push({ import: 'Min', decorator: `@Min(${schema.minimum})` });
277
+ }
278
+ if (schema.maximum !== undefined) {
279
+ validators.push({ import: 'Max', decorator: `@Max(${schema.maximum})` });
280
+ }
281
+ }
199
282
  }
200
283
  else if (schema.type === 'string') {
201
284
  options.push('type: String');
285
+ if (withValidate) {
286
+ validators.push({ import: 'IsString', decorator: '@IsString()' });
287
+ // Add string-specific validators
288
+ if (schema.minLength !== undefined) {
289
+ validators.push({ import: 'MinLength', decorator: `@MinLength(${schema.minLength})` });
290
+ }
291
+ if (schema.maxLength !== undefined) {
292
+ validators.push({ import: 'MaxLength', decorator: `@MaxLength(${schema.maxLength})` });
293
+ }
294
+ if (schema.pattern) {
295
+ const escapedPattern = schema.pattern.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
296
+ validators.push({ import: 'Matches', decorator: `@Matches(/${escapedPattern}/)` });
297
+ }
298
+ // Email format
299
+ if (schema.format === 'email') {
300
+ validators.push({ import: 'IsEmail', decorator: '@IsEmail()' });
301
+ }
302
+ // URL format
303
+ if (schema.format === 'uri' || schema.format === 'url') {
304
+ validators.push({ import: 'IsUrl', decorator: '@IsUrl()' });
305
+ }
306
+ // UUID format
307
+ if (schema.format === 'uuid') {
308
+ validators.push({ import: 'IsUUID', decorator: '@IsUUID()' });
309
+ }
310
+ }
202
311
  }
203
312
  else if (schema.type === 'boolean') {
204
313
  options.push('type: Boolean');
314
+ if (withValidate) {
315
+ validators.push({ import: 'IsBoolean', decorator: '@IsBoolean()' });
316
+ }
205
317
  }
206
- return { type, decoratorOptions: `{ ${options.join(', ')} }` };
318
+ return { type, decoratorOptions: `{ ${options.join(', ')} }`, validators };
207
319
  }
208
320
  /**
209
321
  * Generate DTOs from request body
210
322
  */
211
- function generateDtoFromRequestBody(operationId, schema, spec) {
323
+ function generateDtoFromRequestBody(operationId, schema, spec, withValidate = false) {
212
324
  if (!schema)
213
325
  return null;
214
326
  if (schema.$ref) {
@@ -216,6 +328,6 @@ function generateDtoFromRequestBody(operationId, schema, spec) {
216
328
  return null;
217
329
  }
218
330
  const dtoName = `${(0, utils_1.toPascalCase)(operationId)}Dto`;
219
- return generateDtoFromSchema(dtoName, schema, spec);
331
+ return generateDtoFromSchema(dtoName, schema, spec, withValidate);
220
332
  }
221
333
  //# sourceMappingURL=dto.generator.js.map