1/** 2 * @fileoverview Rule to flag use of an lexical declarations inside a case clause 3 * @author Erik Arvidsson 4 */ 5"use strict"; 6 7//------------------------------------------------------------------------------ 8// Rule Definition 9//------------------------------------------------------------------------------ 10 11module.exports = { 12 meta: { 13 type: "suggestion", 14 15 docs: { 16 description: "disallow lexical declarations in case clauses", 17 category: "Best Practices", 18 recommended: true, 19 url: "https://eslint.org/docs/rules/no-case-declarations" 20 }, 21 22 schema: [], 23 24 messages: { 25 unexpected: "Unexpected lexical declaration in case block." 26 } 27 }, 28 29 create(context) { 30 31 /** 32 * Checks whether or not a node is a lexical declaration. 33 * @param {ASTNode} node A direct child statement of a switch case. 34 * @returns {boolean} Whether or not the node is a lexical declaration. 35 */ 36 function isLexicalDeclaration(node) { 37 switch (node.type) { 38 case "FunctionDeclaration": 39 case "ClassDeclaration": 40 return true; 41 case "VariableDeclaration": 42 return node.kind !== "var"; 43 default: 44 return false; 45 } 46 } 47 48 return { 49 SwitchCase(node) { 50 for (let i = 0; i < node.consequent.length; i++) { 51 const statement = node.consequent[i]; 52 53 if (isLexicalDeclaration(statement)) { 54 context.report({ 55 node: statement, 56 messageId: "unexpected" 57 }); 58 } 59 } 60 } 61 }; 62 63 } 64}; 65