UNPKG

@arabasta/eslint-plugin-tsoa

Version:
102 lines (101 loc) 3.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const utils_1 = require("../utils"); exports.default = (0, utils_1.createRule)({ name: 'valid-security-decorator', meta: { messages: { requireCorrectResponseDecoratorForMethods: "Methods using the '@Security' decorator or being inside a class that uses it are required to have the '@Response({{ statusCode }})' decorator on them or their class", requireCorrectResponseDecoratorForClasses: "Classes using the '@Security' decorator are required to have the '@Response({{ statusCode }})' decorator on them", }, type: 'problem', docs: { description: 'require `@Response` decorator with a specific status code on methods or classes that are affected by the `@Security` decorator', recommended: true, }, schema: [ { type: 'object', additionalProperties: false, properties: { statusCode: { oneOf: [ { type: 'string', }, { type: 'number', }, ], description: 'The status code that has to be used with the `@Response` decorator', }, }, }, ], }, defaultOptions: [ { statusCode: 401, }, ], create: (context, [{ statusCode }]) => { let currentClassDeclarationNode; return { ClassDeclaration(node) { currentClassDeclarationNode = node; }, MethodDefinition(node) { if (!(0, utils_1.hasDecoratorWithName)({ node, decoratorName: 'Security' }) && !(0, utils_1.hasDecoratorWithName)({ node: currentClassDeclarationNode, decoratorName: 'Security', })) { return; } const responseDecorators = [ ...(0, utils_1.getAllDecoratorsWithName)({ node, decoratorName: 'Response', }), ...(0, utils_1.getAllDecoratorsWithName)({ node: currentClassDeclarationNode, decoratorName: 'Response', }), ]; if (!(0, utils_1.hasResponseDecoratorWithStatus)({ status: statusCode, decorators: responseDecorators, })) { context.report({ node, messageId: 'requireCorrectResponseDecoratorForMethods', data: { statusCode, }, }); } }, 'ClassDeclaration:exit': (node) => { if (!(0, utils_1.hasDecoratorWithName)({ node, decoratorName: 'Security' })) { return; } const responseDecorators = (0, utils_1.getAllDecoratorsWithName)({ node, decoratorName: 'Response', }); if (!(0, utils_1.hasResponseDecoratorWithStatus)({ status: statusCode, decorators: responseDecorators, })) { context.report({ node, messageId: 'requireCorrectResponseDecoratorForClasses', data: { statusCode, }, }); } }, }; }, });