ESLint v4.12.0

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

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v4.12.0 has been released: <a href="https://t.co/67WAJTVfdr">https://t.co/67WAJTVfdr</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/934631465022836736?ref_src=twsrc%5Etfw">November 26, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 4.12.0 がリリースされました。
小さな機能追加とバグ修正が行われています。

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

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

# 🚀 本体への機能追加

## [#9321]: `Linter.prototype.defineParser` が追加された

ツール開発者向け。

Node.js API の `Linter` クラスに `defineParser` メソッドが追加されました。

```js:例
const eslint = require("eslint")
const linter = new eslint.Linter()

linter.defineParser("my-custom-parser", {
    parse(text, options) {
        // text を解析して AST を作成する
    }
})

linter.verify(text, {
    // 設定で定義されたパーサーを指定できる
    parser: "my-custom-parser",
    rules: { /* ... */ }
})
```

今までは `Linter` 内部で動的 `require` してパーサーを読み込んでいましたが、今後は `defineParser` メソッドで独自のパーサーを定義できます。定義されていなかった場合は、今まで通り動的 `require` します。

# 💡 新しいルール

## [#9629]: [implicit-arrow-linebreak]

Arrow 関数の非ブロックの本体をどこに書くかを矯正するスタイル ルールです。
`"beside"` で `=>` の右側に、`"below"` で下側に書くよう警告します。

```js:例(beside)
/* eslint implicit-arrow-linebreak: [error, beside] */

//✓ GOOD
(foo) => bar;
(foo) => (bar);
(foo) => (
  bar()
);

//✘ BAD
(foo) =>
  bar;
(foo) =>
  (bar);
(foo) =>
(
  bar()
);
```

> [デモを開く](https://eslint.org/demo/#eyJ0ZXh0IjoiLyogZXNsaW50IGltcGxpY2l0LWFycm93LWxpbmVicmVhazogW2Vycm9yLCBiZXNpZGVdICovXHJcblxyXG4vL+KckyBHT09EXHJcbihmb28pID0+IGJhcjtcclxuKGZvbykgPT4gKGJhcik7XHJcbihmb28pID0+IChcclxuICBiYXIoKVxyXG4pO1xyXG5cclxuLy/inJggQkFEXHJcbihmb28pID0+XHJcbiAgYmFyO1xyXG4oZm9vKSA9PlxyXG4gIChiYXIpO1xyXG4oZm9vKSA9PlxyXG4oXHJcbiAgYmFyKClcclxuKTsiLCJvcHRpb25zIjp7InBhcnNlck9wdGlvbnMiOnsiZWNtYVZlcnNpb24iOjgsInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)

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

## [#9506]: [no-restricted-imports] `importNames`

指定したパッケージの特定のメンバーだけを利用禁止にするオプションが追加されました。
`importNames` が未指定の場合は、今まで通りパッケージ全体が禁止されます。

```js:例
/* eslint no-restricted-imports: [error, {name: foo, importNames: [Foo]}] */

//✓ GOOD
import {bar} from "foo";

//✘ BAD
import {Foo} from "foo";
```

> [デモを開く](https://eslint.org/demo/#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLXJlc3RyaWN0ZWQtaW1wb3J0czogW2Vycm9yLCB7bmFtZTogZm9vLCBpbXBvcnROYW1lczogW0Zvb119XSAqL1xyXG5cclxuLy/inJMgR09PRFxyXG5pbXBvcnQge2Jhcn0gZnJvbSBcImZvb1wiO1xyXG5cclxuLy/inJggQkFEXHJcbmltcG9ydCB7Rm9vfSBmcm9tIFwiZm9vXCI7XHJcbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6OCwic291cmNlVHlwZSI6Im1vZHVsZSIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6e30sImVudiI6e319fQ==)

## [#9594]: [semi] `beforeStatementContinuationChars`

次の行が ASI ハザードが起こり得る文字で始まり、かつ ASI ハザードが起こらない場合のセミコロンの有無を矯正するためのオプションが追加されました。

ASI ハザードが起こり得る文字には `[` や `(` 等があります。
一方で行がこれらの文字で始まっていたとしても、前の文が `do-while` や `import` 等であった場合は ASI ハザードが発生しません。

このような場合、今まではセミコロンがあっても無くても警告していませんでした。

```js:例
/* eslint semi: [error, never, {beforeStatementContinuationChars: always}] */

//✓ GOOD
do {/* 略 */} while (a)
;[1, 2, 3].forEach(doSomething)

//✘ BAD
do {/* 略 */} while (a)
[1, 2, 3].forEach(doSomething)
```

> [デモを開く](https://eslint.org/demo/#eyJ0ZXh0IjoiLyogZXNsaW50IHNlbWk6IFtlcnJvciwgbmV2ZXIsIHtiZWZvcmVTdGF0ZW1lbnRDb250aW51YXRpb25DaGFyczogYWx3YXlzfV0gKi9cclxuXHJcbi8v4pyTIEdPT0RcclxuZG8gey8qIOeVpSAqL30gd2hpbGUgKGEpXHJcbjtbMSwgMiwgM10uZm9yRWFjaChkb1NvbWV0aGluZylcclxuXHJcbi8v4pyYIEJBRFxyXG5kbyB7Lyog55WlICovfSB3aGlsZSAoYSlcclxuWzEsIDIsIDNdLmZvckVhY2goZG9Tb21ldGhpbmcpIiwib3B0aW9ucyI6eyJwYXJzZXJPcHRpb25zIjp7ImVjbWFWZXJzaW9uIjo4LCJzb3VyY2VUeXBlIjoibW9kdWxlIiwiZWNtYUZlYXR1cmVzIjp7fX0sInJ1bGVzIjp7fSwiZW52Ijp7fX19)

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

## [#9496]: [sort-vars] \(partial)

```js:例
/* eslint sort-vars: error */

var a = 1,
    c = 2,
    b = 3

// Gets fixed to:

var a = 1,
    b = 3,
    c = 2
```

※ 初期値に変数がある場合は自動修正されません。

----

[v4.11.0]: http://qiita.com/mysticatea/items/b7efa8286c2fabc3267f
[v4.13.0]: http://qiita.com/mysticatea/items/6e3631a15537ff8a7e9d
[#9321]: https://github.com/eslint/eslint/issues/9321
[#9496]: https://github.com/eslint/eslint/issues/9496
[#9506]: https://github.com/eslint/eslint/issues/9506
[#9594]: https://github.com/eslint/eslint/issues/9594
[#9629]: https://github.com/eslint/eslint/issues/9629
[#9999]: https://github.com/eslint/eslint/issues/9999
[implicit-arrow-linebreak]: http://eslint.org/docs/rules/implicit-arrow-linebreak
[no-restricted-imports]: http://eslint.org/docs/rules/no-restricted-imports
[semi]: http://eslint.org/docs/rules/semi
[sort-vars]: http://eslint.org/docs/rules/sort-vars
[xxxx]: http://eslint.org/docs/rules/xxxx

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