diff --git a/docs/rules/no-confusing-arrow.md b/docs/rules/no-confusing-arrow.md index 3671163eadf..f88af8e5d9a 100644 --- a/docs/rules/no-confusing-arrow.md +++ b/docs/rules/no-confusing-arrow.md @@ -10,7 +10,9 @@ Here's an example where the usage of `=>` could be confusing: // The intent is not clear var x = a => 1 ? 2 : 3; // Did the author mean this -var x = function (a) { return 1 ? 2 : 3 }; +var x = function (a) { + return 1 ? 2 : 3; +}; // Or this var x = a <= 1 ? 2 : 3; ``` @@ -32,21 +34,25 @@ Examples of **correct** code for this rule: ```js /*eslint no-confusing-arrow: "error"*/ /*eslint-env es6*/ - var x = a => (1 ? 2 : 3); var x = (a) => (1 ? 2 : 3); +var x = (a) => { + return 1 ? 2 : 3; +}; var x = a => { return 1 ? 2 : 3; }; -var x = (a) => { return 1 ? 2 : 3; }; ``` ## Options -This rule accepts a single options argument with the following defaults: +This rule accepts two options argument with the following defaults: ```json { "rules": { - "no-confusing-arrow": ["error", {"allowParens": true}] + "no-confusing-arrow": [ + "error", + { "allowParens": true, "onlyOneSimpleParam": false } + ] } } ``` @@ -65,6 +71,24 @@ var x = a => (1 ? 2 : 3); var x = (a) => (1 ? 2 : 3); ``` +`onlyOneSimpleParam` is a boolean setting that can be `true` or `false`(default): + +1. `true` relaxes the rule and doesn't report errors if the arrow function has 0 or more than 1 parameters, or the parameter is not an identifier. +2. `false` warns regardless of parameters. + +Examples of **correct** code for this rule with the `{"onlyOneSimpleParam": true}` option: + +```js +/*eslint no-confusing-arrow: ["error", {"onlyOneSimpleParam": true}]*/ +/*eslint-env es6*/ +() => 1 ? 2 : 3; +(a, b) => 1 ? 2 : 3; +(a = b) => 1 ? 2 : 3; +({ a }) => 1 ? 2 : 3; +([a]) => 1 ? 2 : 3; +(...a) => 1 ? 2 : 3; +``` + ## Related Rules * [no-constant-condition](no-constant-condition.md) diff --git a/lib/rules/no-confusing-arrow.js b/lib/rules/no-confusing-arrow.js index 7b736c19728..9cdd0a85dbb 100644 --- a/lib/rules/no-confusing-arrow.js +++ b/lib/rules/no-confusing-arrow.js @@ -41,7 +41,8 @@ module.exports = { schema: [{ type: "object", properties: { - allowParens: { type: "boolean", default: true } + allowParens: { type: "boolean", default: true }, + onlyOneSimpleParam: { type: "boolean", default: false } }, additionalProperties: false }], @@ -54,6 +55,7 @@ module.exports = { create(context) { const config = context.options[0] || {}; const allowParens = config.allowParens || (config.allowParens === void 0); + const onlyOneSimpleParam = config.onlyOneSimpleParam; const sourceCode = context.getSourceCode(); @@ -65,7 +67,9 @@ module.exports = { function checkArrowFunc(node) { const body = node.body; - if (isConditional(body) && !(allowParens && astUtils.isParenthesised(sourceCode, body))) { + if (isConditional(body) && + !(allowParens && astUtils.isParenthesised(sourceCode, body)) && + !(onlyOneSimpleParam && !(node.params.length === 1 && node.params[0].type === "Identifier"))) { context.report({ node, messageId: "confusing", diff --git a/tests/lib/rules/no-confusing-arrow.js b/tests/lib/rules/no-confusing-arrow.js index 58724d9ace2..372f2057bbf 100644 --- a/tests/lib/rules/no-confusing-arrow.js +++ b/tests/lib/rules/no-confusing-arrow.js @@ -30,7 +30,15 @@ ruleTester.run("no-confusing-arrow", rule, { { code: "var x = (a) => { return 1 ? 2 : 3; }", options: [{ allowParens: false }] }, "var x = a => (1 ? 2 : 3)", - { code: "var x = a => (1 ? 2 : 3)", options: [{ allowParens: true }] } + { code: "var x = a => (1 ? 2 : 3)", options: [{ allowParens: true }] }, + + "var x = (a,b) => (1 ? 2 : 3)", + { code: "() => 1 ? 2 : 3", options: [{ onlyOneSimpleParam: true }] }, + { code: "(a, b) => 1 ? 2 : 3", options: [{ onlyOneSimpleParam: true }] }, + { code: "(a = b) => 1 ? 2 : 3", options: [{ onlyOneSimpleParam: true }] }, + { code: "({ a }) => 1 ? 2 : 3", options: [{ onlyOneSimpleParam: true }] }, + { code: "([a]) => 1 ? 2 : 3", options: [{ onlyOneSimpleParam: true }] }, + { code: "(...a) => 1 ? 2 : 3", options: [{ onlyOneSimpleParam: true }] } ], invalid: [ { @@ -71,6 +79,48 @@ ruleTester.run("no-confusing-arrow", rule, { code: "var x = (a) => 1 ? 2 : 3", output: "var x = (a) => (1 ? 2 : 3)", errors: [{ messageId: "confusing" }] + }, + { + code: "var x = () => 1 ? 2 : 3", + output: "var x = () => (1 ? 2 : 3)", + errors: [{ messageId: "confusing" }] + }, + { + code: "var x = () => 1 ? 2 : 3", + output: "var x = () => (1 ? 2 : 3)", + options: [{}], + errors: [{ messageId: "confusing" }] + }, + { + code: "var x = () => 1 ? 2 : 3", + output: "var x = () => (1 ? 2 : 3)", + options: [{ onlyOneSimpleParam: false }], + errors: [{ messageId: "confusing" }] + }, + { + code: "var x = (a, b) => 1 ? 2 : 3", + output: "var x = (a, b) => (1 ? 2 : 3)", + errors: [{ messageId: "confusing" }] + }, + { + code: "var x = (a = b) => 1 ? 2 : 3", + output: "var x = (a = b) => (1 ? 2 : 3)", + errors: [{ messageId: "confusing" }] + }, + { + code: "var x = ({ a }) => 1 ? 2 : 3", + output: "var x = ({ a }) => (1 ? 2 : 3)", + errors: [{ messageId: "confusing" }] + }, + { + code: "var x = ([a]) => 1 ? 2 : 3", + output: "var x = ([a]) => (1 ? 2 : 3)", + errors: [{ messageId: "confusing" }] + }, + { + code: "var x = (...a) => 1 ? 2 : 3", + output: "var x = (...a) => (1 ? 2 : 3)", + errors: [{ messageId: "confusing" }] } ] });