🤦‍♂️

ESLint v8.56.0 の `reportUnusedDisableDirectives` とは何か?

2023/12/25に公開

この記事は Cybozu Frontend Advent Calendar 2023 の 24 日目の記事です。

先日リリースされた ESLint v8.56.0 でオプション reportUnusedDisableDirectives が改善された話です。

https://eslint.org/blog/2023/12/eslint-v8.56.0-released/

元々どういうオプションだった?

// eslint-disable-line みたいなルール無効化ディレクティブを書いたけど、しばらくして何かしらのコード修正の影響でもうそのルール違反は発生しなくなって、でも無効化ディレクティブは消し忘れて無駄に残っている、みたいな状態は起こりがちです。

例えば以下のように non null assertion (!) が一時的に必要になって disable したけど、

// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
foo(bar!);

のちにコードを修正して ! は不要になったので消したけど、disable は消し忘れてるという状態。

// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
foo(bar);

そういうケースに対して、従来から reportUnusedDisableDirectives オプションtrue にすることで警告を表示することができました。

ただし、警告にはできるけど、エラーにはできないため、こういうケースを CI で落とそうとすると面倒でした。

これをエラーにできるプラグインルール eslint-comments/no-unused-disable もよく使われていたんだけど、これはハッキーな実装で実現されているものだったので、新しい Flat Config では使えないなど困った状況でした。

https://github.com/eslint-community/eslint-plugin-eslint-comments/issues/133

どう改善された?

警告だけじゃなく、エラーなどの severity を指定できるような RFC が提案されて、v8.56.0 でリリースされました。

https://github.com/eslint/rfcs/tree/main/designs/2022-unused-disable-directive-flexible-config

https://github.com/eslint/eslint/pull/17212

つまり flat config なら以下のように書けばエラーにできます。

{
  "linterOptions": {
    // 従来 true/false のみしか指定できなかった
    "reportUnusedDisableDirectives": "error"
  }
}

他に CLI オプションにも --report-unused-disable-directives-severity が追加されて指定可能になっているので必要ならどうぞ。

まとめ

とりあえず設定ファイルで error に設定するで良いかと。eslint-plugin-seslint-comments の方は無効化しときましょう。

また一歩、Flat Config の世界が近づきましたね。

Discussion