blob: 8382d46e760fe2fecd496369e588378f2a70706f [file] [log] [blame]
Tim van der Lippec8f6ffd2020-04-06 13:42:00 +01001/**
2 * @fileoverview enforce default parameters to be last
3 * @author Chiawen Chen
4 */
5
6"use strict";
7
8module.exports = {
9 meta: {
10 type: "suggestion",
11
12 docs: {
13 description: "enforce default parameters to be last",
Tim van der Lippec8f6ffd2020-04-06 13:42:00 +010014 recommended: false,
15 url: "https://eslint.org/docs/rules/default-param-last"
16 },
17
18 schema: [],
19
20 messages: {
21 shouldBeLast: "Default parameters should be last."
22 }
23 },
24
25 create(context) {
26
Tim van der Lippec8f6ffd2020-04-06 13:42:00 +010027 /**
Tim van der Lippe0fb47802021-11-08 16:23:10 +000028 * Handler for function contexts.
Tim van der Lippec8f6ffd2020-04-06 13:42:00 +010029 * @param {ASTNode} node function node
30 * @returns {void}
31 */
32 function handleFunction(node) {
33 let hasSeenPlainParam = false;
34
35 for (let i = node.params.length - 1; i >= 0; i -= 1) {
36 const param = node.params[i];
37
38 if (
39 param.type !== "AssignmentPattern" &&
40 param.type !== "RestElement"
41 ) {
42 hasSeenPlainParam = true;
43 continue;
44 }
45
46 if (hasSeenPlainParam && param.type === "AssignmentPattern") {
47 context.report({
48 node: param,
49 messageId: "shouldBeLast"
50 });
51 }
52 }
53 }
54
55 return {
56 FunctionDeclaration: handleFunction,
57 FunctionExpression: handleFunction,
58 ArrowFunctionExpression: handleFunction
59 };
60 }
61};