Skip to content

Commit

Permalink
feat: Add onlyOneSimpleParam option to no-confusing-arrow rule (#15566
Browse files Browse the repository at this point in the history
)

* feat: Add  option to no-confusing-arrow rule

* Follow up commit

* Another follow up commit

* Another follow up commit

* Another commit

* Another followup commit

* Final Commit
  • Loading branch information
Gautam-Arora24 committed Feb 18, 2022
1 parent bfaa548 commit 345e70d
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 8 deletions.
34 changes: 29 additions & 5 deletions docs/rules/no-confusing-arrow.md
Expand Up @@ -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;
```
Expand All @@ -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 }
]
}
}
```
Expand All @@ -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)
Expand Down
8 changes: 6 additions & 2 deletions lib/rules/no-confusing-arrow.js
Expand Up @@ -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
}],
Expand All @@ -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();


Expand All @@ -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",
Expand Down
52 changes: 51 additions & 1 deletion tests/lib/rules/no-confusing-arrow.js
Expand Up @@ -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: [
{
Expand Down Expand Up @@ -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" }]
}
]
});

0 comments on commit 345e70d

Please sign in to comment.