/** * @fileoverview enforce default parameters to be last * @author Chiawen Chen */ "use strict"; /** * Checks if node is required: i.e. does not have a default value or ? optional indicator. * @param {ASTNode} node the node to be evaluated * @returns {boolean} true if the node is required, false if not. */ function isRequiredParameter(node) { return !( node.type === "AssignmentPattern" || node.type === "RestElement" || node.optional ); } /** @type {import('../types').Rule.RuleModule} */ module.exports = { meta: { dialects: ["javascript", "typescript"], language: "javascript", type: "suggestion", docs: { description: "Enforce default parameters to be last", recommended: false, frozen: true, url: "https://eslint.org/docs/latest/rules/default-param-last", }, schema: [], messages: { shouldBeLast: "Default parameters should be last.", }, }, create(context) { /** * Handler for function contexts. * @param {ASTNode} node function node * @returns {void} */ function handleFunction(node) { let hasSeenRequiredParameter = false; for (let i = node.params.length - 1; i >= 0; i -= 1) { const current = node.params[i]; const param = current.type === "TSParameterProperty" ? current.parameter : current; if (isRequiredParameter(param)) { hasSeenRequiredParameter = true; continue; } if (hasSeenRequiredParameter) { context.report({ node: current, messageId: "shouldBeLast", }); } } } return { FunctionDeclaration: handleFunction, FunctionExpression: handleFunction, ArrowFunctionExpression: handleFunction, }; }, };