Skip to content

Commit 4a5a4b0

Browse files
Merge pull request #4005 from y-hsgw/fix/plugin-object-example
fix(plugin): generate object examples from @example doc tags
2 parents e5203bf + 667c1f3 commit 4a5a4b0

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

lib/plugin/utils/ast-utils.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -421,10 +421,24 @@ export function createPrimitiveLiteral(
421421
export function createLiteralFromAnyValue(
422422
factory: ts.NodeFactory,
423423
item: unknown
424-
) {
425-
return Array.isArray(item)
426-
? factory.createArrayLiteralExpression(
427-
item.map((item) => createLiteralFromAnyValue(factory, item))
424+
): ts.Expression {
425+
if (Array.isArray(item)) {
426+
return factory.createArrayLiteralExpression(
427+
item.map((item) => createLiteralFromAnyValue(factory, item))
428+
);
429+
}
430+
if (item === null) {
431+
return factory.createNull();
432+
}
433+
if (typeof item === 'object') {
434+
return factory.createObjectLiteralExpression(
435+
Object.entries(item).map(([key, value]) =>
436+
factory.createPropertyAssignment(
437+
factory.createStringLiteral(key),
438+
createLiteralFromAnyValue(factory, value)
439+
)
428440
)
429-
: createPrimitiveLiteral(factory, item);
441+
);
442+
}
443+
return createPrimitiveLiteral(factory, item);
430444
}

test/plugin/fixtures/create-cat-alt2.dto.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ export abstract class Audit {
8282
*/
8383
testNumber: number;
8484
85+
/**
86+
* testObject
87+
*
88+
* @example { "Content-Type": "video/mp4", "key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }
89+
*/
90+
testObject: Record<string, string>;
91+
8592
/**
8693
* privateProperty
8794
* @example 'secret'
@@ -102,7 +109,7 @@ export class Audit {
102109
_Audit_privateProperty.set(this, void 0);
103110
}
104111
static _OPENAPI_METADATA_FACTORY() {
105-
return { createdAt: { required: true, type: () => Object, description: "test on createdAt" }, updatedAt: { required: true, type: () => Object }, version: { required: true, type: () => String, description: "test\\nversion", example: "version 123" }, testVersion: { required: true, type: () => Object, description: "testVersion", examples: ["0.0.1", "0.0.2"], deprecated: true }, testVersion2: { required: true, type: () => Object, description: "testVersion2", examples: ["0.0.1", "0.0.2"], deprecated: true }, testVersionArray: { required: true, type: () => [String], description: "testVersionArray", example: ["0.0.1", "0.0.2"] }, testVersionArray2: { required: true, type: () => [String], description: "testVersionArray", example: ["version 123", "version 321"] }, testVersionArray3: { required: true, type: () => [Number], description: "testVersionArray", example: [123, 321] }, testBoolean: { required: true, type: () => Boolean, description: "testBoolean", example: true }, testNumber: { required: true, type: () => Number, description: "testNumber", examples: [1, 5] } };
112+
return { createdAt: { required: true, type: () => Object, description: "test on createdAt" }, updatedAt: { required: true, type: () => Object }, version: { required: true, type: () => String, description: "test\\nversion", example: "version 123" }, testVersion: { required: true, type: () => Object, description: "testVersion", examples: ["0.0.1", "0.0.2"], deprecated: true }, testVersion2: { required: true, type: () => Object, description: "testVersion2", examples: ["0.0.1", "0.0.2"], deprecated: true }, testVersionArray: { required: true, type: () => [String], description: "testVersionArray", example: ["0.0.1", "0.0.2"] }, testVersionArray2: { required: true, type: () => [String], description: "testVersionArray", example: ["version 123", "version 321"] }, testVersionArray3: { required: true, type: () => [Number], description: "testVersionArray", example: [123, 321] }, testBoolean: { required: true, type: () => Boolean, description: "testBoolean", example: true }, testNumber: { required: true, type: () => Number, description: "testNumber", examples: [1, 5] }, testObject: { required: true, type: "object", additionalProperties: { type: "string" }, description: "testObject", example: { "Content-Type": "video/mp4", "key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } } };
106113
}
107114
}
108115
_Audit_privateProperty = new WeakMap();

0 commit comments

Comments
 (0)