ESLint v3.6.0

前 [v3.5.0] | 次 [v3.7.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v3.6.0 released: <a href="https://t.co/fwTadlTxuN">https://t.co/fwTadlTxuN</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/779444827121475584">2016年9月23日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 3.6.0 がリリースされました。

今回のリリースで ECMAScript® 2017 Draft の一部をサポートしました!
これにより、`babel-eslint`を利用しなくても async/await や関数関連の末尾カンマを利用できるようになります。
これらの新しい言語機能を利用する場合は、

```json:.eslintrc.json
{
    "parserOptions": {
        "ecmaVersion": 2017
    }
}
```

と設定します。

今後も Stage 4 (finished) に到達した言語機能から順にサポートしていきます。

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

- :globe_with_meridians: [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
- :speech_balloon: [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
- :globe_with_meridians: [本家リポジトリ](https://github.com/eslint/eslint)
- :speech_balloon: [本家サポート チャット](https://gitter.im/eslint/eslint)

----

# :sparkles: ES2017 サポートのために修正されたルール

ES2017 の新しい構文をサポートするために、以下のルールが修正されました。
この他にも ES2017 の新しい構文の周りで誤検知・見逃しをするルールがあるかもしれません。もしも見つけた場合はご一報頂けると幸いです。

## [#7172]: [array-callback-return]

配列メソッドのコールバックとして `async` 関数が使われた場合、戻り値が無くとも警告しないように修正されました。

```js:例
/*eslint array-callback-return:error*/

//✔ GOOD
Promise.all(list.map(async x => { await doSomething(x) })
```

従来は「戻り値が必要だ」と警告されていました。

## [#7173]: [prefer-arrow-callback]

`eslint --fix` が `async` 関数を正しく扱えなかったので修正されました。

## [#7174]: [space-unary-ops]

`await` 式の `await` 文脈キーワードと後続する式との間のスペースをチェックするようになりました。

```js:例
/*eslint space-unary-ops:error*/

async function wrap() {

    //✔ GOOD
    await [1,2,3].reduce(doSomething)

    //✘ BAD
    await[1,2,3].reduce(doSomething)
}
```

## [#7175]: [no-unused-expressions]

`await` 式を副作用のない式だと誤検出していた不具合が修正されました。

## [#7176]: [arrow-parens]

`async` アロー関数で正しく動作していなかった不具合が修正されました。

## [#7178]: [no-extra-parens]

`await` 式関連の演算子結合度を正しく判定できるようになりました。
ちなみに、`await` 演算子の結合度は単項演算子と同じです。
よく似ている `yield` 演算子とは完全に異なるのでご留意ください。

## [#7179]: [keyword-spacing]

`async`・`await` 文脈キーワードの前にある空白をチェックするようになりました。


# :bulb: 新しいルール

今回はありません。

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

## [#6938]: [eol-last]

ファイル末尾に空行が無いと警告する `always` オプションと、ファイル末尾に空行があると警告する `never` オプションが追加されました。デフォルトは `always` (既存の動作) です。

また、既存の2つのオプション `windows` と `linux` は非推奨になりました。
改行文字を指定する場合は `linebreak-style` ルールを利用してください。

表現が難しいので例示は割愛。

## [#7085]: [class-methods-use-this]

特定の名称のメソッドでは`this`を使用しない事を許可できるようになりました。

```js:例
/*eslint class-methods-use-this: [error, {exceptMethods: [foo]}]*/

// ✔ GOOD
class A {
    foo() {
    }
    bar() {
        this.foo()
    }
}

// ✘ BAD
class A {
    bar() {
    }
}
```

## [#7137]: [no-restricted-properties]

以下の2つが新たにできるようになりました。

- 指定した名称の変数での全プロパティアクセスを禁止する
- あらゆる変数での指定プロパティアクセスを禁止する

従来は変数名とプロパティ名を両方指定する必要があったため、用途が限定されていました。

```js:例
/*eslint no-restricted-properties: [
    error,
    {object: require},
    {property: __defineGetter__},
    {property: __defineSetter__}
]*/

// ✔ GOOD
require("a")
obj

// ✘ BAD
require.resolve
require.cache
require.extensions
obj.__defineGetter__
a.__defineGetter__
b.__defineSetter__
```

# :pencil: 新たに eslint --fix をサポートしたルール

## [#6668]: [strict]

自動修正では余分な `"use strict"` を削除します。

```js:例
function foo() {
    "use strict"
    "use strict"
}
// ↓
function foo() {
    "use strict"
}
```

残念ながら追加はしてくれません。
Strict モードが切り替わると既存のコードが構文エラーになる可能性があるためです。

## [#6978]: [prefer-template]

文字列と式との連結をテンプレートに変換します。

```js:例
let b = "hello, " + name + "!"
// ↓
let b = `hello, ${  name  }!`
```

連結演算子 `+` の周囲の空白・コメントは維持されます。
修正後の空白は、[template-curly-spacing] ルールや [no-multi-spaces] ルールが有効になっていれば、それらの自動修正が好み通りに整えてくれるでしょう。

## [#6996]: [quote-props]

プロパティ名を囲むクォートが必要ならば追加し、不要ならば削除します。
追加時のクォートの種類は別途 [quotes] ルールが決定します。

```js:例
let obj = {"a": 1, b: 2}
// ↓
let obj = {a: 1, b: 2}
```

## [#7113]: [no-regex-spaces]

正規表現内の連続した空白を繰り返し表現に修正します。

```js:例
let s = /    /
// ↓
let s = / {4}/
```

[v3.5.0]: http://qiita.com/mysticatea/items/875c801362f337bc4ce9
[v3.7.0]: http://qiita.com/mysticatea/items/dd90aff81eeb92683c5d
[#6668]: https://github.com/eslint/eslint/issues/6668
[#6938]: https://github.com/eslint/eslint/issues/6938
[#6978]: https://github.com/eslint/eslint/issues/6978
[#6996]: https://github.com/eslint/eslint/issues/6996
[#7085]: https://github.com/eslint/eslint/issues/7085
[#7113]: https://github.com/eslint/eslint/issues/7113
[#7137]: https://github.com/eslint/eslint/issues/7137
[#7172]: https://github.com/eslint/eslint/issues/7172
[#7173]: https://github.com/eslint/eslint/issues/7173
[#7174]: https://github.com/eslint/eslint/issues/7174
[#7175]: https://github.com/eslint/eslint/issues/7175
[#7176]: https://github.com/eslint/eslint/issues/7176
[#7178]: https://github.com/eslint/eslint/issues/7178
[#7179]: https://github.com/eslint/eslint/issues/7179
[array-callback-return]: http://eslint.org/docs/rules/array-callback-return
[arrow-parens]: http://eslint.org/docs/rules/arrow-parens
[class-methods-use-this]: http://eslint.org/docs/rules/class-methods-use-this
[eol-last]: http://eslint.org/docs/rules/eol-last
[keyword-spacing]: http://eslint.org/docs/rules/keyword-spacing
[no-extra-parens]: http://eslint.org/docs/rules/no-extra-parens
[no-multi-spaces]: http://eslint.org/docs/rules/no-multi-spaces
[no-regex-spaces]: http://eslint.org/docs/rules/no-regex-spaces
[no-restricted-properties]: http://eslint.org/docs/rules/no-restricted-properties
[no-unused-expressions]: http://eslint.org/docs/rules/no-unused-expressions
[prefer-arrow-callback]: http://eslint.org/docs/rules/prefer-arrow-callback
[prefer-template]: http://eslint.org/docs/rules/prefer-template
[quote-props]: http://eslint.org/docs/rules/quote-props
[quotes]: http://eslint.org/docs/rules/quotes
[space-unary-ops]: http://eslint.org/docs/rules/space-unary-opsrties
[strict]: http://eslint.org/docs/rules/strict
[template-curly-spacing]: http://eslint.org/docs/rules/template-curly-spacing