ESLint v3.10.0

前 [v3.9.0] | 次 [v3.11.0]

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

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

マイナーバージョンが2桁になると、次のメジャーバージョンが近いなぁって思えますね (隔週リリースで6ヶ月間あると12前後まで上がる)。
4.0.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)

----

# :bulb: 新しいルール

## [#7537]: [no-return-await]

安全に削除できる (冗長な) `await`文を禁止するルールです。
`async`関数では戻り値の`Promise`が自動的に unwrap されるため、`return`文の中で`await`式を使う必要はありません。

```js:例
/*eslint no-useless-return: error */

//✔ GOOD
async function foo() {
    return doSomething()
}
async () => doSomething()

//✘ BAD
async function foo() {
    return await doSomething()
}
async () => await doSomething()
```

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

## [#6963]: [no-restricted-imports] and [no-restricted-modules]

.gitignore と同様のパターン表現で禁止するモジュールを指定できるようになりました。

```js:例
/*eslint no-restricted-modules: [error, {patterns: ["foo/*"]}] */

//✔ GOOD
const abc = require("abc")
const foo = require("foo")

//✘ BAD
const bar = require("foo/bar")
```

## [#7235]: [func-names]

「自動的に関数名が決まらない場合には明示的に関数名を書け」というオプションが追加されました。
自動的に関数名が決まるのは、変数への代入やオブジェクトリテラルの中などです。

Dr. Axel の解説が詳しいです: http://www.2ality.com/2015/09/function-names-es6.html

```js:例
/*eslint func-names: [error, as-needed] */

//✔ GOOD
const aaa = function() {}
bbb = function() {}
const obj = {
    ccc: function() {}
}
obj.ddd = function ddd() {}
foo(function eee() {})
;(function fff() { })()

//✘ BAD
obj.ddd = function() {}
foo(function() {})
;(function() { })()
```

## [#7470]: [comma-style]

カンマを行末に書くか、行頭に書くかを指定するスタイル ルールにおいて、チェックする場所を増やすオプションが追加されました。

従来は、変数宣言・オブジェクトリテラル・配列リテラルの3箇所をチェックしていましたが、オプションによって次の場所をチェックすることができるようになります。

- Destructring のオブジェクトパターン
- Destructring の配列パターン
- 関数宣言の仮引数
- 関数呼び出しの実引数
- `import`文

> :thought_balloon: あれ、`export`文がない...

現時点ではオプションによる指定が必要ですが、4.0.0 でデフォルト有効になる予定です。

```js:例
/*eslint comma-style: [error, last, {exceptions: {
    ArrayPattern: false,
    ArrowFunctionExpression: false,
    CallExpression: false,
    FunctionDeclaration: false,
    FunctionExpression: false,
    ImportDeclaration: false,
    ObjectPattern: false
}}] */

//✔ GOOD
const {
    a,
    b
} = obj
const [
    a,
    b
] = list
function foo(
    a,
    b
) {}

//✘ BAD
const {
    a
  , b
} = obj
const [
    a
  , b
] = list
function foo(
    a
  , b
) {}
```

## [#7518]: [require-jsdoc]

JSDoc コメントが書かれていない Arrow 関数を警告するオプションが追加されました。

```js:例
/*eslint require-jsdoc: [error, {require: {ArrowFunctionExpression: true}}] */

//✔ GOOD
/**
 * @returns {number} 10
 */
const foo = () => {
    return 10
}

// 変数へ代入されない場合は無視します
foo(() => 10)

//✘ BAD
const foo = () => {
    return 10
}
```

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

## [#7387]: [no-extra-boolean-cast]

```js:例
if (!!foo);
if (Boolean(bar));
Boolean(!!baz);

// ↓↓↓

if (foo);
if (bar);
Boolean(baz);
```

## [#7389]: [eqeqeq]

確実にコードの意味を変更しない場合だけ自動修正します。
つまり、`==`演算子の左右の値の型が判明していて、かつ等しい場合です。

```js:例
typeof foo == 'bar'
1 == 1

// ↓↓↓

typeof foo === 'bar'
1 === 1
```

[v3.9.0]: http://qiita.com/mysticatea/items/abc7885b373b5b37ce97
[v3.11.0]: http://qiita.com/mysticatea/items/0fb717830e1b62575525
[#6963]: https://github.com/eslint/eslint/issues/6963
[#7235]: https://github.com/eslint/eslint/issues/7235
[#7470]: https://github.com/eslint/eslint/issues/7470
[#7518]: https://github.com/eslint/eslint/issues/7518
[#7537]: https://github.com/eslint/eslint/issues/7537
[#7387]: https://github.com/eslint/eslint/issues/7387
[#7389]: https://github.com/eslint/eslint/issues/7389
[#9999]: https://github.com/eslint/eslint/issues/9999
[comma-style]: http://eslint.org/docs/rules/comma-style
[eqeqeq]: http://eslint.org/docs/rules/eqeqeq
[func-names]: http://eslint.org/docs/rules/func-names
[no-extra-boolean-cast]: http://eslint.org/docs/rules/no-extra-boolean-cast
[no-restricted-imports]: http://eslint.org/docs/rules/no-restricted-imports
[no-restricted-modules]: http://eslint.org/docs/rules/no-restricted-modules
[no-return-await]: http://eslint.org/docs/rules/no-return-await
[require-jsdoc]: http://eslint.org/docs/rules/require-jsdoc
[xxxx]: http://eslint.org/docs/rules/xxxx