nest-scramble 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +304 -0
- package/dist/NestScrambleModule.d.ts +16 -0
- package/dist/NestScrambleModule.d.ts.map +1 -0
- package/dist/NestScrambleModule.js +73 -0
- package/dist/NestScrambleModule.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +77 -0
- package/dist/cli.js.map +1 -0
- package/dist/controllers/DemoController.d.ts +53 -0
- package/dist/controllers/DemoController.d.ts.map +1 -0
- package/dist/controllers/DemoController.js +91 -0
- package/dist/controllers/DemoController.js.map +1 -0
- package/dist/controllers/DocsController.d.ts +7 -0
- package/dist/controllers/DocsController.d.ts.map +1 -0
- package/dist/controllers/DocsController.js +69 -0
- package/dist/controllers/DocsController.js.map +1 -0
- package/dist/generators/PostmanCollectionGenerator.d.ts +61 -0
- package/dist/generators/PostmanCollectionGenerator.d.ts.map +1 -0
- package/dist/generators/PostmanCollectionGenerator.js +97 -0
- package/dist/generators/PostmanCollectionGenerator.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/MockMiddleware.d.ts +15 -0
- package/dist/middleware/MockMiddleware.d.ts.map +1 -0
- package/dist/middleware/MockMiddleware.js +94 -0
- package/dist/middleware/MockMiddleware.js.map +1 -0
- package/dist/scanner/ScannerService.d.ts +34 -0
- package/dist/scanner/ScannerService.d.ts.map +1 -0
- package/dist/scanner/ScannerService.js +114 -0
- package/dist/scanner/ScannerService.js.map +1 -0
- package/dist/utils/DtoAnalyzer.d.ts +25 -0
- package/dist/utils/DtoAnalyzer.d.ts.map +1 -0
- package/dist/utils/DtoAnalyzer.js +93 -0
- package/dist/utils/DtoAnalyzer.js.map +1 -0
- package/dist/utils/MockGenerator.d.ts +18 -0
- package/dist/utils/MockGenerator.d.ts.map +1 -0
- package/dist/utils/MockGenerator.js +135 -0
- package/dist/utils/MockGenerator.js.map +1 -0
- package/dist/utils/OpenApiTransformer.d.ts +38 -0
- package/dist/utils/OpenApiTransformer.d.ts.map +1 -0
- package/dist/utils/OpenApiTransformer.js +182 -0
- package/dist/utils/OpenApiTransformer.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DtoAnalyzer = void 0;
|
|
4
|
+
/** Nest-Scramble | Developed by Mohamed Mustafa | MIT License **/
|
|
5
|
+
const ts_morph_1 = require("ts-morph");
|
|
6
|
+
class DtoAnalyzer {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.visited = new Set();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Analyzes a TypeScript type and returns detailed information
|
|
12
|
+
* @param type The TypeScript type to analyze
|
|
13
|
+
* @param isOptional Whether the type is optional
|
|
14
|
+
* @returns AnalyzedType with full type information
|
|
15
|
+
*/
|
|
16
|
+
analyzeType(type, isOptional = false) {
|
|
17
|
+
const typeText = type.getText();
|
|
18
|
+
// Prevent circular references
|
|
19
|
+
if (this.visited.has(typeText)) {
|
|
20
|
+
return {
|
|
21
|
+
type: typeText,
|
|
22
|
+
isArray: false,
|
|
23
|
+
isOptional,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
this.visited.add(typeText);
|
|
27
|
+
try {
|
|
28
|
+
const symbol = type.getSymbol();
|
|
29
|
+
// Check if it's an array
|
|
30
|
+
const arrayElementType = type.getArrayElementType();
|
|
31
|
+
if (arrayElementType) {
|
|
32
|
+
const elementAnalysis = this.analyzeType(arrayElementType);
|
|
33
|
+
return {
|
|
34
|
+
type: typeText,
|
|
35
|
+
isArray: true,
|
|
36
|
+
isOptional,
|
|
37
|
+
properties: elementAnalysis.properties,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Check if it's a union type
|
|
41
|
+
const unionTypes = type.getUnionTypes();
|
|
42
|
+
if (unionTypes.length > 1) {
|
|
43
|
+
return {
|
|
44
|
+
type: typeText,
|
|
45
|
+
isArray: false,
|
|
46
|
+
isOptional,
|
|
47
|
+
unionTypes: unionTypes.map(t => t.getText()),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Check if it's a class or interface
|
|
51
|
+
if (symbol) {
|
|
52
|
+
const declarations = symbol.getDeclarations();
|
|
53
|
+
for (const decl of declarations) {
|
|
54
|
+
if (ts_morph_1.Node.isClassDeclaration(decl) || ts_morph_1.Node.isInterfaceDeclaration(decl)) {
|
|
55
|
+
const properties = this.extractProperties(decl);
|
|
56
|
+
return {
|
|
57
|
+
type: typeText,
|
|
58
|
+
isArray: false,
|
|
59
|
+
isOptional,
|
|
60
|
+
properties,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Primitive or other types
|
|
66
|
+
return {
|
|
67
|
+
type: typeText,
|
|
68
|
+
isArray: false,
|
|
69
|
+
isOptional,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
this.visited.delete(typeText);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
extractProperties(decl) {
|
|
77
|
+
const properties = [];
|
|
78
|
+
const propDeclarations = decl.getProperties();
|
|
79
|
+
for (const prop of propDeclarations) {
|
|
80
|
+
const name = prop.getName();
|
|
81
|
+
const type = prop.getType();
|
|
82
|
+
const isOptional = prop.hasQuestionToken ? prop.hasQuestionToken() : false;
|
|
83
|
+
const analyzedType = this.analyzeType(type, isOptional);
|
|
84
|
+
properties.push({
|
|
85
|
+
name,
|
|
86
|
+
type: analyzedType,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return properties;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.DtoAnalyzer = DtoAnalyzer;
|
|
93
|
+
//# sourceMappingURL=DtoAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DtoAnalyzer.js","sourceRoot":"","sources":["../../src/utils/DtoAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AnalyzedType, PropertyInfo } from './DtoAnalyzer';
|
|
2
|
+
export declare class MockGenerator {
|
|
3
|
+
/**
|
|
4
|
+
* Generates mock data based on the analyzed type
|
|
5
|
+
* @param analyzedType The analyzed type information
|
|
6
|
+
* @returns Mock data object
|
|
7
|
+
*/
|
|
8
|
+
static generateMock(analyzedType: AnalyzedType): any;
|
|
9
|
+
private static generateMockForType;
|
|
10
|
+
/**
|
|
11
|
+
* Generates mock data for a property, using the property name for smarter generation
|
|
12
|
+
* @param property The property info
|
|
13
|
+
* @returns Mock value
|
|
14
|
+
*/
|
|
15
|
+
static generateMockForProperty(property: PropertyInfo): any;
|
|
16
|
+
private static generateMockForPropertyName;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=MockGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/MockGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3D,qBAAa,aAAa;IACxB;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,GAAG,GAAG;IA4BpD,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA6BlC;;;;OAIG;IACH,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,YAAY,GAAG,GAAG;IAqB3D,OAAO,CAAC,MAAM,CAAC,2BAA2B;CAkE3C"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockGenerator = void 0;
|
|
4
|
+
/** Nest-Scramble | Developed by Mohamed Mustafa | MIT License **/
|
|
5
|
+
const faker_1 = require("@faker-js/faker");
|
|
6
|
+
class MockGenerator {
|
|
7
|
+
/**
|
|
8
|
+
* Generates mock data based on the analyzed type
|
|
9
|
+
* @param analyzedType The analyzed type information
|
|
10
|
+
* @returns Mock data object
|
|
11
|
+
*/
|
|
12
|
+
static generateMock(analyzedType) {
|
|
13
|
+
if (analyzedType.isArray) {
|
|
14
|
+
// Generate array of mocks
|
|
15
|
+
const count = faker_1.faker.number.int({ min: 1, max: 5 });
|
|
16
|
+
return Array.from({ length: count }, () => this.generateMock({ ...analyzedType, isArray: false }));
|
|
17
|
+
}
|
|
18
|
+
if (analyzedType.unionTypes) {
|
|
19
|
+
// Pick a random union type
|
|
20
|
+
const randomType = faker_1.faker.helpers.arrayElement(analyzedType.unionTypes);
|
|
21
|
+
return this.generateMockForType(randomType);
|
|
22
|
+
}
|
|
23
|
+
if (analyzedType.properties) {
|
|
24
|
+
// Generate object with properties
|
|
25
|
+
const obj = {};
|
|
26
|
+
for (const prop of analyzedType.properties) {
|
|
27
|
+
if (!prop.type.isOptional || faker_1.faker.datatype.boolean()) {
|
|
28
|
+
obj[prop.name] = this.generateMock(prop.type);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
// Generate based on type string
|
|
34
|
+
return this.generateMockForType(analyzedType.type);
|
|
35
|
+
}
|
|
36
|
+
static generateMockForType(type) {
|
|
37
|
+
const lowerType = type.toLowerCase();
|
|
38
|
+
if (lowerType.includes('string')) {
|
|
39
|
+
return faker_1.faker.lorem.words();
|
|
40
|
+
}
|
|
41
|
+
if (lowerType.includes('number') || lowerType.includes('int') || lowerType.includes('float')) {
|
|
42
|
+
return faker_1.faker.number.int({ min: 1, max: 100 });
|
|
43
|
+
}
|
|
44
|
+
if (lowerType.includes('boolean')) {
|
|
45
|
+
return faker_1.faker.datatype.boolean();
|
|
46
|
+
}
|
|
47
|
+
if (lowerType.includes('date')) {
|
|
48
|
+
return faker_1.faker.date.recent().toISOString();
|
|
49
|
+
}
|
|
50
|
+
// Smart mocking based on property name patterns
|
|
51
|
+
if (lowerType === 'string') {
|
|
52
|
+
// This would be called with property name context, but for now, generic
|
|
53
|
+
return faker_1.faker.lorem.word();
|
|
54
|
+
}
|
|
55
|
+
// Default fallback
|
|
56
|
+
return faker_1.faker.lorem.word();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generates mock data for a property, using the property name for smarter generation
|
|
60
|
+
* @param property The property info
|
|
61
|
+
* @returns Mock value
|
|
62
|
+
*/
|
|
63
|
+
static generateMockForProperty(property) {
|
|
64
|
+
const name = property.name.toLowerCase();
|
|
65
|
+
if (property.type.isArray) {
|
|
66
|
+
const count = faker_1.faker.number.int({ min: 1, max: 5 });
|
|
67
|
+
return Array.from({ length: count }, () => this.generateMockForPropertyName(name, { ...property.type, isArray: false }));
|
|
68
|
+
}
|
|
69
|
+
if (property.type.properties) {
|
|
70
|
+
const obj = {};
|
|
71
|
+
for (const prop of property.type.properties) {
|
|
72
|
+
if (!prop.type.isOptional || faker_1.faker.datatype.boolean()) {
|
|
73
|
+
obj[prop.name] = this.generateMockForProperty(prop);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return obj;
|
|
77
|
+
}
|
|
78
|
+
return this.generateMockForPropertyName(name, property.type);
|
|
79
|
+
}
|
|
80
|
+
static generateMockForPropertyName(name, type) {
|
|
81
|
+
const typeStr = type.type.toLowerCase();
|
|
82
|
+
// Email
|
|
83
|
+
if (name.includes('email')) {
|
|
84
|
+
return faker_1.faker.internet.email();
|
|
85
|
+
}
|
|
86
|
+
// Name
|
|
87
|
+
if (name.includes('name') || name.includes('firstname') || name.includes('lastname')) {
|
|
88
|
+
return faker_1.faker.person.fullName();
|
|
89
|
+
}
|
|
90
|
+
// Phone
|
|
91
|
+
if (name.includes('phone') || name.includes('mobile') || name.includes('tel')) {
|
|
92
|
+
return faker_1.faker.phone.number();
|
|
93
|
+
}
|
|
94
|
+
// Address
|
|
95
|
+
if (name.includes('address') || name.includes('street')) {
|
|
96
|
+
return faker_1.faker.location.streetAddress();
|
|
97
|
+
}
|
|
98
|
+
// City
|
|
99
|
+
if (name.includes('city')) {
|
|
100
|
+
return faker_1.faker.location.city();
|
|
101
|
+
}
|
|
102
|
+
// Country
|
|
103
|
+
if (name.includes('country')) {
|
|
104
|
+
return faker_1.faker.location.country();
|
|
105
|
+
}
|
|
106
|
+
// URL
|
|
107
|
+
if (name.includes('url') || name.includes('website')) {
|
|
108
|
+
return faker_1.faker.internet.url();
|
|
109
|
+
}
|
|
110
|
+
// ID
|
|
111
|
+
if (name.includes('id') && typeStr.includes('number')) {
|
|
112
|
+
return faker_1.faker.number.int({ min: 1, max: 1000 });
|
|
113
|
+
}
|
|
114
|
+
// Age
|
|
115
|
+
if (name.includes('age') && typeStr.includes('number')) {
|
|
116
|
+
return faker_1.faker.number.int({ min: 18, max: 80 });
|
|
117
|
+
}
|
|
118
|
+
// Date
|
|
119
|
+
if (name.includes('date') || name.includes('created') || name.includes('updated')) {
|
|
120
|
+
return faker_1.faker.date.recent().toISOString();
|
|
121
|
+
}
|
|
122
|
+
// Description
|
|
123
|
+
if (name.includes('description') || name.includes('bio')) {
|
|
124
|
+
return faker_1.faker.lorem.sentences();
|
|
125
|
+
}
|
|
126
|
+
// Title
|
|
127
|
+
if (name.includes('title')) {
|
|
128
|
+
return faker_1.faker.lorem.words(3);
|
|
129
|
+
}
|
|
130
|
+
// Fallback to type-based generation
|
|
131
|
+
return this.generateMockForType(type.type);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.MockGenerator = MockGenerator;
|
|
135
|
+
//# sourceMappingURL=MockGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockGenerator.js","sourceRoot":"","sources":["../../src/utils/MockGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Nest-Scramble | Developed by Mohamed Mustafa | MIT License **/
|
|
2
|
+
import { ControllerInfo } from '../scanner/ScannerService';
|
|
3
|
+
interface OpenApiSpec {
|
|
4
|
+
openapi: string;
|
|
5
|
+
info: {
|
|
6
|
+
title: string;
|
|
7
|
+
version: string;
|
|
8
|
+
description: string;
|
|
9
|
+
};
|
|
10
|
+
servers: Array<{
|
|
11
|
+
url: string;
|
|
12
|
+
}>;
|
|
13
|
+
paths: Record<string, Record<string, any>>;
|
|
14
|
+
components: {
|
|
15
|
+
schemas: Record<string, any>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare class OpenApiTransformer {
|
|
19
|
+
private schemas;
|
|
20
|
+
private baseUrl;
|
|
21
|
+
constructor(baseUrl?: string);
|
|
22
|
+
/**
|
|
23
|
+
* Transforms ControllerInfo array into OpenAPI 3.0.0 specification
|
|
24
|
+
* @param controllers Array of controller information
|
|
25
|
+
* @param title API title
|
|
26
|
+
* @param version API version
|
|
27
|
+
* @param baseUrl Base URL for the API
|
|
28
|
+
* @returns OpenAPI specification object
|
|
29
|
+
*/
|
|
30
|
+
transform(controllers: ControllerInfo[], title?: string, version?: string, baseUrl?: string): OpenApiSpec;
|
|
31
|
+
private buildPath;
|
|
32
|
+
private createOperation;
|
|
33
|
+
private analyzedTypeToSchema;
|
|
34
|
+
private generateCodeSamples;
|
|
35
|
+
private typeStringToSchema;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=OpenApiTransformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenApiTransformer.d.ts","sourceRoot":"","sources":["../../src/utils/OpenApiTransformer.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAE,cAAc,EAAc,MAAM,2BAA2B,CAAC;AAGvE,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE,KAAK,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3C,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAA0B;IAI7C;;;;;;;OAOG;IACH,SAAS,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,KAAK,SAAe,EAAE,OAAO,SAAU,EAAE,OAAO,SAA0B,GAAG,WAAW;IAqCjI,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IA2DvB,OAAO,CAAC,oBAAoB;IA0C5B,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,kBAAkB;CAsB3B"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenApiTransformer = void 0;
|
|
4
|
+
class OpenApiTransformer {
|
|
5
|
+
constructor(baseUrl = 'http://localhost:3000') {
|
|
6
|
+
this.schemas = {};
|
|
7
|
+
this.baseUrl = baseUrl;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Transforms ControllerInfo array into OpenAPI 3.0.0 specification
|
|
11
|
+
* @param controllers Array of controller information
|
|
12
|
+
* @param title API title
|
|
13
|
+
* @param version API version
|
|
14
|
+
* @param baseUrl Base URL for the API
|
|
15
|
+
* @returns OpenAPI specification object
|
|
16
|
+
*/
|
|
17
|
+
transform(controllers, title = 'NestJS API', version = '1.0.0', baseUrl = 'http://localhost:3000') {
|
|
18
|
+
this.schemas = {};
|
|
19
|
+
const paths = {};
|
|
20
|
+
for (const controller of controllers) {
|
|
21
|
+
for (const method of controller.methods) {
|
|
22
|
+
const fullPath = this.buildPath(controller.path, method.route);
|
|
23
|
+
const operation = this.createOperation(method);
|
|
24
|
+
if (!paths[fullPath]) {
|
|
25
|
+
paths[fullPath] = {};
|
|
26
|
+
}
|
|
27
|
+
paths[fullPath][method.httpMethod.toLowerCase()] = operation;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
openapi: '3.0.0',
|
|
32
|
+
info: {
|
|
33
|
+
title,
|
|
34
|
+
version,
|
|
35
|
+
description: 'Generated from NestJS controllers using nest-scramble',
|
|
36
|
+
},
|
|
37
|
+
servers: [
|
|
38
|
+
{
|
|
39
|
+
url: baseUrl,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
paths,
|
|
43
|
+
components: {
|
|
44
|
+
schemas: this.schemas,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
buildPath(controllerPath, methodRoute) {
|
|
49
|
+
const parts = [controllerPath, methodRoute].filter(p => p);
|
|
50
|
+
return '/' + parts.join('/').replace(/\/+/g, '/');
|
|
51
|
+
}
|
|
52
|
+
createOperation(method) {
|
|
53
|
+
const operation = {
|
|
54
|
+
summary: method.name,
|
|
55
|
+
responses: {
|
|
56
|
+
'200': {
|
|
57
|
+
description: 'Success',
|
|
58
|
+
content: {
|
|
59
|
+
'application/json': {
|
|
60
|
+
schema: this.analyzedTypeToSchema(method.returnType),
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
// Add parameters
|
|
67
|
+
const parameters = [];
|
|
68
|
+
for (const param of method.parameters) {
|
|
69
|
+
if (param.decorator?.includes('@Body')) {
|
|
70
|
+
operation.requestBody = {
|
|
71
|
+
required: true,
|
|
72
|
+
content: {
|
|
73
|
+
'application/json': {
|
|
74
|
+
schema: this.analyzedTypeToSchema(param.type),
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else if (param.decorator?.includes('@Query')) {
|
|
80
|
+
// For query params, if it's an object, add properties as query params
|
|
81
|
+
if (param.type.properties) {
|
|
82
|
+
for (const prop of param.type.properties) {
|
|
83
|
+
parameters.push({
|
|
84
|
+
name: prop.name,
|
|
85
|
+
in: 'query',
|
|
86
|
+
schema: this.analyzedTypeToSchema(prop.type),
|
|
87
|
+
required: !prop.type.isOptional,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (param.decorator?.includes('@Param')) {
|
|
93
|
+
parameters.push({
|
|
94
|
+
name: param.name,
|
|
95
|
+
in: 'path',
|
|
96
|
+
required: true,
|
|
97
|
+
schema: this.analyzedTypeToSchema(param.type),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (parameters.length > 0) {
|
|
102
|
+
operation.parameters = parameters;
|
|
103
|
+
}
|
|
104
|
+
// Add code samples
|
|
105
|
+
operation['x-code-samples'] = this.generateCodeSamples(method);
|
|
106
|
+
return operation;
|
|
107
|
+
}
|
|
108
|
+
analyzedTypeToSchema(type) {
|
|
109
|
+
if (type.isArray) {
|
|
110
|
+
return {
|
|
111
|
+
type: 'array',
|
|
112
|
+
items: this.analyzedTypeToSchema({ ...type, isArray: false }),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (type.unionTypes) {
|
|
116
|
+
return {
|
|
117
|
+
oneOf: type.unionTypes.map(t => this.typeStringToSchema(t)),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (type.properties) {
|
|
121
|
+
const schemaName = type.type || 'Object';
|
|
122
|
+
if (!this.schemas[schemaName]) {
|
|
123
|
+
const properties = {};
|
|
124
|
+
const required = [];
|
|
125
|
+
for (const prop of type.properties) {
|
|
126
|
+
properties[prop.name] = this.analyzedTypeToSchema(prop.type);
|
|
127
|
+
if (!prop.type.isOptional) {
|
|
128
|
+
required.push(prop.name);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
this.schemas[schemaName] = {
|
|
132
|
+
type: 'object',
|
|
133
|
+
properties,
|
|
134
|
+
required: required.length > 0 ? required : undefined,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
$ref: `#/components/schemas/${schemaName}`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return this.typeStringToSchema(type.type);
|
|
142
|
+
}
|
|
143
|
+
generateCodeSamples(method) {
|
|
144
|
+
const fullPath = this.buildPath('', method.route); // Assuming base path is handled elsewhere
|
|
145
|
+
const samples = [];
|
|
146
|
+
// Curl sample
|
|
147
|
+
samples.push({
|
|
148
|
+
lang: 'curl',
|
|
149
|
+
source: `curl -X ${method.httpMethod} "${this.baseUrl}${fullPath}" \\\n -H "Content-Type: application/json" \\\n -d '{}'`,
|
|
150
|
+
});
|
|
151
|
+
// JavaScript Fetch sample
|
|
152
|
+
samples.push({
|
|
153
|
+
lang: 'javascript',
|
|
154
|
+
source: `fetch('${this.baseUrl}${fullPath}', {\n method: '${method.httpMethod}',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({}),\n})\n .then(response => response.json())\n .then(data => console.log(data));`,
|
|
155
|
+
});
|
|
156
|
+
// TypeScript sample
|
|
157
|
+
samples.push({
|
|
158
|
+
lang: 'typescript',
|
|
159
|
+
source: `// Assuming you have the DTO types\nimport axios from 'axios';\n\nconst response = await axios.${method.httpMethod.toLowerCase()}('${this.baseUrl}${fullPath}', {});\nconsole.log(response.data);`,
|
|
160
|
+
});
|
|
161
|
+
return samples;
|
|
162
|
+
}
|
|
163
|
+
typeStringToSchema(type) {
|
|
164
|
+
const lowerType = type.toLowerCase();
|
|
165
|
+
if (lowerType.includes('string')) {
|
|
166
|
+
return { type: 'string' };
|
|
167
|
+
}
|
|
168
|
+
if (lowerType.includes('number') || lowerType.includes('int') || lowerType.includes('float')) {
|
|
169
|
+
return { type: 'number' };
|
|
170
|
+
}
|
|
171
|
+
if (lowerType.includes('boolean')) {
|
|
172
|
+
return { type: 'boolean' };
|
|
173
|
+
}
|
|
174
|
+
if (lowerType.includes('date')) {
|
|
175
|
+
return { type: 'string', format: 'date-time' };
|
|
176
|
+
}
|
|
177
|
+
// Default to string
|
|
178
|
+
return { type: 'string' };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.OpenApiTransformer = OpenApiTransformer;
|
|
182
|
+
//# sourceMappingURL=OpenApiTransformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenApiTransformer.js","sourceRoot":"","sources":["../../src/utils/OpenApiTransformer.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nest-scramble",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A next-generation, decorator-free API documentation engine and intelligent mock server for NestJS, engineered by Mohamed Mustafa",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"nest-scramble": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "rimraf dist && tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"test": "jest",
|
|
14
|
+
"lint": "eslint src/**/*.ts",
|
|
15
|
+
"lint:fix": "eslint src/**/*.ts --fix",
|
|
16
|
+
"watch-generate": "node scripts/watch-generate.js"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"nestjs",
|
|
20
|
+
"documentation",
|
|
21
|
+
"static-analysis",
|
|
22
|
+
"ast",
|
|
23
|
+
"postman",
|
|
24
|
+
"mocking",
|
|
25
|
+
"mohamed-mustafa",
|
|
26
|
+
"typescript",
|
|
27
|
+
"zero-config"
|
|
28
|
+
],
|
|
29
|
+
"author": "Mohamed Mustafa <https://github.com/Eng-MMustafa>",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"ts-morph": "^21.0.1",
|
|
33
|
+
"@faker-js/faker": "^8.4.1",
|
|
34
|
+
"commander": "^11.1.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/express": "^4.17.21",
|
|
38
|
+
"@types/node": "^20.10.0",
|
|
39
|
+
"chokidar": "^3.5.3",
|
|
40
|
+
"typescript": "^5.3.0",
|
|
41
|
+
"rimraf": "^5.0.5",
|
|
42
|
+
"jest": "^29.7.0",
|
|
43
|
+
"@types/jest": "^29.5.8",
|
|
44
|
+
"eslint": "^8.56.0",
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "^6.15.0",
|
|
46
|
+
"@typescript-eslint/parser": "^6.15.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"@nestjs/common": "^10.0.0",
|
|
50
|
+
"@nestjs/core": "^10.0.0"
|
|
51
|
+
}
|
|
52
|
+
}
|