/** * @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, }; }, };