JavaScript
Node.js
ESLint

v5.2.0 | 次 (2018/08/18 JST)

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

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

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

🏢 日本語 Issue 管理リポジトリ
👫 日本語サポート チャット
🏢 本家リポジトリ
👫 本家サポート チャット

🚀 本体への機能追加

特になし。

💡 新しいルール

#10511: no-misleading-character-class

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

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

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

/*eslint no-misleading-character-class: error */

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

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

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

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

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

Open online demo

#10655: require-atomic-updates

アトミックではない変数の書き換えを警告するルールです。詳しくは以前に書いた記事を御覧ください。

/*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

#10661: no-async-promise-executor

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

えーと、うーん?

/*eslint no-async-promise-executor: error */

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

Open online demo

#10698: require-unicode-regexp

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

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

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

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

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

/*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

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

特になし。

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

特になし。

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

特になし。