ESLint v5.3.0

前 [v5.2.0] | 次 [v5.4.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v5.3.0 has been released: <a href="https://t.co/qu3OgY0CDK">https://t.co/qu3OgY0CDK</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1025569046958202881?ref_src=twsrc%5Etfw">2018年8月4日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

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

正規表現に関する2つのルールと非同期処理に関する2つのルールが追加されています。

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

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

# 🚀 本体への機能追加

特になし。

# 💡 新しいルール

## [#10511]: [no-misleading-character-class]

複数のコードポイントから構成される文字を文字クラス構文 (例: `/[👍🏻]/u`) で利用したときに警告するルールです。これは、JavaScript の正規表現が複数のコードポイントから構成される文字を期待通りに扱えないためです。

例えば、絵文字 👍🏻 は絵文字 👍 (U+1F44D) と肌色セレクタ 🏻 (U+1F3FB) の2つのコードポイントから構成されます。文字クラス構文にこの文字を書く (`/[👍🏻]/u`) と、👍 (U+1F44D) または 🏻 (U+1F3FB) のどちらかにマッチする正規表現になります。

なお、これはサロゲートペア (1つのコードポイントを複数のコードユニットで表現したもの) とは別の概念です。JavaScript 正規表現は (`u`フラグを付与することで) サロゲートペアを正しく扱えます。

```js:例
/*eslint no-misleading-character-class: error */

// 結合文字 (アクセント、異体字セレクタ等):
/^[Á]$/u.test("Á"); //→ false
/^[❇️]$/u.test("❇️"); //→ false

// 絵文字と肌色セレクタのセット:
/^[👶🏻]$/u.test("👶🏻"); //→ false
/^[👶🏽]$/u.test("👶🏽"); //→ false

// 国旗:
/^[🇯🇵]$/u.test("🇯🇵"); //→ false

// ZWJ を含むグラフィムクラスタ:
/^[👨‍👩‍👦]$/u.test("👨‍👩‍👦"); //→ false

// UTF16 サロゲートペア (u フラグがない場合):
/^[👍]$/.test("👍"); //→ false
```

> [Open online demo](https://eslint.org/demo/#eyJ0ZXh0IjoiLyplc2xpbnQgbm8tbWlzbGVhZGluZy1jaGFyYWN0ZXItY2xhc3M6IGVycm9yICovXHJcblxyXG4vLyDntZDlkIjmloflrZcgKOOCouOCr+OCu+ODs+ODiOOAgeeVsOS9k+Wtl+OCu+ODrOOCr+OCv+etiSk6XHJcbi9eW0HMgV0kL3UudGVzdChcIkHMgVwiKTsgLy/ihpIgZmFsc2VcclxuL15b4p2H77iPXSQvdS50ZXN0KFwi4p2H77iPXCIpOyAvL+KGkiBmYWxzZVxyXG5cclxuLy8g57W15paH5a2X44Go6IKM6Imy44K744Os44Kv44K/44Gu44K744OD44OIOlxyXG4vXlvwn5G28J+Pu10kL3UudGVzdChcIvCfkbbwn4+7XCIpOyAvL+KGkiBmYWxzZVxyXG4vXlvwn5G28J+PvV0kL3UudGVzdChcIvCfkbbwn4+9XCIpOyAvL+KGkiBmYWxzZVxyXG5cclxuLy8g5Zu95peXOlxyXG4vXlvwn4ev8J+HtV0kL3UudGVzdChcIvCfh6/wn4e1XCIpOyAvL+KGkiBmYWxzZVxyXG5cclxuLy8gWldKIOOCkuWQq+OCgOOCsOODqeODleOCo+ODoOOCr+ODqeOCueOCvzpcclxuL15b8J+RqOKAjfCfkanigI3wn5GmXSQvdS50ZXN0KFwi8J+RqOKAjfCfkanigI3wn5GmXCIpOyAvL+KGkiBmYWxzZVxyXG5cclxuLy8gVVRGMTYg44K144Ot44Ky44O844OI44Oa44KiICh1IOODleODqeOCsOOBjOOBquOBhOWgtOWQiCk6XHJcbi9eW/CfkY1dJC8udGVzdChcIvCfkY1cIik7IC8v4oaSIGZhbHNlXHJcbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6OSwic291cmNlVHlwZSI6Im1vZHVsZSIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6e30sImVudiI6e319fQ==)

## [#10655]: [require-atomic-updates]

アトミックではない変数の書き換えを警告するルールです。詳しくは[以前に書いた記事](https://qiita.com/mysticatea/items/a7fe7d14fb91c51e3401)を御覧ください。

```js:例
/*eslint require-atomic-updates: error */

async function getFileSize(fileList) {
    let size = 0

    await Promise.all(
        fileList.map(async (file) => {
            size += (await fs.promises.stat(file)).size
        })
    )

    return size
}
```

> [Open online demo](https://eslint.org/demo/#eyJ0ZXh0IjoiLyplc2xpbnQgcmVxdWlyZS1hdG9taWMtdXBkYXRlczogZXJyb3IgKi9cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVTaXplKGZpbGVMaXN0KSB7XHJcbiAgICBsZXQgc2l6ZSA9IDBcclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICBmaWxlTGlzdC5tYXAoYXN5bmMgKGZpbGUpID0+IHtcclxuICAgICAgICAgICAgc2l6ZSArPSAoYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlKSkuc2l6ZVxyXG4gICAgICAgIH0pXHJcbiAgICApXHJcblxyXG4gICAgcmV0dXJuIHNpemVcclxufVxyXG4iLCJvcHRpb25zIjp7InBhcnNlck9wdGlvbnMiOnsiZWNtYVZlcnNpb24iOjksInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)

## [#10661]: [no-async-promise-executor]

`Promise`コンストラクタの引数に async 関数式を与えたときに警告するルールです。

えーと、うーん?

```js:例
/*eslint no-async-promise-executor: error */

let p = new Promise(async (resolve) => {
    // do something.
})
```

> [Open online demo](https://eslint.org/demo/#eyJ0ZXh0IjoiLyplc2xpbnQgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvcjogZXJyb3IgKi9cclxuXHJcbmxldCBwID0gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcclxuICAgIC8vIGRvIHNvbWV0aGluZy5cclxufSlcclxuIiwib3B0aW9ucyI6eyJwYXJzZXJPcHRpb25zIjp7ImVjbWFWZXJzaW9uIjo5LCJzb3VyY2VUeXBlIjoibW9kdWxlIiwiZWNtYUZlYXR1cmVzIjp7fX0sInJ1bGVzIjp7fSwiZW52Ijp7fX19)

## [#10698]: [require-unicode-regexp]

正規表現に必ず`u`フラグを付けるよう矯正するルールです。

正規表現の`u`フラグには、2つの重要な効果があります。

1. UTF-16 サロゲートペアを正しく扱えるようにする。
2. 構文エラーを正しく投げるようになる。

歴史的経緯から、JavaScript の正規表現は構文エラーに寛容です。例えば `/\w{1,2/` には構文エラーがありますが、JavaScript はエラーを投げません。代わりに `"a{1,2"` のような文字列にマッチします。

`u`フラグをつけることで、このような構文エラーを持つ正規表現が正しく`SyntaxError`を投げるようになり、バグの発見に役立ちます。

```js:例
/*eslint require-unicode-regexp: error */

//✗ BAD
{
    const a = /aaa/
    const b = /bbb/gi
    const c = new RegExp("ccc")
    const d = new RegExp("ddd", "gi")
}

//✓ GOOD
{
    const a = /aaa/u
    const b = /bbb/giu
    const c = new RegExp("ccc", "u")
    const d = new RegExp("ddd", "giu")
}
```

> [Open online demo](https://eslint.org/demo/#eyJ0ZXh0IjoiLyplc2xpbnQgcmVxdWlyZS11bmljb2RlLXJlZ2V4cDogZXJyb3IgKi9cclxuXHJcbi8v4pyXIEJBRFxyXG57XHJcbiAgICBjb25zdCBhID0gL2FhYS9cclxuICAgIGNvbnN0IGIgPSAvYmJiL2dpXHJcbiAgICBjb25zdCBjID0gbmV3IFJlZ0V4cChcImNjY1wiKVxyXG4gICAgY29uc3QgZCA9IG5ldyBSZWdFeHAoXCJkZGRcIiwgXCJnaVwiKVxyXG59XHJcblxyXG4vL+KckyBHT09EXHJcbntcclxuICAgIGNvbnN0IGEgPSAvYWFhL3VcclxuICAgIGNvbnN0IGIgPSAvYmJiL2dpdVxyXG4gICAgY29uc3QgYyA9IG5ldyBSZWdFeHAoXCJjY2NcIiwgXCJ1XCIpXHJcbiAgICBjb25zdCBkID0gbmV3IFJlZ0V4cChcImRkZFwiLCBcImdpdVwiKVxyXG59XHJcbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6OSwic291cmNlVHlwZSI6Im1vZHVsZSIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6e30sImVudiI6e319fQ==)

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

特になし。

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

特になし。

# ⚠️ 非推奨になったルール

特になし。

[v5.2.0]: http://qiita.com/mysticatea/items/0ed7fbb74dc31a65cdc2
[v5.4.0]: http://qiita.com/mysticatea/items/39364e1a26cb16103427
[#10511]: https://github.com/eslint/eslint/issues/10511
[#10655]: https://github.com/eslint/eslint/issues/10655
[#10661]: https://github.com/eslint/eslint/issues/10661
[#10698]: https://github.com/eslint/eslint/issues/10698
[#9999]: https://github.com/eslint/eslint/issues/9999
[no-misleading-character-class]: http://eslint.org/docs/rules/no-misleading-character-class
[require-atomic-updates]: http://eslint.org/docs/rules/require-atomic-updates
[no-async-promise-executor]: http://eslint.org/docs/rules/no-async-promise-executor
[require-unicode-regexp]: http://eslint.org/docs/rules/require-unicode-regexp
[xxxx]: http://eslint.org/docs/rules/xxxx

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