| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | /** * @fileoverview Rule to enforce a particular function style * @author Nicholas C. Zakas */"use strict";//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------/** @type {import('../shared/types').Rule} */module.exports = {    meta: {        type: "suggestion",        docs: {            description: "Enforce the consistent use of either `function` declarations or expressions",            recommended: false,            url: "https://eslint.org/docs/rules/func-style"        },        schema: [            {                enum: ["declaration", "expression"]            },            {                type: "object",                properties: {                    allowArrowFunctions: {                        type: "boolean",                        default: false                    }                },                additionalProperties: false            }        ],        messages: {            expression: "Expected a function expression.",            declaration: "Expected a function declaration."        }    },    create(context) {        const style = context.options[0],            allowArrowFunctions = context.options[1] && context.options[1].allowArrowFunctions,            enforceDeclarations = (style === "declaration"),            stack = [];        const nodesToCheck = {            FunctionDeclaration(node) {                stack.push(false);                if (!enforceDeclarations && node.parent.type !== "ExportDefaultDeclaration") {                    context.report({ node, messageId: "expression" });                }            },            "FunctionDeclaration:exit"() {                stack.pop();            },            FunctionExpression(node) {                stack.push(false);                if (enforceDeclarations && node.parent.type === "VariableDeclarator") {                    context.report({ node: node.parent, messageId: "declaration" });                }            },            "FunctionExpression:exit"() {                stack.pop();            },            ThisExpression() {                if (stack.length > 0) {                    stack[stack.length - 1] = true;                }            }        };        if (!allowArrowFunctions) {            nodesToCheck.ArrowFunctionExpression = function() {                stack.push(false);            };            nodesToCheck["ArrowFunctionExpression:exit"] = function(node) {                const hasThisExpr = stack.pop();                if (enforceDeclarations && !hasThisExpr && node.parent.type === "VariableDeclarator") {                    context.report({ node: node.parent, messageId: "declaration" });                }            };        }        return nodesToCheck;    }};
 |