UNPKG

@nestjs/swagger

Version:

Nest - modern, fast, powerful node.js web framework (@swagger)

78 lines (77 loc) 3.68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const ts = require("typescript"); const decorators_1 = require("../../decorators"); const plugin_constants_1 = require("../plugin-constants"); const ast_utils_1 = require("../utils/ast-utils"); const plugin_utils_1 = require("../utils/plugin-utils"); const abstract_visitor_1 = require("./abstract.visitor"); class ControllerClassVisitor extends abstract_visitor_1.AbstractFileVisitor { visit(sourceFile, ctx, program) { const typeChecker = program.getTypeChecker(); sourceFile = this.updateImports(sourceFile); const visitNode = (node) => { if (ts.isMethodDeclaration(node)) { return this.addDecoratorToNode(node, typeChecker, sourceFile.fileName); } return ts.visitEachChild(node, visitNode, ctx); }; return ts.visitNode(sourceFile, visitNode); } addDecoratorToNode(compilerNode, typeChecker, hostFilename) { const { pos, end } = compilerNode.decorators || ts.createNodeArray(); compilerNode.decorators = Object.assign([ ...(compilerNode.decorators || ts.createNodeArray()), ts.createDecorator(ts.createCall(ts.createIdentifier(`${plugin_constants_1.OPENAPI_NAMESPACE}.${decorators_1.ApiResponse.name}`), undefined, [ this.createDecoratorObjectLiteralExpr(compilerNode, typeChecker, [], hostFilename) ])) ], { pos, end }); return compilerNode; } createDecoratorObjectLiteralExpr(node, typeChecker, existingProperties = [], hostFilename) { const properties = [ ...existingProperties, this.createStatusPropertyAssignment(node, existingProperties), this.createTypePropertyAssignment(node, typeChecker, existingProperties, hostFilename) ]; return ts.createObjectLiteral(lodash_1.compact(properties)); } createTypePropertyAssignment(node, typeChecker, existingProperties, hostFilename) { if (plugin_utils_1.hasPropertyKey('type', existingProperties)) { return undefined; } const signature = typeChecker.getSignatureFromDeclaration(node); const type = typeChecker.getReturnTypeOfSignature(signature); if (!type) { return undefined; } let typeReference = plugin_utils_1.getTypeReferenceAsString(type, typeChecker); if (!typeReference) { return undefined; } typeReference = plugin_utils_1.replaceImportPath(typeReference, hostFilename); return ts.createPropertyAssignment('type', ts.createIdentifier(typeReference)); } createStatusPropertyAssignment(node, existingProperties) { if (plugin_utils_1.hasPropertyKey('status', existingProperties)) { return undefined; } const statusNode = this.getStatusCodeIdentifier(node); return ts.createPropertyAssignment('status', statusNode); } getStatusCodeIdentifier(node) { const decorators = node.decorators; const httpCodeDecorator = plugin_utils_1.getDecoratorOrUndefinedByNames(['HttpCode'], decorators); if (httpCodeDecorator) { const argument = lodash_1.head(ast_utils_1.getDecoratorArguments(httpCodeDecorator)); return argument; } const postDecorator = plugin_utils_1.getDecoratorOrUndefinedByNames(['Post'], decorators); if (postDecorator) { return ts.createIdentifier('201'); } return ts.createIdentifier('200'); } } exports.ControllerClassVisitor = ControllerClassVisitor;