Skip to content

build: eslint 10 と flat config へ移行する - #31

Merged
shishi merged 1 commit into
masterfrom
eslint-flat-config
Aug 21, 2026
Merged

build: eslint 10 と flat config へ移行する#31
shishi merged 1 commit into
masterfrom
eslint-flat-config

Conversation

@shishi

@shishi shishi commented Aug 21, 2026

Copy link
Copy Markdown
Member

概要

eslint を 5.16.0 から 10.8.1 に上げ、.eslintrc.jsoneslint.config.js(flat config)へ移行します。

背景

eslint 5 は 2019 年で更新が止まっています。その依存木に新しいアドバイザリが出るたびに Dependabot がアラートを上げ、これまでは overrides で個別に修正版へ固定してきました。

  • flat-cacheflatted
  • inquirerexternal-editortmp
  • globminimatch

Dependabot も同じ理由で eslint のメジャー更新を繰り返し提案します(#28 / #29)。ただし Dependabot はバージョン番号を上げるだけで設定ファイルの移行はしないため、その PR をそのままマージすると .eslintrc.json が読まれず npm run lint が失敗します。lintpretest なので、CI が丸ごと赤くなります。

変更内容

  • devDependencies: eslint^10.8.1 に更新し、flat config に必要な @eslint/jsglobals を追加
  • .eslintrc.json を削除し、eslint.config.js を追加。ルールは既存の内容をそのまま移行
  • overrides から flatted / tmp / eslint スコープの minimatch / espower-loader スコープの minimatch を削除

設計上の判断

sourceTypemodule のまま維持しています。 コードは CommonJS ですが、実態に合わせて commonjs にすると strict ルールの "function" が「関数内に 'use strict' を書く」要求に変わり、libtest の全ファイルが違反になります。require / moduleglobals.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 自体が不要でした。残す diffserialize-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/sample.jstest/SampleTest.js の 2 ファイルを拾うことを確認
  • npm audit 0 件
  • CI が使う npm 10.9.8 / 11.17.0 / 11.19.0 のいずれでも npm ci が成功
  • CI: 22.x / 24.x / 26.x すべてグリーン

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 が
成功する。
@shishi
shishi merged commit 06a3d80 into master Aug 21, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant