ESLint v4.1.0

前 [v4.0.0] | 次 [v4.2.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v4.1.0 has been released: <a href="https://t.co/rpWjkpy4Yn">https://t.co/rpWjkpy4Yn</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/878437908985724928">2017年6月24日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 4.1.0 がリリースされました。
長いことペンディングしていた機能追加 PR がマージされたり、インデント周りのバグ修正が多めです。

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

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

# 🚀 本体への機能追加

## [#3611]: Glob-based configuration!!

`.eslintrc.*`ファイル内で、指定した Glob にマッチするファイルの設定のみ変更できるようになりました。例えば、`**/*.spec.js`にテスト用のルールを追加することができます。

この機能を利用するには、以下のように`overrides`プロパティを利用します。詳細は[こちら<sup>🇺🇸</sup>](http://eslint.org/docs/user-guide/configuring#configuration-based-on-glob-patterns)

```json:.eslintrc.json
{
    "rules": {
        //...
    },
    "overrides": [
        {
            "files": ["**/*.spec.js"],
            "env": { mocha: true }
        }
    ]
}
```

## [#7348]: 各ルールの`fix()`関数が複数の`fix`オブジェクトを返せるようになった

自動修正をサポートする検証ルールを作る場合、`fix()`関数を実装します。
このとき、`fix()`関数は`fix`オブジェクトを1つだけしか返せませんでした。`v4.1.0`から、複数の`fix`オブジェクトを返すことができるようになります。

例えば、あるノードを囲むカッコを削除する`fix()`関数は次のように変化します。

```js:Before
context.report({
    node,
    message: "Unexpected parenthesized expression.",

    fix(fixer) {
        const openParen  = sourceCode.getTokenBefore(node, t => t.value === "(")
        const closeParen = sourceCode.getTokenAfter(node, t => t.value === ")")

        // インラインコメントを消さないために sourceCode.getText(node) を使えない。
        // カッコを削除したいだけだが、削除しないものに注目したコードになっている。
        const code = sourceCode.text.slice(openParen.range[1], closeParen.range[0])
        return fixer.replaceTextRange([openParen.range[0], closeParen.range[1]], code)
    }
})
```

```js:After
context.report({
    node,
    message: "Unexpected parenthesized expression.",

    *fix(fixer) {
        const openParen  = sourceCode.getTokenBefore(node, t => t.value === "(")
        const closeParen = sourceCode.getTokenAfter(node, t => t.value === ")")

        // カッコを削除したいだけなので、カッコを削除する。
        yield fixer.remove(openParen)
        yield fixer.remove(closeParen)
    }
})
```

すっきり。

## [#8458]: `.eslintignore`ファイルの内容を`package.json`に書けるようになった

`.eslintignore`ファイルは、無視するファイルを改行区切りの Glob で書くことができるファイルです。デフォルト (該当ファイルがない場合) では`node_modules`等が無視されるようになっています。この設定を (`.eslintignore`ファイルを作る代わりに) `package.json`ファイルに含めることができるようになりました。

この機能を利用するには、以下のように`eslintIgnore`プロパティを利用します。

```json:package.json
{
    "name": "...",
    "version": "...",
    //...
    "eslintConfig": {
        //...
    },
    "eslintIgnore": [
        "node_modules",
        "build/**/*.js",
        "dist/**/*.js"
    ]
}
```

## [#8631]: `Linter`クラスに自動修正メソッドを追加した

ESLint の JavaScript API は主に2つのクラスで構成されています。

- `Linter` ... 与えられたテキストと設定を使って Lint する。
- `CLIEngine` ... Globs から対象ファイルと設定ファイルを検索して共有設定やプラグインの解決と読み込みを行い、`Linter` を呼び出す。

主に使われるのは`CLIEngine`です。
`Linter`はブラウザ内で使えるようにファイルシステムに依存しない処理だけを受け持っています。

今までは自動修正に関する全てのコードは`CLIEngine`に実装されていましたが、今回の修正で一部`Linter`に移動されました。[オンライン デモ](http://eslint.org/demo/)で自動修正したいですからね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/72555/49e5287a-621b-adc9-e759-24cc3b21bbed.png)

# 💡 新しいルール

今回はありません。

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

## [#6196]: [no-extra-parens] `enforceForArrowConditionals`

[no-confusing-arrow]ルールとの競合を避けるためのオプションです。
アロー関数の本文を囲むカッコを許可します。

```js
/* eslint no-extra-parens: [error, all, { enforceForArrowConditionals: false }] */

//✔ GOOD
const b = a => 1 ? 2 : 3;
const d = c => (1 ? 2 : 3); //< このオプション無しだと警告されます
```

## [#8061]: [no-trailing-spaces] `ignoreComments`

コメント内の末尾スペースを無視するオプションです。
ドキュメント ジェネレータで、コメントを Markdown として解釈している場合などに便利でしょう。

# ✒️ `eslint --fix` をサポートしたルール

今回はありません。

----

[v4.0.0]: http://qiita.com/mysticatea/items/3d01452d76ea6c943793
[v4.2.0]: http://qiita.com/mysticatea/items/9e7254cb2b10032dd79a
[#3611]: https://github.com/eslint/eslint/issues/3611
[#6196]: https://github.com/eslint/eslint/issues/6196
[#7348]: https://github.com/eslint/eslint/issues/7348
[#8061]: https://github.com/eslint/eslint/issues/8061
[#8458]: https://github.com/eslint/eslint/issues/8458
[#8631]: https://github.com/eslint/eslint/issues/8631
[#9999]: https://github.com/eslint/eslint/issues/9999
[no-extra-parens]: http://eslint.org/docs/rules/no-extra-parens
[no-trailing-spaces]: http://eslint.org/docs/rules/no-trailing-spaces
[xxxx]: http://eslint.org/docs/rules/xxxx


<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->