ESLint v3.17.0

前 [v3.16.0] | 次 [v3.18.0]

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

ESLint 3.17.0 がリリースされました。
いくつかの機能追加・バグ修正が行われています。

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

- :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)

----

# ✨ 本体の変更

## [#7837]: `RuleTester` の警告メッセージ検証で正規表現が使えるようになった

プラグイン・カスタム ルール開発者向けです。

ルールのユニットテストでは、出力される警告メッセージが妥当かどうかを、固定文字列との比較によって検査しています。

```js:例
tester.run("eqeqeq", eqeqeq, {
    valid: [
        {
            code: "foo === bar"
        }
    ],
    invalid: [
        {
            code: "foo == bar",
            errors: ["Expected '===' and instead saw '=='."]
        }
    ]
})
```

大半のケースではこれで十分なのですが、ファイルパスが警告メッセージに含まれる場合にテストが書きにくいという問題があります。
今回これを解決するために、正規表現でも警告メッセージを検査できるようになりました。

```js:例
tester.run("eqeqeq", eqeqeq, {
    invalid: [
        {
            code: "foo == bar",
            errors: [/^Expected '===' and instead saw '=='\.$/]
        }
    ]
})
```

## [#8073]: AST ノード・トークンの位置情報に関する API を追加

プラグイン・カスタム ルール開発者向けです。

AST ノードの位置情報には2種類あります。1つは行番号・列番号で、もう1つはソースコードを文字配列にした時の添字です。ESLint では、目的に応じてこの2つの位置情報を使い分けています。

で。まれにこれらの位置情報を相互変換したいことがあったため、相互変換のための API が追加されました。

```ts
class SourceCode {
  // Converts a character index in a source file into a line, column pair
  getLocationFromRangeIndex(index: number): { line: number, column: number }

  // Converts a line, column pair into a character index in a file
  getRangeIndexFromLocation(loc: { line: number, column: number }): number
}
```

## [#8157]: `RuleTester`の自動修正に関するテストの改善

プラグイン・カスタム ルール開発者向けです。

自動修正をサポートするルールも、自動修正を実施しないケースがあります。
例えば、自動修正を適用すると開発者が書いたコメント (`//FIXME: hoge!`等) を消してしまう場合などは、自動修正を実施しません。
ユニットテストでは、入力コードと出力コードをまったく同じにすることで表現していました。

```js:例
tester.run("no-unused-labels", rule, {
    invalid: [
        {
            code: "A: var foo = 0;",
            output: "var foo = 0;",
            errors: ["'A:' is defined but never used."]
        },
        {
            code: "A: /* comment */ foo",
            output: "A: /* comment */ foo",
            errors: ["'A:' is defined but never used."]
        },
    ]
})
```

今回、出力コードを `null` にした場合は自動修正しないと見做すようになりました。より DRY にテストを書けるようになります。

```js:例
tester.run("no-unused-labels", rule, {
    invalid: [
        {
            code: "A: var foo = 0;",
            output: "var foo = 0;",
            errors: ["'A:' is defined but never used."]
        },
        {
            code: "A: /* comment */ foo",
            output: null,
            errors: ["'A:' is defined but never used."]
        },
    ]
})
```

# 💡 新しいルール

## [#6067]: [nonblock-statement-body-position]

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

本文がブロックではない制御構文 (`if`等) について、本文を書く位置を矯正するスタイル・ルールです。
オプションによって、右側・下側を指定することができます。

```js:例.(beside)
/*eslint nonblock-statement-body-position: [error, beside] */

//✘ BAD
if (foo)
  bar();
else
  baz();

//✔ GOOD
if (foo) bar();
else baz();
```

```js:例.(below)
/*eslint nonblock-statement-body-position: [error, below] */

//✘ BAD
if (foo) bar();
else baz();

//✔ GOOD
if (foo)
  bar();
else
  baz();
```

## [#8091]: [no-compare-neg-zero]

`-0` (マイナス ゼロ) との比較を警告するルールです。
JavaScript では、`-0`と`+0`を比較すると等価として扱われますが、一部の演算は異なる結果になります。大半のケースでは問題ありませんが、まれに`-0`を識別したいことがあるようです。そんな時に`x === -0`等と比較すると、`-0`と`+0`を区別できません。代わりに`Object.is(x, -0)`を使う必要があります。

```js:例.(below)
/*eslint no-compare-neg-zero: error */

//✘ BAD
x === -0
y !== -0

//✔ GOOD
x === 0
Object.is(x, -0)
```

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

## [#4345]: [lines-around-comment] \(`ignorePattern`)

特定のコメントには周囲の改行をチェックしないよう無視するオプションが追加されました。
デフォルトでは `/*eslint eqeqeq: error */` 等のコメントが無視リストに含まれます。

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

今回はありません。

----

[v3.16.0]: http://qiita.com/mysticatea/items/df57e95ff98c04ef024c
[v3.18.0]: http://qiita.com/mysticatea/items/264e59b3d28e13b633df
[#4345]: https://github.com/eslint/eslint/issues/4345
[#6067]: https://github.com/eslint/eslint/issues/6067
[#7837]: https://github.com/eslint/eslint/issues/7837
[#8073]: https://github.com/eslint/eslint/issues/8073
[#8091]: https://github.com/eslint/eslint/issues/8091
[#8157]: https://github.com/eslint/eslint/issues/8157
[#9999]: https://github.com/eslint/eslint/issues/9999
[lines-around-comment]: http://eslint.org/docs/rules/lines-around-comment
[no-compare-neg-zero]: http://eslint.org/docs/rules/no-compare-neg-zero
[nonblock-statement-body-position]: http://eslint.org/docs/rules/nonblock-statement-body-position
[xxxx]: http://eslint.org/docs/rules/xxxx

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