nest-scramble 1.3.0 → 1.4.1
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/dist/scanner/ScannerService.d.ts +3 -0
- package/dist/scanner/ScannerService.d.ts.map +1 -1
- package/dist/scanner/ScannerService.js +40 -5
- package/dist/scanner/ScannerService.js.map +1 -1
- package/dist/utils/DtoAnalyzer.d.ts +2 -0
- package/dist/utils/DtoAnalyzer.d.ts.map +1 -1
- package/dist/utils/DtoAnalyzer.js +62 -2
- package/dist/utils/DtoAnalyzer.js.map +1 -1
- package/dist/utils/OpenApiTransformer.d.ts +4 -0
- package/dist/utils/OpenApiTransformer.d.ts.map +1 -1
- package/dist/utils/OpenApiTransformer.js +217 -13
- package/dist/utils/OpenApiTransformer.js.map +1 -1
- package/examples/example-controller.ts +85 -0
- package/examples/example-dto.ts +182 -0
- package/package.json +1 -1
- package/test-dto-generation.ts +103 -0
|
@@ -3,6 +3,7 @@ export interface ControllerInfo {
|
|
|
3
3
|
name: string;
|
|
4
4
|
path: string;
|
|
5
5
|
methods: MethodInfo[];
|
|
6
|
+
hasGuards?: boolean;
|
|
6
7
|
}
|
|
7
8
|
export interface MethodInfo {
|
|
8
9
|
name: string;
|
|
@@ -10,11 +11,13 @@ export interface MethodInfo {
|
|
|
10
11
|
route: string;
|
|
11
12
|
parameters: ParameterInfo[];
|
|
12
13
|
returnType: AnalyzedType;
|
|
14
|
+
hasGuards?: boolean;
|
|
13
15
|
}
|
|
14
16
|
export interface ParameterInfo {
|
|
15
17
|
name: string;
|
|
16
18
|
type: AnalyzedType;
|
|
17
19
|
decorator?: string;
|
|
20
|
+
parameterLocation?: 'path' | 'query' | 'header' | 'body';
|
|
18
21
|
}
|
|
19
22
|
export declare class ScannerService {
|
|
20
23
|
private project;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScannerService.d.ts","sourceRoot":"","sources":["../../src/scanner/ScannerService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"ScannerService.d.ts","sourceRoot":"","sources":["../../src/scanner/ScannerService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,YAAY,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC1D;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,WAAW,CAAqB;IAExC;;;;OAIG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE;IAsErD,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,iBAAiB;CA0D1B"}
|
|
@@ -97,6 +97,14 @@ class ScannerService {
|
|
|
97
97
|
if (!controllerDecorator)
|
|
98
98
|
return null;
|
|
99
99
|
const controllerPath = this.extractDecoratorArgument(controllerDecorator) || '';
|
|
100
|
+
// Check for class-level @UseGuards() decorator
|
|
101
|
+
const hasGuards = cls.getDecorators().some(decorator => {
|
|
102
|
+
const callExpression = decorator.getCallExpression();
|
|
103
|
+
if (!callExpression)
|
|
104
|
+
return false;
|
|
105
|
+
const expression = callExpression.getExpression();
|
|
106
|
+
return ts_morph_1.Node.isIdentifier(expression) && expression.getText() === 'UseGuards';
|
|
107
|
+
});
|
|
100
108
|
const methods = [];
|
|
101
109
|
for (const method of cls.getMethods()) {
|
|
102
110
|
const methodInfo = this.extractMethodInfo(method);
|
|
@@ -108,6 +116,7 @@ class ScannerService {
|
|
|
108
116
|
name: cls.getName() || 'UnknownController',
|
|
109
117
|
path: controllerPath,
|
|
110
118
|
methods,
|
|
119
|
+
hasGuards,
|
|
111
120
|
};
|
|
112
121
|
}
|
|
113
122
|
extractDecoratorArgument(decorator) {
|
|
@@ -140,11 +149,36 @@ class ScannerService {
|
|
|
140
149
|
const expression = callExpression.getExpression();
|
|
141
150
|
const httpMethod = expression.getText().toUpperCase();
|
|
142
151
|
const route = this.extractDecoratorArgument(httpDecorator) || '';
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
152
|
+
// Check for @UseGuards() decorator
|
|
153
|
+
const hasGuards = method.getDecorators().some(decorator => {
|
|
154
|
+
const callExpression = decorator.getCallExpression();
|
|
155
|
+
if (!callExpression)
|
|
156
|
+
return false;
|
|
157
|
+
const expression = callExpression.getExpression();
|
|
158
|
+
return ts_morph_1.Node.isIdentifier(expression) && expression.getText() === 'UseGuards';
|
|
159
|
+
});
|
|
160
|
+
const parameters = method.getParameters().map(param => {
|
|
161
|
+
const decoratorText = param.getDecorators().map(d => d.getText()).join(' ');
|
|
162
|
+
let parameterLocation;
|
|
163
|
+
if (decoratorText.includes('@Body')) {
|
|
164
|
+
parameterLocation = 'body';
|
|
165
|
+
}
|
|
166
|
+
else if (decoratorText.includes('@Param')) {
|
|
167
|
+
parameterLocation = 'path';
|
|
168
|
+
}
|
|
169
|
+
else if (decoratorText.includes('@Query')) {
|
|
170
|
+
parameterLocation = 'query';
|
|
171
|
+
}
|
|
172
|
+
else if (decoratorText.includes('@Headers')) {
|
|
173
|
+
parameterLocation = 'header';
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
name: param.getName(),
|
|
177
|
+
type: this.dtoAnalyzer.analyzeType(param.getType()),
|
|
178
|
+
decorator: decoratorText,
|
|
179
|
+
parameterLocation,
|
|
180
|
+
};
|
|
181
|
+
});
|
|
148
182
|
const returnType = this.dtoAnalyzer.analyzeType(method.getReturnType());
|
|
149
183
|
return {
|
|
150
184
|
name: method.getName(),
|
|
@@ -152,6 +186,7 @@ class ScannerService {
|
|
|
152
186
|
route,
|
|
153
187
|
parameters,
|
|
154
188
|
returnType,
|
|
189
|
+
hasGuards,
|
|
155
190
|
};
|
|
156
191
|
}
|
|
157
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScannerService.js","sourceRoot":"","sources":["../../src/scanner/ScannerService.ts"],"names":[],"mappings":";;;AAAA,kEAAkE;AAClE,uCAAyF;AACzF,sDAAiE;
|
|
1
|
+
{"version":3,"file":"ScannerService.js","sourceRoot":"","sources":["../../src/scanner/ScannerService.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,12 @@ export interface AnalyzedType {
|
|
|
6
6
|
isOptional: boolean;
|
|
7
7
|
properties?: PropertyInfo[];
|
|
8
8
|
unionTypes?: string[];
|
|
9
|
+
enumValues?: string[];
|
|
9
10
|
}
|
|
10
11
|
export interface PropertyInfo {
|
|
11
12
|
name: string;
|
|
12
13
|
type: AnalyzedType;
|
|
14
|
+
description?: string;
|
|
13
15
|
}
|
|
14
16
|
export declare class DtoAnalyzer {
|
|
15
17
|
private visited;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DtoAnalyzer.d.ts","sourceRoot":"","sources":["../../src/utils/DtoAnalyzer.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAgD,IAAI,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"DtoAnalyzer.d.ts","sourceRoot":"","sources":["../../src/utils/DtoAnalyzer.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAgD,IAAI,EAAE,MAAM,UAAU,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAqB;IAEpC;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,UAAQ,GAAG,YAAY;IAyHzD,OAAO,CAAC,iBAAiB;CA6B1B"}
|
|
@@ -26,20 +26,68 @@ class DtoAnalyzer {
|
|
|
26
26
|
this.visited.add(typeText);
|
|
27
27
|
try {
|
|
28
28
|
const symbol = type.getSymbol();
|
|
29
|
+
// Unwrap Promise<T> to get T
|
|
30
|
+
if (typeText.startsWith('Promise<') && typeText.endsWith('>')) {
|
|
31
|
+
const typeArgs = type.getTypeArguments();
|
|
32
|
+
if (typeArgs.length > 0) {
|
|
33
|
+
return this.analyzeType(typeArgs[0], isOptional);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
29
36
|
// Check if it's an array
|
|
30
37
|
const arrayElementType = type.getArrayElementType();
|
|
31
38
|
if (arrayElementType) {
|
|
32
39
|
const elementAnalysis = this.analyzeType(arrayElementType);
|
|
33
40
|
return {
|
|
34
|
-
type: typeText,
|
|
41
|
+
type: elementAnalysis.type || typeText,
|
|
35
42
|
isArray: true,
|
|
36
43
|
isOptional,
|
|
37
44
|
properties: elementAnalysis.properties,
|
|
38
45
|
};
|
|
39
46
|
}
|
|
47
|
+
// Check if it's an enum
|
|
48
|
+
if (symbol) {
|
|
49
|
+
const declarations = symbol.getDeclarations();
|
|
50
|
+
for (const decl of declarations) {
|
|
51
|
+
if (ts_morph_1.Node.isEnumDeclaration(decl)) {
|
|
52
|
+
const enumValues = decl.getMembers().map(member => {
|
|
53
|
+
const initializer = member.getInitializer();
|
|
54
|
+
if (initializer && ts_morph_1.Node.isStringLiteral(initializer)) {
|
|
55
|
+
return initializer.getLiteralValue();
|
|
56
|
+
}
|
|
57
|
+
return member.getName();
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
type: decl.getName() || symbol.getName() || typeText,
|
|
61
|
+
isArray: false,
|
|
62
|
+
isOptional,
|
|
63
|
+
enumValues,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
40
68
|
// Check if it's a union type
|
|
41
69
|
const unionTypes = type.getUnionTypes();
|
|
42
70
|
if (unionTypes.length > 1) {
|
|
71
|
+
// Check if it's a string literal union (acts like an enum)
|
|
72
|
+
const literalValues = [];
|
|
73
|
+
let allLiterals = true;
|
|
74
|
+
for (const unionType of unionTypes) {
|
|
75
|
+
if (unionType.isStringLiteral()) {
|
|
76
|
+
literalValues.push(unionType.getLiteralValue());
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
allLiterals = false;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (allLiterals && literalValues.length > 0) {
|
|
84
|
+
return {
|
|
85
|
+
type: 'string',
|
|
86
|
+
isArray: false,
|
|
87
|
+
isOptional,
|
|
88
|
+
enumValues: literalValues,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
43
91
|
return {
|
|
44
92
|
type: typeText,
|
|
45
93
|
isArray: false,
|
|
@@ -53,8 +101,10 @@ class DtoAnalyzer {
|
|
|
53
101
|
for (const decl of declarations) {
|
|
54
102
|
if (ts_morph_1.Node.isClassDeclaration(decl) || ts_morph_1.Node.isInterfaceDeclaration(decl)) {
|
|
55
103
|
const properties = this.extractProperties(decl);
|
|
104
|
+
// Use the class/interface name instead of full type text
|
|
105
|
+
const className = decl.getName() || symbol.getName() || typeText;
|
|
56
106
|
return {
|
|
57
|
-
type:
|
|
107
|
+
type: className,
|
|
58
108
|
isArray: false,
|
|
59
109
|
isOptional,
|
|
60
110
|
properties,
|
|
@@ -81,9 +131,19 @@ class DtoAnalyzer {
|
|
|
81
131
|
const type = prop.getType();
|
|
82
132
|
const isOptional = prop.hasQuestionToken ? prop.hasQuestionToken() : false;
|
|
83
133
|
const analyzedType = this.analyzeType(type, isOptional);
|
|
134
|
+
// Extract JSDoc description
|
|
135
|
+
const jsDocs = prop.getJsDocs();
|
|
136
|
+
let description;
|
|
137
|
+
if (jsDocs.length > 0) {
|
|
138
|
+
const comment = jsDocs[0].getDescription().trim();
|
|
139
|
+
if (comment) {
|
|
140
|
+
description = comment;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
84
143
|
properties.push({
|
|
85
144
|
name,
|
|
86
145
|
type: analyzedType,
|
|
146
|
+
description,
|
|
87
147
|
});
|
|
88
148
|
}
|
|
89
149
|
return properties;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DtoAnalyzer.js","sourceRoot":"","sources":["../../src/utils/DtoAnalyzer.ts"],"names":[],"mappings":";;;AAAA,kEAAkE;AAClE,uCAA8E;
|
|
1
|
+
{"version":3,"file":"DtoAnalyzer.js","sourceRoot":"","sources":["../../src/utils/DtoAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ interface OpenApiSpec {
|
|
|
13
13
|
paths: Record<string, Record<string, any>>;
|
|
14
14
|
components: {
|
|
15
15
|
schemas: Record<string, any>;
|
|
16
|
+
securitySchemes?: Record<string, any>;
|
|
16
17
|
};
|
|
17
18
|
}
|
|
18
19
|
export declare class OpenApiTransformer {
|
|
@@ -30,8 +31,11 @@ export declare class OpenApiTransformer {
|
|
|
30
31
|
transform(controllers: ControllerInfo[], title?: string, version?: string, baseUrl?: string): OpenApiSpec;
|
|
31
32
|
private buildPath;
|
|
32
33
|
private createOperation;
|
|
34
|
+
private getSuccessStatusCode;
|
|
35
|
+
private getSuccessDescription;
|
|
33
36
|
private analyzedTypeToSchema;
|
|
34
37
|
private generateCodeSamples;
|
|
38
|
+
private generateSmartExample;
|
|
35
39
|
private typeStringToSchema;
|
|
36
40
|
}
|
|
37
41
|
export {};
|
|
@@ -1 +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;
|
|
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;QAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACvC,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;IA6CjI,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IAqHvB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,oBAAoB;IAyE5B,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,oBAAoB;IA4G5B,OAAO,CAAC,kBAAkB;CAsB3B"}
|
|
@@ -20,7 +20,7 @@ class OpenApiTransformer {
|
|
|
20
20
|
for (const controller of controllers) {
|
|
21
21
|
for (const method of controller.methods) {
|
|
22
22
|
const fullPath = this.buildPath(controller.path, method.route);
|
|
23
|
-
const operation = this.createOperation(method);
|
|
23
|
+
const operation = this.createOperation(method, controller.hasGuards);
|
|
24
24
|
if (!paths[fullPath]) {
|
|
25
25
|
paths[fullPath] = {};
|
|
26
26
|
}
|
|
@@ -42,6 +42,14 @@ class OpenApiTransformer {
|
|
|
42
42
|
paths,
|
|
43
43
|
components: {
|
|
44
44
|
schemas: this.schemas,
|
|
45
|
+
securitySchemes: {
|
|
46
|
+
bearerAuth: {
|
|
47
|
+
type: 'http',
|
|
48
|
+
scheme: 'bearer',
|
|
49
|
+
bearerFormat: 'JWT',
|
|
50
|
+
description: 'Enter your Bearer token in the format: Bearer <token>',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
45
53
|
},
|
|
46
54
|
};
|
|
47
55
|
}
|
|
@@ -49,24 +57,56 @@ class OpenApiTransformer {
|
|
|
49
57
|
const parts = [controllerPath, methodRoute].filter(p => p);
|
|
50
58
|
return '/' + parts.join('/').replace(/\/+/g, '/');
|
|
51
59
|
}
|
|
52
|
-
createOperation(method) {
|
|
60
|
+
createOperation(method, controllerHasGuards) {
|
|
61
|
+
// Determine success status code based on HTTP method
|
|
62
|
+
const successStatusCode = this.getSuccessStatusCode(method.httpMethod);
|
|
63
|
+
const successDescription = this.getSuccessDescription(method.httpMethod);
|
|
53
64
|
const operation = {
|
|
54
65
|
summary: method.name,
|
|
55
66
|
responses: {
|
|
56
|
-
|
|
57
|
-
description:
|
|
67
|
+
[successStatusCode]: {
|
|
68
|
+
description: successDescription,
|
|
58
69
|
content: {
|
|
59
70
|
'application/json': {
|
|
60
71
|
schema: this.analyzedTypeToSchema(method.returnType),
|
|
61
72
|
},
|
|
62
73
|
},
|
|
63
74
|
},
|
|
75
|
+
'400': {
|
|
76
|
+
description: 'Bad Request',
|
|
77
|
+
content: {
|
|
78
|
+
'application/json': {
|
|
79
|
+
schema: {
|
|
80
|
+
type: 'object',
|
|
81
|
+
properties: {
|
|
82
|
+
statusCode: { type: 'number', example: 400 },
|
|
83
|
+
message: { type: 'string', example: 'Bad Request' },
|
|
84
|
+
error: { type: 'string', example: 'Validation failed' },
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
'500': {
|
|
91
|
+
description: 'Internal Server Error',
|
|
92
|
+
content: {
|
|
93
|
+
'application/json': {
|
|
94
|
+
schema: {
|
|
95
|
+
type: 'object',
|
|
96
|
+
properties: {
|
|
97
|
+
statusCode: { type: 'number', example: 500 },
|
|
98
|
+
message: { type: 'string', example: 'Internal server error' },
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
64
104
|
},
|
|
65
105
|
};
|
|
66
106
|
// Add parameters
|
|
67
107
|
const parameters = [];
|
|
68
108
|
for (const param of method.parameters) {
|
|
69
|
-
if (param.
|
|
109
|
+
if (param.parameterLocation === 'body') {
|
|
70
110
|
operation.requestBody = {
|
|
71
111
|
required: true,
|
|
72
112
|
content: {
|
|
@@ -76,7 +116,7 @@ class OpenApiTransformer {
|
|
|
76
116
|
},
|
|
77
117
|
};
|
|
78
118
|
}
|
|
79
|
-
else if (param.
|
|
119
|
+
else if (param.parameterLocation === 'query') {
|
|
80
120
|
// For query params, if it's an object, add properties as query params
|
|
81
121
|
if (param.type.properties) {
|
|
82
122
|
for (const prop of param.type.properties) {
|
|
@@ -85,11 +125,21 @@ class OpenApiTransformer {
|
|
|
85
125
|
in: 'query',
|
|
86
126
|
schema: this.analyzedTypeToSchema(prop.type),
|
|
87
127
|
required: !prop.type.isOptional,
|
|
128
|
+
description: prop.description,
|
|
88
129
|
});
|
|
89
130
|
}
|
|
90
131
|
}
|
|
132
|
+
else {
|
|
133
|
+
// Single query parameter
|
|
134
|
+
parameters.push({
|
|
135
|
+
name: param.name,
|
|
136
|
+
in: 'query',
|
|
137
|
+
schema: this.analyzedTypeToSchema(param.type),
|
|
138
|
+
required: !param.type.isOptional,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
91
141
|
}
|
|
92
|
-
else if (param.
|
|
142
|
+
else if (param.parameterLocation === 'path') {
|
|
93
143
|
parameters.push({
|
|
94
144
|
name: param.name,
|
|
95
145
|
in: 'path',
|
|
@@ -97,14 +147,58 @@ class OpenApiTransformer {
|
|
|
97
147
|
schema: this.analyzedTypeToSchema(param.type),
|
|
98
148
|
});
|
|
99
149
|
}
|
|
150
|
+
else if (param.parameterLocation === 'header') {
|
|
151
|
+
parameters.push({
|
|
152
|
+
name: param.name,
|
|
153
|
+
in: 'header',
|
|
154
|
+
schema: this.analyzedTypeToSchema(param.type),
|
|
155
|
+
required: !param.type.isOptional,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
100
158
|
}
|
|
101
159
|
if (parameters.length > 0) {
|
|
102
160
|
operation.parameters = parameters;
|
|
103
161
|
}
|
|
162
|
+
// Add security requirements if method or controller has guards
|
|
163
|
+
if (method.hasGuards || controllerHasGuards) {
|
|
164
|
+
operation.security = [
|
|
165
|
+
{
|
|
166
|
+
bearerAuth: [],
|
|
167
|
+
},
|
|
168
|
+
];
|
|
169
|
+
}
|
|
104
170
|
// Add code samples
|
|
105
171
|
operation['x-code-samples'] = this.generateCodeSamples(method);
|
|
106
172
|
return operation;
|
|
107
173
|
}
|
|
174
|
+
getSuccessStatusCode(httpMethod) {
|
|
175
|
+
switch (httpMethod.toUpperCase()) {
|
|
176
|
+
case 'POST':
|
|
177
|
+
return '201';
|
|
178
|
+
case 'GET':
|
|
179
|
+
case 'PUT':
|
|
180
|
+
case 'PATCH':
|
|
181
|
+
case 'DELETE':
|
|
182
|
+
default:
|
|
183
|
+
return '200';
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
getSuccessDescription(httpMethod) {
|
|
187
|
+
switch (httpMethod.toUpperCase()) {
|
|
188
|
+
case 'POST':
|
|
189
|
+
return 'Created';
|
|
190
|
+
case 'GET':
|
|
191
|
+
return 'Success';
|
|
192
|
+
case 'PUT':
|
|
193
|
+
return 'Updated';
|
|
194
|
+
case 'PATCH':
|
|
195
|
+
return 'Partially Updated';
|
|
196
|
+
case 'DELETE':
|
|
197
|
+
return 'Deleted';
|
|
198
|
+
default:
|
|
199
|
+
return 'Success';
|
|
200
|
+
}
|
|
201
|
+
}
|
|
108
202
|
analyzedTypeToSchema(type) {
|
|
109
203
|
if (type.isArray) {
|
|
110
204
|
return {
|
|
@@ -112,6 +206,13 @@ class OpenApiTransformer {
|
|
|
112
206
|
items: this.analyzedTypeToSchema({ ...type, isArray: false }),
|
|
113
207
|
};
|
|
114
208
|
}
|
|
209
|
+
if (type.enumValues && type.enumValues.length > 0) {
|
|
210
|
+
return {
|
|
211
|
+
type: 'string',
|
|
212
|
+
enum: type.enumValues,
|
|
213
|
+
example: type.enumValues[0],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
115
216
|
if (type.unionTypes) {
|
|
116
217
|
return {
|
|
117
218
|
oneOf: type.unionTypes.map(t => this.typeStringToSchema(t)),
|
|
@@ -123,15 +224,33 @@ class OpenApiTransformer {
|
|
|
123
224
|
const properties = {};
|
|
124
225
|
const required = [];
|
|
125
226
|
for (const prop of type.properties) {
|
|
126
|
-
|
|
227
|
+
const propSchema = this.analyzedTypeToSchema(prop.type);
|
|
228
|
+
// Add description from JSDoc if available
|
|
229
|
+
if (prop.description) {
|
|
230
|
+
propSchema.description = prop.description;
|
|
231
|
+
}
|
|
232
|
+
// Add smart example based on property name (only for non-ref schemas)
|
|
233
|
+
if (!propSchema.$ref && !propSchema.example) {
|
|
234
|
+
propSchema.example = this.generateSmartExample(prop.name, prop.type.type, prop.type.enumValues);
|
|
235
|
+
}
|
|
236
|
+
properties[prop.name] = propSchema;
|
|
127
237
|
if (!prop.type.isOptional) {
|
|
128
238
|
required.push(prop.name);
|
|
129
239
|
}
|
|
130
240
|
}
|
|
241
|
+
// Create the schema with examples at the schema level
|
|
242
|
+
const schemaExample = {};
|
|
243
|
+
for (const prop of type.properties) {
|
|
244
|
+
// Include all required fields in example
|
|
245
|
+
if (!prop.type.isOptional) {
|
|
246
|
+
schemaExample[prop.name] = this.generateSmartExample(prop.name, prop.type.type, prop.type.enumValues);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
131
249
|
this.schemas[schemaName] = {
|
|
132
250
|
type: 'object',
|
|
133
251
|
properties,
|
|
134
252
|
required: required.length > 0 ? required : undefined,
|
|
253
|
+
example: schemaExample,
|
|
135
254
|
};
|
|
136
255
|
}
|
|
137
256
|
return {
|
|
@@ -160,22 +279,107 @@ class OpenApiTransformer {
|
|
|
160
279
|
});
|
|
161
280
|
return samples;
|
|
162
281
|
}
|
|
282
|
+
generateSmartExample(propertyName, propertyType, enumValues) {
|
|
283
|
+
const lowerName = propertyName.toLowerCase();
|
|
284
|
+
const lowerType = propertyType.toLowerCase();
|
|
285
|
+
// If enum values are provided, return the first one
|
|
286
|
+
if (enumValues && enumValues.length > 0) {
|
|
287
|
+
return enumValues[0];
|
|
288
|
+
}
|
|
289
|
+
// Email patterns
|
|
290
|
+
if (lowerName.includes('email')) {
|
|
291
|
+
return 'user@example.com';
|
|
292
|
+
}
|
|
293
|
+
// Name patterns
|
|
294
|
+
if (lowerName.includes('name') || lowerName === 'title') {
|
|
295
|
+
return 'John Doe';
|
|
296
|
+
}
|
|
297
|
+
// Phone patterns
|
|
298
|
+
if (lowerName.includes('phone') || lowerName.includes('mobile')) {
|
|
299
|
+
return '+1234567890';
|
|
300
|
+
}
|
|
301
|
+
// Address patterns
|
|
302
|
+
if (lowerName.includes('address') || lowerName.includes('street')) {
|
|
303
|
+
return '123 Main St';
|
|
304
|
+
}
|
|
305
|
+
if (lowerName.includes('city')) {
|
|
306
|
+
return 'New York';
|
|
307
|
+
}
|
|
308
|
+
if (lowerName.includes('country')) {
|
|
309
|
+
return 'United States';
|
|
310
|
+
}
|
|
311
|
+
if (lowerName.includes('zip') || lowerName.includes('postal')) {
|
|
312
|
+
return '10001';
|
|
313
|
+
}
|
|
314
|
+
// ID patterns
|
|
315
|
+
if (lowerName === 'id' || lowerName.endsWith('id')) {
|
|
316
|
+
return 1;
|
|
317
|
+
}
|
|
318
|
+
// Age pattern
|
|
319
|
+
if (lowerName === 'age') {
|
|
320
|
+
return 25;
|
|
321
|
+
}
|
|
322
|
+
// Price/Amount patterns
|
|
323
|
+
if (lowerName.includes('price') || lowerName.includes('amount') || lowerName.includes('cost')) {
|
|
324
|
+
return 99.99;
|
|
325
|
+
}
|
|
326
|
+
// URL patterns
|
|
327
|
+
if (lowerName.includes('url') || lowerName.includes('link')) {
|
|
328
|
+
return 'https://example.com';
|
|
329
|
+
}
|
|
330
|
+
// Description/Content patterns
|
|
331
|
+
if (lowerName.includes('description') || lowerName.includes('content') || lowerName.includes('text')) {
|
|
332
|
+
return 'Sample description text';
|
|
333
|
+
}
|
|
334
|
+
// Password pattern
|
|
335
|
+
if (lowerName.includes('password')) {
|
|
336
|
+
return 'SecurePassword123!';
|
|
337
|
+
}
|
|
338
|
+
// Username pattern
|
|
339
|
+
if (lowerName.includes('username')) {
|
|
340
|
+
return 'johndoe';
|
|
341
|
+
}
|
|
342
|
+
// Status pattern
|
|
343
|
+
if (lowerName.includes('status')) {
|
|
344
|
+
return 'active';
|
|
345
|
+
}
|
|
346
|
+
// Role pattern
|
|
347
|
+
if (lowerName.includes('role')) {
|
|
348
|
+
return 'user';
|
|
349
|
+
}
|
|
350
|
+
// Date patterns
|
|
351
|
+
if (lowerName.includes('date') || lowerName.includes('createdat') || lowerName.includes('updatedat')) {
|
|
352
|
+
return '2024-01-01T00:00:00.000Z';
|
|
353
|
+
}
|
|
354
|
+
// Type-based fallbacks
|
|
355
|
+
if (lowerType.includes('number') || lowerType.includes('int') || lowerType.includes('float')) {
|
|
356
|
+
return 0;
|
|
357
|
+
}
|
|
358
|
+
if (lowerType.includes('boolean')) {
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
if (lowerType.includes('date')) {
|
|
362
|
+
return '2024-01-01T00:00:00.000Z';
|
|
363
|
+
}
|
|
364
|
+
// Default to string
|
|
365
|
+
return 'sample value';
|
|
366
|
+
}
|
|
163
367
|
typeStringToSchema(type) {
|
|
164
368
|
const lowerType = type.toLowerCase();
|
|
165
369
|
if (lowerType.includes('string')) {
|
|
166
|
-
return { type: 'string' };
|
|
370
|
+
return { type: 'string', example: 'sample string' };
|
|
167
371
|
}
|
|
168
372
|
if (lowerType.includes('number') || lowerType.includes('int') || lowerType.includes('float')) {
|
|
169
|
-
return { type: 'number' };
|
|
373
|
+
return { type: 'number', example: 0 };
|
|
170
374
|
}
|
|
171
375
|
if (lowerType.includes('boolean')) {
|
|
172
|
-
return { type: 'boolean' };
|
|
376
|
+
return { type: 'boolean', example: true };
|
|
173
377
|
}
|
|
174
378
|
if (lowerType.includes('date')) {
|
|
175
|
-
return { type: 'string', format: 'date-time' };
|
|
379
|
+
return { type: 'string', format: 'date-time', example: '2024-01-01T00:00:00.000Z' };
|
|
176
380
|
}
|
|
177
381
|
// Default to string
|
|
178
|
-
return { type: 'string' };
|
|
382
|
+
return { type: 'string', example: 'value' };
|
|
179
383
|
}
|
|
180
384
|
}
|
|
181
385
|
exports.OpenApiTransformer = OpenApiTransformer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenApiTransformer.js","sourceRoot":"","sources":["../../src/utils/OpenApiTransformer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OpenApiTransformer.js","sourceRoot":"","sources":["../../src/utils/OpenApiTransformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Controller demonstrating full metadata extraction
|
|
3
|
+
* This controller showcases all the new features:
|
|
4
|
+
* - Request Body schemas with @Body()
|
|
5
|
+
* - Response schemas with proper return types
|
|
6
|
+
* - Status codes (POST=201, GET=200, etc.)
|
|
7
|
+
* - Query and Path parameters
|
|
8
|
+
* - JSDoc descriptions
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { Controller, Get, Post, Put, Delete, Body, Param, Query } from '@nestjs/common';
|
|
12
|
+
import {
|
|
13
|
+
CreateUserDto,
|
|
14
|
+
UpdateUserDto,
|
|
15
|
+
UserResponseDto,
|
|
16
|
+
PaginationQueryDto,
|
|
17
|
+
PaginatedResponseDto,
|
|
18
|
+
} from './example-dto';
|
|
19
|
+
|
|
20
|
+
@Controller('users')
|
|
21
|
+
export class UsersController {
|
|
22
|
+
/**
|
|
23
|
+
* Get all users with pagination
|
|
24
|
+
* @returns Paginated list of users
|
|
25
|
+
*/
|
|
26
|
+
@Get()
|
|
27
|
+
findAll(@Query() query: PaginationQueryDto): Promise<PaginatedResponseDto<UserResponseDto>> {
|
|
28
|
+
// Implementation here
|
|
29
|
+
return Promise.resolve({
|
|
30
|
+
data: [],
|
|
31
|
+
total: 0,
|
|
32
|
+
page: 1,
|
|
33
|
+
limit: 10,
|
|
34
|
+
totalPages: 0,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Get a single user by ID
|
|
40
|
+
* @param id User ID
|
|
41
|
+
* @returns User details
|
|
42
|
+
*/
|
|
43
|
+
@Get(':id')
|
|
44
|
+
findOne(@Param('id') id: string): Promise<UserResponseDto> {
|
|
45
|
+
// Implementation here
|
|
46
|
+
return Promise.resolve({} as UserResponseDto);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Create a new user
|
|
51
|
+
* @param createUserDto User creation data
|
|
52
|
+
* @returns Created user details
|
|
53
|
+
*/
|
|
54
|
+
@Post()
|
|
55
|
+
create(@Body() createUserDto: CreateUserDto): Promise<UserResponseDto> {
|
|
56
|
+
// Implementation here
|
|
57
|
+
return Promise.resolve({} as UserResponseDto);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Update an existing user
|
|
62
|
+
* @param id User ID
|
|
63
|
+
* @param updateUserDto User update data
|
|
64
|
+
* @returns Updated user details
|
|
65
|
+
*/
|
|
66
|
+
@Put(':id')
|
|
67
|
+
update(
|
|
68
|
+
@Param('id') id: string,
|
|
69
|
+
@Body() updateUserDto: UpdateUserDto,
|
|
70
|
+
): Promise<UserResponseDto> {
|
|
71
|
+
// Implementation here
|
|
72
|
+
return Promise.resolve({} as UserResponseDto);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Delete a user
|
|
77
|
+
* @param id User ID
|
|
78
|
+
* @returns Deletion confirmation
|
|
79
|
+
*/
|
|
80
|
+
@Delete(':id')
|
|
81
|
+
remove(@Param('id') id: string): Promise<{ message: string }> {
|
|
82
|
+
// Implementation here
|
|
83
|
+
return Promise.resolve({ message: 'User deleted successfully' });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example DTOs demonstrating full metadata extraction
|
|
3
|
+
* These DTOs showcase JSDoc comments, required fields, and nested structures
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export enum UserRole {
|
|
7
|
+
ADMIN = 'admin',
|
|
8
|
+
USER = 'user',
|
|
9
|
+
GUEST = 'guest',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export class CreateUserDto {
|
|
13
|
+
/**
|
|
14
|
+
* User's full name
|
|
15
|
+
*/
|
|
16
|
+
name: string;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* User's email address (must be unique)
|
|
20
|
+
*/
|
|
21
|
+
email: string;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* User's password (min 8 characters)
|
|
25
|
+
*/
|
|
26
|
+
password: string;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* User's role in the system
|
|
30
|
+
*/
|
|
31
|
+
role: UserRole;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* User's age (optional)
|
|
35
|
+
*/
|
|
36
|
+
age?: number;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* User's phone number (optional)
|
|
40
|
+
*/
|
|
41
|
+
phone?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class UpdateUserDto {
|
|
45
|
+
/**
|
|
46
|
+
* User's full name (optional for updates)
|
|
47
|
+
*/
|
|
48
|
+
name?: string;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* User's email address (optional for updates)
|
|
52
|
+
*/
|
|
53
|
+
email?: string;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* User's role in the system (optional for updates)
|
|
57
|
+
*/
|
|
58
|
+
role?: UserRole;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* User's age (optional)
|
|
62
|
+
*/
|
|
63
|
+
age?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export class AddressDto {
|
|
67
|
+
/**
|
|
68
|
+
* Street address
|
|
69
|
+
*/
|
|
70
|
+
street: string;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* City name
|
|
74
|
+
*/
|
|
75
|
+
city: string;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Country name
|
|
79
|
+
*/
|
|
80
|
+
country: string;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Postal/ZIP code (optional)
|
|
84
|
+
*/
|
|
85
|
+
zipCode?: string;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export class UserResponseDto {
|
|
89
|
+
/**
|
|
90
|
+
* Unique user identifier
|
|
91
|
+
*/
|
|
92
|
+
id: number;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* User's full name
|
|
96
|
+
*/
|
|
97
|
+
name: string;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* User's email address
|
|
101
|
+
*/
|
|
102
|
+
email: string;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* User's role in the system
|
|
106
|
+
*/
|
|
107
|
+
role: UserRole;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* User's age
|
|
111
|
+
*/
|
|
112
|
+
age?: number;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* User's phone number
|
|
116
|
+
*/
|
|
117
|
+
phone?: string;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* User's address information
|
|
121
|
+
*/
|
|
122
|
+
address?: AddressDto;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Timestamp when the user was created
|
|
126
|
+
*/
|
|
127
|
+
createdAt: Date;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Timestamp when the user was last updated
|
|
131
|
+
*/
|
|
132
|
+
updatedAt: Date;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export class PaginationQueryDto {
|
|
136
|
+
/**
|
|
137
|
+
* Page number (starts from 1)
|
|
138
|
+
*/
|
|
139
|
+
page?: number;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Number of items per page
|
|
143
|
+
*/
|
|
144
|
+
limit?: number;
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Sort field name
|
|
148
|
+
*/
|
|
149
|
+
sortBy?: string;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Sort order (asc or desc)
|
|
153
|
+
*/
|
|
154
|
+
order?: 'asc' | 'desc';
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export class PaginatedResponseDto<T> {
|
|
158
|
+
/**
|
|
159
|
+
* Array of items for the current page
|
|
160
|
+
*/
|
|
161
|
+
data: T[];
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Total number of items across all pages
|
|
165
|
+
*/
|
|
166
|
+
total: number;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Current page number
|
|
170
|
+
*/
|
|
171
|
+
page: number;
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Number of items per page
|
|
175
|
+
*/
|
|
176
|
+
limit: number;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Total number of pages
|
|
180
|
+
*/
|
|
181
|
+
totalPages: number;
|
|
182
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nest-scramble",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "A next-generation, decorator-free API documentation engine and intelligent mock server for NestJS, engineered by Mohamed Mustafa",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test file to verify DTO schema generation
|
|
3
|
+
* This file demonstrates the expected behavior
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Simple DTO with basic types
|
|
7
|
+
class CreateProductDto {
|
|
8
|
+
name: string;
|
|
9
|
+
price: number;
|
|
10
|
+
description: string;
|
|
11
|
+
inStock: boolean;
|
|
12
|
+
category?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Response DTO
|
|
16
|
+
class ProductResponseDto {
|
|
17
|
+
id: number;
|
|
18
|
+
name: string;
|
|
19
|
+
price: number;
|
|
20
|
+
description: string;
|
|
21
|
+
inStock: boolean;
|
|
22
|
+
category?: string;
|
|
23
|
+
createdAt: Date;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Expected OpenAPI Schema Output:
|
|
27
|
+
const expectedSchema = {
|
|
28
|
+
components: {
|
|
29
|
+
schemas: {
|
|
30
|
+
CreateProductDto: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
name: { type: 'string', example: 'John Doe' },
|
|
34
|
+
price: { type: 'number', example: 99.99 },
|
|
35
|
+
description: { type: 'string', example: 'Sample description text' },
|
|
36
|
+
inStock: { type: 'boolean', example: true },
|
|
37
|
+
category: { type: 'string', example: 'sample value' },
|
|
38
|
+
},
|
|
39
|
+
required: ['name', 'price', 'description', 'inStock'],
|
|
40
|
+
example: {
|
|
41
|
+
name: 'John Doe',
|
|
42
|
+
price: 99.99,
|
|
43
|
+
description: 'Sample description text',
|
|
44
|
+
inStock: true,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
ProductResponseDto: {
|
|
48
|
+
type: 'object',
|
|
49
|
+
properties: {
|
|
50
|
+
id: { type: 'number', example: 1 },
|
|
51
|
+
name: { type: 'string', example: 'John Doe' },
|
|
52
|
+
price: { type: 'number', example: 99.99 },
|
|
53
|
+
description: { type: 'string', example: 'Sample description text' },
|
|
54
|
+
inStock: { type: 'boolean', example: true },
|
|
55
|
+
category: { type: 'string', example: 'sample value' },
|
|
56
|
+
createdAt: { type: 'string', format: 'date-time', example: '2024-01-01T00:00:00.000Z' },
|
|
57
|
+
},
|
|
58
|
+
required: ['id', 'name', 'price', 'description', 'inStock', 'createdAt'],
|
|
59
|
+
example: {
|
|
60
|
+
id: 1,
|
|
61
|
+
name: 'John Doe',
|
|
62
|
+
price: 99.99,
|
|
63
|
+
description: 'Sample description text',
|
|
64
|
+
inStock: true,
|
|
65
|
+
createdAt: '2024-01-01T00:00:00.000Z',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// Expected endpoint with request body:
|
|
73
|
+
const expectedEndpoint = {
|
|
74
|
+
'/products': {
|
|
75
|
+
post: {
|
|
76
|
+
summary: 'create',
|
|
77
|
+
requestBody: {
|
|
78
|
+
required: true,
|
|
79
|
+
content: {
|
|
80
|
+
'application/json': {
|
|
81
|
+
schema: {
|
|
82
|
+
$ref: '#/components/schemas/CreateProductDto',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
responses: {
|
|
88
|
+
'201': {
|
|
89
|
+
description: 'Created',
|
|
90
|
+
content: {
|
|
91
|
+
'application/json': {
|
|
92
|
+
schema: {
|
|
93
|
+
$ref: '#/components/schemas/ProductResponseDto',
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export { CreateProductDto, ProductResponseDto, expectedSchema, expectedEndpoint };
|