ESLint v2.12.0

前 [v2.11.0] | 次 [v2.13.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v2.12.0 released: <a href="https://t.co/60DWsElZ3u">https://t.co/60DWsElZ3u</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/741330387339640833">2016年6月10日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

いくつかのバグ修正・ルール追加・機能改善が行われました。
[JSCS] からのルール移植を実施中です。進捗は GitHub の [JSCS Compatibility] マイルストーンを参照してください。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

|     | URI |
|:----|:----|
| 日本語 Issue 管理リポジトリ | https://github.com/eslint/eslint-jp |
| 日本語チャット | https://gitter.im/eslint/eslint-jp |
| 本家 Issue 管理リポジトリ | https://github.com/eslint/eslint |
| 本家チャット | https://gitter.im/eslint/eslint |

----

# :sparkles: ツール本体の改善

## [#5679]: 多数のファイルを Linting するときの性能が改善された

これは、先日の Google I/O で行われた [性能改善ツールの実演 (YouTube)](https://www.youtube.com/watch?v=iMqi55rcR00&feature=youtu.be&t=1770) で送られた Pull Request を元に行われた改善です。

Thanks Google!

## [#6240]: `eslint:all` が追加された

これは、全ルールを ON にする組込み共有設定です。

```json
{
    "extends": "eslint:all"
}
```

新しいルールが追加される度に追加されたルールも自動的に ON になるため、`"eslint:all"` を利用すると minor リリースの度に CI ビルドが壊れてしまうかもしれません。そのためこの提案は棄却されていたのですが、要望が多かったために追加された次第です。
注意してご利用ください。

## [#6244]: Semantic Versioning ポリシーが明記された

ESLint は Semantic Versioning に従っています。
ただ、具体的にどのような場合に major, minor, patch バージョンを上げるのか明記されていませんでした。JSCS から参加したメンバーがこれに気づき、ドキュメント化された次第です。

[Semantic Versioning Policy](https://github.com/eslint/eslint#semantic-versioning-policy)

- Patch リリース
    - 各ルールのバグ修正 (警告を減らす方向への修正)
    - ツール本体のバグ修正
    - ドキュメントの改善
    - 内部的な変更 (リファクタリングやテストの改善など)
    - リリース失敗時の再リリース
- Minor リリース
    - 各ルールのバグ修正 (警告を増やす方向への修正)
    - 新ルールの追加
    - 新オプションの追加
    - 新 CLI オプションの追加
    - 新 Node API の追加
    - 新フォーマッターの追加
    - 既存ルールの非推奨化
- Major リリース
    - `eslint:recommended` の更新
    - 既存ルールの削除
    - 既存フォーマッターの削除
    - 公開 API の非互換な変更

# :bulb: 新しいルール

## [#5391]: [rest-spread-spacing]

:pencil: `eslint --fix` をサポートしています。

Spread 演算子と Rest 演算子の空白を矯正するスタイルルールです。

```js
/*eslint rest-spread-spacing: error*/

// ✔ GOOD
let list = [1, 2, ...spread]
foo(...spread)

let [head, ...rest] = list;
function bar(head, ...rest) {
}

// ✘ BAD
let list = [1, 2, ... spread]
foo(...  spread)

let [head, ...  rest] = list;
function bar(head, ... rest) {
}
```

## [#6023]: [no-mixed-operators]

ひとつの式の中で、特定の演算子を括弧なしで混ぜて使うことを禁止するスタイルルールです。
例えば次のように設定すると、`||`と`&&`を混ぜて使うと警告します。

```js
/*eslint no-mixed-operators: [error, {groups: [[||, &&]]}]*/

// ✔ GOOD
let foo = (a > 0 && b > 0) || c > 0
let foo = a > 0 && (b > 0 || c > 0)

// ✘ BAD
let foo = a > 0 && b > 0 || c > 0
```

## [#6072]: [object-curly-newline]

:pencil: `eslint --fix` をサポートしています。

オブジェクト リテラルのカッコの内側に改行を書くべきかどうかを矯正するスタイルルールです。
デフォルトでは中身が複数行だった場合に改行を必要とします。

```js
/*eslint object-curly-newline: error*/

// ✔ GOOD
let a = {};
let b = {foo: 1};
let c = {foo: 1, bar: 2};
let d = {
    foo: 1,
    bar: 2
};
let e = {
    foo: function() {
        dosomething();
    }
};

// ✘ BAD
let a = {
};
let b = {
    foo: 1
};
let c = {
    foo: 1, bar: 2
};
let d = {foo: 1,
    bar: 2};
let e = {foo: function() {
    dosomething();
}};
```

## [#6078]: [max-lines]

いちファイルの行数が指定以上になると警告するスタイルルールです。

# :wrench: オプションが追加されたルール

## [#5936]: [arrow-body-style]

オブジェクト リテラルを返すだけの Arrow 関数にて、`return`文を使わなければ警告するオプションです。
オブジェクト リテラルを省略形式で書くと、括弧が必要となり不格好なので避けたいという動機があります。オブジェクト リテラルとブロックが両方に `{` で始まるという構文上の悲劇ですね。

```js
/*eslint arrow-body-style: [error, as-needed, {requireReturnForObjectLiteral: true}]*/

// ✔ GOOD
let foo = (x) => {
    return {value: x}
}

// ✘ BAD
let foo = (x) => ({value: x})
```

## [#6317]: [arrow-body-style]

Arrow 関数にてブロックを利用すると警告するオプションです。
ブロックが必要な場合は普通の関数式を使おうというスタイルですね。

```js
/*eslint arrow-body-style: [error, never]*/

// ✔ GOOD
let foo = (x) => x + 1
let foo = function(x) {
    let y = bar(x)
    return x + y
}

// ✘ BAD
let foo = (x) => {
    let y = bar(x)
    return x + y
}
```

... `prefer-arrow-callback` に衝突回避オプションを追加する要望が来そう

[v2.11.0]: http://qiita.com/mysticatea/items/979bee6cd462f135f217
[v2.13.0]: http://qiita.com/mysticatea/items/22d97bdeb790683e4599
[JSCS]: http://jscs.info
[JSCS Compatibility]: https://github.com/eslint/eslint/milestones/JSCS%20Compatibility
[#5391]: https://github.com/eslint/eslint/issues/5391
[#5679]: https://github.com/eslint/eslint/issues/5679
[#5936]: https://github.com/eslint/eslint/issues/5936
[#6023]: https://github.com/eslint/eslint/issues/6023
[#6072]: https://github.com/eslint/eslint/issues/6072
[#6078]: https://github.com/eslint/eslint/issues/6078
[#6240]: https://github.com/eslint/eslint/issues/6240
[#6244]: https://github.com/eslint/eslint/issues/6244
[#6317]: https://github.com/eslint/eslint/issues/6317
[arrow-body-style]: http://eslint.org/docs/rules/arrow-body-style
[max-lines]: http://eslint.org/docs/rules/max-lines
[no-mixed-operators]: http://eslint.org/docs/rules/no-mixed-operators
[object-curly-newline]: http://eslint.org/docs/rules/object-curly-newline
[rest-spread-spacing]: http://eslint.org/docs/rules/rest-spread-spacing