@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.
- package/ARCHITECTURE.md +251 -161
- package/QUICKSTART.md +404 -70
- package/README.md +179 -12
- package/SUMMARY.md +273 -40
- package/dist/cli.js +13 -1
- package/dist/cli.js.map +1 -1
- package/dist/generator.d.ts +1 -1
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +52 -2
- package/dist/generator.js.map +1 -1
- package/dist/generators/app-module.generator.d.ts +5 -0
- package/dist/generators/app-module.generator.d.ts.map +1 -0
- package/dist/generators/app-module.generator.js +107 -0
- package/dist/generators/app-module.generator.js.map +1 -0
- package/dist/generators/controller.spec.generator.d.ts +7 -0
- package/dist/generators/controller.spec.generator.d.ts.map +1 -0
- package/dist/generators/controller.spec.generator.js +82 -0
- package/dist/generators/controller.spec.generator.js.map +1 -0
- package/dist/generators/dto.generator.d.ts +2 -2
- package/dist/generators/dto.generator.d.ts.map +1 -1
- package/dist/generators/dto.generator.js +127 -15
- package/dist/generators/dto.generator.js.map +1 -1
- package/dist/generators/dto.spec.generator.d.ts +6 -0
- package/dist/generators/dto.spec.generator.d.ts.map +1 -0
- package/dist/generators/dto.spec.generator.js +42 -0
- package/dist/generators/dto.spec.generator.js.map +1 -0
- package/dist/generators/service.spec.generator.d.ts +7 -0
- package/dist/generators/service.spec.generator.d.ts.map +1 -0
- package/dist/generators/service.spec.generator.js +49 -0
- package/dist/generators/service.spec.generator.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- 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;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/generator.d.ts
CHANGED
|
@@ -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
|
package/dist/generator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"
|
|
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
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,kDAwHC;AA7ID,2CAA6B;AAC7B,kDAA0B;AAC1B,qCAAiE;AACjE,8DAA0D;AAC1D,sEAAiE;AACjE,oFAA8E;AAC9E,4EAAuE;AACvE,oEAA+D;AAC/D,4EAA8E;AAC9E,sFAAgF;AAChF,gFAA0E;AAC1E,wEAAkE;AAClE,+CAAoE;AACpE,mCAAsC;AAKtC;;GAEG;AACI,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,UAAkB,EAClB,OAAuB,QAAQ,EAC/B,WAAoB,KAAK,EACzB,eAAwB,KAAK,EAC7B,WAAoB,KAAK;IAEzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,IAAA,yBAAgB,EAAC,SAAS,CAAC,CAAC;IAE/C,yBAAyB;IACzB,MAAM,cAAc,GAAG,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,IAAA,sCAAwB,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAE9D,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAA,4BAAY,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAA,mBAAW,EAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,MAAM,IAAA,uBAAS,EAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,iDAAiD;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAA,oCAAe,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,IAAA,mBAAW,EAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjF,MAAM,IAAA,uBAAS,EAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;IACjF,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,GAAG,CAAC,CAAC;QAElC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACzC,0BAA0B;YAC1B,MAAM,OAAO,GAAG,IAAA,mCAAe,EAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,aAAa,CAAC,CAAC;YAChE,MAAM,IAAA,uBAAS,EAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAE9C,sBAAsB;YACtB,MAAM,UAAU,GAAG,IAAA,yCAAkB,EAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,gBAAgB,CAAC,CAAC;YACtE,MAAM,IAAA,uBAAS,EAAC,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;YAEpD,kBAAkB;YAClB,MAAM,MAAM,GAAG,IAAA,iCAAc,EAAC,GAAG,CAAC,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,YAAY,CAAC,CAAC;YAC9D,MAAM,IAAA,uBAAS,EAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAE5C,mCAAmC;YACnC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAE7D,8CAA8C;gBAC9C,MAAM,gBAAgB,GAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC/D,MAAM,EAAE,EAAE,CAAC,MAAM;oBACjB,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW;oBACrC,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU;iBACpC,CAAC,CAAC,CAAC;gBAEJ,gDAAgD;gBAChD,MAAM,cAAc,GAAG,IAAA,kDAAsB,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBACrE,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,qBAAqB,CAAC,CAAC;gBACpF,MAAM,IAAA,uBAAS,EAAC,kBAAkB,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;gBAE5D,6CAA6C;gBAC7C,MAAM,WAAW,GAAG,IAAA,4CAAmB,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBAC/D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,kBAAkB,CAAC,CAAC;gBAC9E,MAAM,IAAA,uBAAS,EAAC,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACzC,0BAA0B;YAC1B,MAAM,aAAa,GAAG,IAAA,gDAAqB,EAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,YAAY,CAAC,CAAC;YACrE,MAAM,IAAA,uBAAS,EAAC,iBAAiB,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAElE,gEAAgE;IAChE,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC1D,MAAM,IAAA,gDAAyB,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,wDAAwD,CAAC,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,8DA2BC;AAlCD,uCAAyB;AACzB,2CAA6B;AAC7B,oCAAqD;AAErD;;GAEG;AACI,KAAK,UAAU,yBAAyB,CAC7C,UAAkB,EAClB,IAAc;IAEd,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,mCAAmC;IACnC,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,aAAa,CAAC,IAAI,CAAC,YAAY,UAAU,cAAc,QAAQ,IAAI,QAAQ,WAAW,CAAC,CAAC;IAC1F,CAAC;IAED,gCAAgC;IAChC,MAAM,eAAe,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAErD,IAAI,eAAe,EAAE,CAAC;QACpB,gCAAgC;QAChC,MAAM,uBAAuB,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,2BAA2B;QAC3B,MAAM,OAAO,GAAG,wBAAwB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACrE,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,uBAAuB,CACpC,QAAgB,EAChB,UAAoB,EACpB,cAAwB;IAExB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnD,iEAAiE;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,wBAAwB,GAAa,EAAE,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,qBAAqB;QACrB,yBAAyB;QACzB,wEAAwE;QACxE,0CAA0C;QAC1C,qEAAqE;QACrE,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACzB,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC/C,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,cAAc,GAAG,wBAAwB,CAAC,UAAU,EAAE,cAAc,EAAE,wBAAwB,CAAC,CAAC;IACtG,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAC/B,aAAuB,EACvB,WAAqB,EACrB,oBAA8B,EAAE;IAEhC,MAAM,UAAU,GAAG,0CAA0C,CAAC;IAE9D,sBAAsB;IACtB,MAAM,UAAU,GAAG;QACjB,UAAU;QACV,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACnE,GAAG,aAAa;KACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,eAAe,GAAG,4BAA4B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;IACnH,MAAM,eAAe,GAAG,2BAA2B,CAAC;IAEpD,OAAO,GAAG,UAAU,OAAO,eAAe,KAAK,eAAe,IAAI,CAAC;AACrE,CAAC"}
|
|
@@ -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":";;AAOA,wDAwFC;AA9FD,oCAAqD;AAGrD;;GAEG;AACH,SAAgB,sBAAsB,CACpC,GAAW,EACX,SAA4B;IAE5B,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,wDAAwD,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,YAAY,cAAc,kBAAkB,QAAQ,IAAI,QAAQ,eAAe,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,kBAAkB,QAAQ,IAAI,QAAQ,YAAY,CAAC,CAAC;IAEvF,wCAAwC;IACxC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC;QAC7G,MAAM,QAAQ,GAAG,eAAe,UAAU,EAAE,CAAC;QAE7C,IAAI,QAAQ,GAAG,SAAS,QAAQ,oBAAoB,CAAC;QACrD,QAAQ,IAAI,wCAAwC,CAAC;QACrD,QAAQ,IAAI,4BAA4B,UAAU,0CAA0C,CAAC;QAE7F,mDAAmD;QACnD,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,4BAA4B;QAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACrD,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,2BAA2B;QAC3B,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC3F,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,6BAA6B;QAC7B,IAAI,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;YACrD,kEAAkE;QACpE,CAAC;QAED,QAAQ,IAAI,+BAA+B,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAC/F,QAAQ,IAAI,sBAAsB,UAAU,yBAAyB,CAAC;QACtE,QAAQ,IAAI,SAAS,CAAC;QAEtB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;YAEvC,cAAc;oBACN,cAAc;iBACjB,WAAW;;;;sBAIN,cAAc;;;qBAGf,WAAW;;EAE9B,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QACnB,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC;QAC3F,OAAO,eAAe,UAAU,aAAa,CAAC;IAChD,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;;;;;8BAMgB,cAAc,KAAK,cAAc;2BACpC,WAAW,KAAK,WAAW;;;;;;;EAOpD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;CACrB,CAAC;IAEA,OAAO;QACL,IAAI,EAAE,GAAG,cAAc,MAAM;QAC7B,OAAO;QACP,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|