Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add onlyOneSimpleParam option to no-confusing-arrow rule #15566

Merged
merged 7 commits into from Feb 18, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 15 additions & 2 deletions docs/rules/no-confusing-arrow.md
Expand Up @@ -41,12 +41,12 @@ 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 +65,19 @@ var x = a => (1 ? 2 : 3);
var x = (a) => (1 ? 2 : 3);
Gautam-Arora24 marked this conversation as resolved.
Show resolved Hide resolved
```

`onlyOneSimpleParam` is a boolean setting that can be `true` or `false`(false):
Gautam-Arora24 marked this conversation as resolved.
Show resolved Hide resolved

1. `true` warns if arrow functions with a single argument that is either an identifier or a primitive literal is used.
2. `false` relaxes the rule.

Examples of **incorrect** code for this rule with the `{"onlyOneSimpleParam": true}` option:

```js
/*eslint no-confusing-arrow: ["error", {"onlyOneSimpleParam": true}]*/
/*eslint-env es6*/
var x = (a) => (1 ? 2 : 3);
```

Gautam-Arora24 marked this conversation as resolved.
Show resolved Hide resolved
## 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;
Gautam-Arora24 marked this conversation as resolved.
Show resolved Hide resolved
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
23 changes: 22 additions & 1 deletion tests/lib/rules/no-confusing-arrow.js
Expand Up @@ -30,7 +30,16 @@ 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: "var x = (a,b) => (1 ? 2 : 3)", options: [{ onlyOneSimpleParam: false }] },
{ 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 +80,18 @@ 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 = (a) => 1 ? 2 : 3",
output: null,
options: [{ onlyOneSimpleParam: true, allowParens: false }],
errors: [{ messageId: "confusing" }]
},
{
code: "var x = (a) => 1 ? 2 : 3",
output: "var x = (a) => (1 ? 2 : 3)",
options: [{ onlyOneSimpleParam: true, allowParens: true }],
errors: [{ messageId: "confusing" }]
Gautam-Arora24 marked this conversation as resolved.
Show resolved Hide resolved
}
]
});