@arabasta/eslint-plugin-tsoa
Version:
ESLint plugin for tsoa rules
102 lines (101 loc) • 3.95 kB
JavaScript
;
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,
},
});
}
},
};
},
});