Skip to content

Commit

Permalink
Update: Option for object literals in arrow-body-style (fixes #5936)
Browse files Browse the repository at this point in the history
  • Loading branch information
alberto committed May 25, 2016
1 parent b4cff9d commit 615241f
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 9 deletions.
26 changes: 24 additions & 2 deletions docs/rules/arrow-body-style.md
Expand Up @@ -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 option is `enforceObjectLiteralBody`, a boolean property. It's `true` by default. If set to false, it requires braces and an explicit return for object literals.

```json
"arrow-body-style": ["error", "always"]
Expand Down Expand Up @@ -83,4 +83,26 @@ let foo = () => { /* do nothing */ };
let foo = () => {
// do nothing.
};
let foo = () => ({ bar: 0 });
```

#### enforceObjectLiteralBody

When the rule is set to `"as-needed", { enforceObjectLiteralBody: false }` the following patterns are considered problems:

```js
/*eslint arrow-body-style: ["error", "as-needed", { enforceObjectLiteralBody: false }]*/
/*eslint-env es6*/
let foo = () => ({});
let foo = () => ({ bar: 0 });
```

The following patterns are not considered problems:

```js
/*eslint arrow-body-style: ["error", "as-needed", { enforceObjectLiteralBody: false }]*/
/*eslint-env es6*/

let foo = () => {};
let foo = () => { return { bar: 0 }; };
```
44 changes: 38 additions & 6 deletions lib/rules/arrow-body-style.js
Expand Up @@ -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: {
enforceObjectLiteralBody: {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 enforceObjectLiteralBody = !context.options[1] || context.options[1].enforceObjectLiteralBody !== false;

/**
* Determines whether a arrow function body needs braces
Expand All @@ -42,6 +69,11 @@ module.exports = {
return;
}

if (asNeeded && !enforceObjectLiteralBody && blockBody[0].type === "ReturnStatement" &&
blockBody[0].argument.type === "ObjectExpression") {
return;
}

if (asNeeded && blockBody[0].type === "ReturnStatement") {
context.report({
node: node,
Expand All @@ -50,7 +82,7 @@ module.exports = {
});
}
} else {
if (always) {
if (always || (asNeeded && !enforceObjectLiteralBody && arrowBody.type === "ObjectExpression")) {
context.report({
node: node,
loc: arrowBody.loc.start,
Expand Down
53 changes: 52 additions & 1 deletion tests/lib/rules/arrow-body-style.js
Expand Up @@ -26,11 +26,22 @@ ruleTester.run("arrow-body-style", rule, {
{ code: "var foo = () => {\n /* do nothing */ \n};", parserOptions: { ecmaVersion: 6 } },
{ code: "var foo = (retv, name) => {\nretv[name] = true;\nreturn retv;\n};", parserOptions: { ecmaVersion: 6 } },
{ code: "var foo = () => ({});", parserOptions: { ecmaVersion: 6 } },
{ code: "var foo = () => bar();", parserOptions: { ecmaVersion: 6 } },
{ code: "var foo = () => { bar(); };", parserOptions: { ecmaVersion: 6 } },
{ code: "var foo = () => { b = a };", parserOptions: { ecmaVersion: 6 } },
{ code: "var foo = () => { bar: 1 };", parserOptions: { ecmaVersion: 6 } },
{ code: "var foo = () => { return 0; };", parserOptions: { ecmaVersion: 6 }, options: ["always"] },
{ code: "var foo = () => { return bar(); };", parserOptions: { ecmaVersion: 6 }, options: ["always"] }
{ code: "var foo = () => { return bar(); };", parserOptions: { ecmaVersion: 6 }, options: ["always"] },
{ code: "var foo = () => {};", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var foo = () => 0;", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var addToB = (a) => { b = b + a };", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var foo = () => { /* do nothing */ };", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var foo = () => {\n /* do nothing */ \n};", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var foo = (retv, name) => {\nretv[name] = true;\nreturn retv;\n};", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var foo = () => bar();", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var foo = () => { bar(); };", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var addToB = (a) => { b = b + a };", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] },
{ code: "var foo = () => { return { bar: 0 }; };", parserOptions: { ecmaVersion: 6 }, options: ["as-needed", {enforceObjectLiteralBody: false }] }
],
invalid: [
{
Expand Down Expand Up @@ -64,6 +75,46 @@ ruleTester.run("arrow-body-style", rule, {
errors: [
{ line: 1, column: 17, type: "ArrowFunctionExpression", message: "Unexpected block statement surrounding arrow body." }
]
},
{
code: "var foo = () => { return { bar: 0 }; };",
parserOptions: { ecmaVersion: 6 },
options: ["as-needed"],
errors: [
{ line: 1, column: 17, type: "ArrowFunctionExpression", message: "Unexpected block statement surrounding arrow body." }
]
},
{
code: "var foo = () => { return 0; };",
parserOptions: { ecmaVersion: 6 },
options: ["as-needed", {enforceObjectLiteralBody: false }],
errors: [
{ line: 1, column: 17, type: "ArrowFunctionExpression", message: "Unexpected block statement surrounding arrow body." }
]
},
{
code: "var foo = () => { return bar(); };",
parserOptions: { ecmaVersion: 6 },
options: ["as-needed", {enforceObjectLiteralBody: false }],
errors: [
{ line: 1, column: 17, type: "ArrowFunctionExpression", message: "Unexpected block statement surrounding arrow body." }
]
},
{
code: "var foo = () => ({});",
parserOptions: { ecmaVersion: 6 },
options: ["as-needed", {enforceObjectLiteralBody: false }],
errors: [
{ line: 1, column: 18, type: "ArrowFunctionExpression", message: "Expected block statement surrounding arrow body." }
]
},
{
code: "var foo = () => ({ bar: 0 });",
parserOptions: { ecmaVersion: 6 },
options: ["as-needed", {enforceObjectLiteralBody: false }],
errors: [
{ line: 1, column: 18, type: "ArrowFunctionExpression", message: "Expected block statement surrounding arrow body." }
]
}
]
});

0 comments on commit 615241f

Please sign in to comment.