Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,12 +8,12 @@ This rule can enforce the use of braces around arrow function body. | |
|
||
## Options | ||
|
||
The rule takes one option, a string, which can be: | ||
The rule takes one or two options. The first is a string, which can be: | ||
|
||
* `"always"` enforces braces around the function body | ||
* `"as-needed"` enforces no braces where they can be omitted (default) | ||
|
||
### "always" | ||
The second one is an object for more fine-grained configuration when the first option is `"as-needed"`. Currently, the only available parameter is `allowObjectLiteralBody`, which indicates if object literals should be declared using braces, thus requiring an explicit return. | ||
|
||
```json | ||
"arrow-body-style": ["error", "always"] | ||
|
@@ -50,6 +50,8 @@ When the rule is set to `"as-needed"` the following patterns are considered prob | |
let foo = () => { | ||
return 0; | ||
}; | ||
|
||
let foo = () => { return { bar: 0 }; } | ||
``` | ||
|
||
The following patterns are not considered problems: | ||
|
@@ -69,4 +71,26 @@ let foo = () => { /* do nothing */ }; | |
let foo = () => { | ||
// do nothing. | ||
}; | ||
let foo = () => ({ bar: 0 }); | ||
``` | ||
|
||
#### allowObjectLiteralBody | ||
|
||
When the rule is set to `"as-needed", { allowObjectLiteralBody: true }` the following patterns are considered problems: | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
BYK
Member
|
||
|
||
```js | ||
/*eslint arrow-body-style: ["error", "as-needed", { allowObjectLiteralBody: true }]*/ | ||
/*eslint-env es6*/ | ||
let foo = () => ({}); | ||
let foo = () => ({ bar: 0 }); | ||
``` | ||
|
||
The following patterns are not considered problems: | ||
|
||
```js | ||
/*eslint arrow-body-style: ["error", "as-needed", { allowObjectLiteralBody: true }]*/ | ||
/*eslint-env es6*/ | ||
|
||
let foo = () => {}; | ||
let foo = () => { return { bar: 0 }; }; | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,16 +16,43 @@ module.exports = { | |
recommended: false | ||
}, | ||
|
||
schema: [ | ||
{ | ||
enum: ["always", "as-needed"] | ||
} | ||
] | ||
schema: { | ||
anyOf: [ | ||
{ | ||
type: "array", | ||
items: [ | ||
{ | ||
enum: ["always"] | ||
} | ||
], | ||
minItems: 0, | ||
maxItems: 1 | ||
}, | ||
{ | ||
type: "array", | ||
items: [ | ||
{ | ||
enum: ["as-needed"] | ||
}, | ||
{ | ||
type: "object", | ||
properties: { | ||
allowObjectLiteralBody: {type: "boolean"} | ||
}, | ||
additionalProperties: false | ||
} | ||
], | ||
minItems: 0, | ||
maxItems: 2 | ||
} | ||
] | ||
} | ||
}, | ||
|
||
create: function(context) { | ||
var always = context.options[0] === "always"; | ||
var asNeeded = !context.options[0] || context.options[0] === "as-needed"; | ||
var allowObjectLiteralBody = context.options[1] && context.options[1].allowObjectLiteralBody === true; | ||
This comment has been minimized.
Sorry, something went wrong.
BYK
Member
|
||
|
||
/** | ||
* Determines whether a arrow function body needs braces | ||
|
@@ -42,6 +69,11 @@ module.exports = { | |
return; | ||
} | ||
|
||
if (asNeeded && allowObjectLiteralBody && blockBody[0].type === "ReturnStatement" && | ||
blockBody[0].argument.type === "ObjectExpression") { | ||
return; | ||
} | ||
|
||
if (asNeeded && blockBody[0].type === "ReturnStatement") { | ||
context.report({ | ||
node: node, | ||
|
@@ -50,7 +82,7 @@ module.exports = { | |
}); | ||
} | ||
} else { | ||
if (always) { | ||
if (always || (asNeeded && allowObjectLiteralBody && arrowBody.type === "ObjectExpression")) { | ||
context.report({ | ||
node: node, | ||
loc: arrowBody.loc.start, | ||
|
Okay, I made a mistake :D
Looking at this code and my reasoning, I expected
let foo = () => ({ bar: 0 });
to not be a problem along withlet foo = () => { return { bar: 0 }; };
butlet foo = () => { return { bar: 0 }; };
to be a problem when this option was false.Looking back at the ticket, it seems like what you implemented is what was asked and then this option name makes it a bit confusing.
Do you agree? If so I'd go with
enforceObjectLiteralBody
as the option name (although it is an option making this stricter).