build: eslint 10 と flat config へ移行する - #31
Merged
Merged
Conversation
eslint 5 は 2019 年で更新が止まっており、その依存木(flat-cache → flatted、 inquirer → external-editor → tmp、glob → minimatch)に新しいアドバイザリが 出るたびに overrides を足す構造になっていた。Dependabot も同じ理由で eslint のメジャー更新を繰り返し提案してくる。 eslint 9 以降は .eslintrc.* を読まないため、eslint.config.js へ移行する。 ルールは .eslintrc.json の内容をそのまま移した。 sourceType は module のまま維持している。コードは CommonJS だが、実態に 合わせて commonjs にすると strict ルールの "function" が「関数内に 'use strict' を書く」要求に変わり、lib と test の全ファイルが違反になる。 require / module は globals.commonjs で補う。 ecmaVersion は 6(旧 env.es6)から latest へ広げた。ここだけは移行前と 挙動が変わる。Node 22 以上を対象にしているリポジトリで、リンタだけが ES2015 構文しか受け付けない状態は参加者の妨げになるため。 overrides は flatted / tmp / eslint スコープの minimatch を削除した。 いずれも eslint 5 の依存木を塞ぐためのもので、根が消えた。espower-loader の minimatch も削除している。espower-loader の宣言は ^3.0.0 で、修正版の 3.1.5 を自然に解決するため override が不要だった。残す diff と serialize-javascript は、mocha 11 の宣言レンジが修正版に届かないため必要。 検証: 旧 eslint 5 + .eslintrc.json と新 eslint 10 + eslint.config.js に 同一の違反コードを通し、報告されたルール ID と件数が一致することを確認した (8 件 / curly, eqeqeq, no-cond-assign, no-eq-null, no-undef, no-unused-vars)。lint スクリプトのグロブが実際に lib と test の 2 ファイルを 拾うことも確認。npm audit 0 件、npm 10.9.8 / 11.17.0 / 11.19.0 で npm ci が 成功する。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
eslint を 5.16.0 から 10.8.1 に上げ、
.eslintrc.jsonをeslint.config.js(flat config)へ移行します。背景
eslint 5 は 2019 年で更新が止まっています。その依存木に新しいアドバイザリが出るたびに Dependabot がアラートを上げ、これまでは
overridesで個別に修正版へ固定してきました。flat-cache→flattedinquirer→external-editor→tmpglob→minimatchDependabot も同じ理由で eslint のメジャー更新を繰り返し提案します(#28 / #29)。ただし Dependabot はバージョン番号を上げるだけで設定ファイルの移行はしないため、その PR をそのままマージすると
.eslintrc.jsonが読まれずnpm run lintが失敗します。lintはpretestなので、CI が丸ごと赤くなります。変更内容
eslintを^10.8.1に更新し、flat config に必要な@eslint/jsとglobalsを追加.eslintrc.jsonを削除し、eslint.config.jsを追加。ルールは既存の内容をそのまま移行overridesからflatted/tmp/ eslint スコープのminimatch/ espower-loader スコープのminimatchを削除設計上の判断
sourceTypeはmoduleのまま維持しています。 コードは CommonJS ですが、実態に合わせてcommonjsにするとstrictルールの"function"が「関数内に'use strict'を書く」要求に変わり、libとtestの全ファイルが違反になります。require/moduleはglobals.commonjsで補っています。ecmaVersionは 6(旧env.es6)からlatestへ広げました。 移行前と挙動が変わるのはここだけです。Node 22 以上を対象にしているリポジトリで、リンタだけが ES2015 構文しか受け付けない状態は参加者の妨げになるためです。overridesの削除根拠。flatted/tmp/ eslint スコープのminimatchは eslint 5 の依存木を塞ぐためのもので、根が消えました。espower-loader のminimatchは、宣言が^3.0.0で修正版の 3.1.5 を自然に解決するため、override 自体が不要でした。残すdiffとserialize-javascriptは、mocha 11 の宣言レンジが修正版に届かないため引き続き必要です。検証
.eslintrc.jsonと新 eslint 10 +eslint.config.jsに同一の違反コードを通し、報告されたルール ID と件数が一致することを確認しました(8 件 /curly,eqeqeq,no-cond-assign,no-eq-null,no-undef,no-unused-vars)lintスクリプトのグロブが実際にlib/sample.jsとtest/SampleTest.jsの 2 ファイルを拾うことを確認npm audit0 件npm ciが成功