ESLint v2.5.0

前 [v2.4.0] | 次 [v2.6.0]

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="en" dir="ltr">ESLint v2.5.0 released: <a href="https://t.co/3nkUPb4Ndw">https://t.co/3nkUPb4Ndw</a><br><br>(This is our 100th release!)</p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/713452130502254592">March 25, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

記念すべき100回目のリリースです。
機能追加とバグ修正が行われました。

- 3つのルールと、2つのオプションが追加されました。
- ~~bundledDependencies を導入しました。~~

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

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

# [#5013]: bundledDependencies を利用するようになった

- **EDIT:** 残念ながら bundledDependencies はいろいろな問題が報告されたため、[v2.5.3] で一旦 Revert されました。伴ってこの Issue [#5013] は Reopen されました。対策検討中です。

先日の騒動[^1]を受けて、依存するパッケージが突然削除されても ESLint 利用者が困らないようにするために、[bundledDependencies] を導入しました。この変更により、ESLint は依存している npm パッケージ群をすべて含む状態でパッケージ化されます。ESLint が依存しているパッケージのいくつかに突然アクセスできなくなったとしても、利用者は ESLint を正常にインストールして実行することができるでしょう。

> ところで、Firefox (Phoenix → Firebird → Firefox) や Jenkins (Hudson → Jenkins) のような前例があるように、オープンソースであろうとも商標問題とは無縁ではいられません。先にあった騒動では、npm は妥当な判断をしたものと考えています。GitHub を去ることを検討して騒がれた ESLint ですが、npm から去る予定はありません。

# [#5522]: OpenSSLを無効化したビルドの Node.js で実行可能になった

ESLint はキャッシュ処理で MD5 ハッシュを計算するために crypto モジュールに依存していました。
標準の Node.js であれば問題ありませんが、OpenSSL を無効化したビルドの Node.js では件のモジュールは利用できません。
そこで、より効率的なハッシュ計算を行うモジュールに置き換えました。

# 新しいルール

## [#3478]: [no-duplicate-imports]

重複する import 文を警告するルールです。

```js
/*eslint no-duplicate-imports: "error"*/

import {readFile} from "fs";
import {writeFile} from "fs"; /*error 'fs' import is duplicated.*/
```

このような import 文は1つにまとめることができます。

```js
/*eslint no-duplicate-imports: "error"*/

import {readFile, writeFile} from "fs";
```

## [#5424]: [max-statements-per-line]

1行に書くことができる文の数を制限するルールです。
例えば、最大1個に制限すると、次のようなコードが警告されます。

```js
/*eslint max-statements-per-line: "error"*/

var bar; var baz;    /*error This line has too many statements. Maximum allowed is 1.*/
```

## [#5460]: [no-useless-escape]

文字列リテラルと正規表現リテラルの中にある、不必要なエスケープ シーケンスを警告するルールです。

```js
/*eslint no-useless-escape: "error"*/

let foo = "th\is is a pen";    /*error Unnecessary escape character: \i*/
let pattern = /(a\@b)/;        /*error Unnecessary escape character: \@*/
```

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

## [#3837]: [no-unused-vars]

`catch`句の例外変数が未使用の場合に警告するためのオプションが追加されました。
今まで、何故か無視されていたんですよね。

```js
/*eslint no-unused-vars: ["error", {caughtErrors: "all"}]*/

try {
    doSomething();
} catch (err) {    /*error 'err' is defined but never used*/
    // ignore
}
```

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

単項演算子とオペランドの間のスペースを矯正するルールです。
これまでも英単語の演算子(`delete`等)と記号の演算子(`+`等)を個別に設定できましたが、このバージョンから演算子毎に個別に設定を変えることができるようになりました。

例えば、以下のように `!` の後にスペースを強制することができます。

```js
/*eslint space-unary-ops: ["error", {overrides: {"++": false, "!": true}}]*/

++foo;
!bar;    /*error Unary operator '!' must be followed by whitespace.*/
```

----

[^1]: [kik, left-pad, and npm](http://blog.npmjs.org/post/141577284765/kik-left-pad-and-npm)

[v2.4.0]: http://qiita.com/mysticatea/items/c95a7b769a5f11b518ea
[v2.6.0]: http://qiita.com/mysticatea/items/0242786a3746c2c0d078
[bundledDependencies]: https://docs.npmjs.com/files/package.json#bundleddependencies
[v2.5.3]: http://eslint.org/blog/2016/03/eslint-v2.5.3-released
[no-duplicate-imports]: http://eslint.org/docs/rules/no-duplicate-imports
[max-statements-per-line]: http://eslint.org/docs/rules/max-statements-per-line
[no-useless-escape]: http://eslint.org/docs/rules/no-useless-escape
[no-unused-vars]: http://eslint.org/docs/rules/no-unused-vars
[space-unary-ops]: http://eslint.org/docs/rules/space-unary-ops
[#3478]: https://github.com/eslint/eslint/issues/3478
[#3837]: https://github.com/eslint/eslint/issues/3837
[#5013]: https://github.com/eslint/eslint/issues/5013
[#5060]: https://github.com/eslint/eslint/issues/5060
[#5424]: https://github.com/eslint/eslint/issues/5424
[#5460]: https://github.com/eslint/eslint/issues/5460
[#5522]: https://github.com/eslint/eslint/issues/5522