.eslintrc がネスト構造で複数配置されている場合どのように解決されるか

確認したレベルでは「各セクション毎にマージされる」です。

調べる

例えばモノレポなどでルート.eslintrcを1つ置き、各ワークスペースにも.eslintrcを置いているとします。

# tree
.
├── ...
├── .eslintrc
└── packages
    └── foo
        ├── ...
        └── .eslintrc

ルートの設定

ルートの設定は適当にこんな感じにしました。

{
  "root": true,
  "env": {
    "browser": false,
    "node": false
  },
  "rules": {
    "no-unused-vars": 0,
    "eqeqeq": 0
  }
}

ワークスペースの設定

上記でのpackages/foo/.eslintrcをこのようにしました。

{
  "env": {
    "node": true
  },
  "rules": {
    "no-unused-vars": 2
  }
}

さて、ここでpackages/foo以下のファイルへの設定は考えられるもので、

  • マージされる(完全に置き換わる)
  • 各セクションレベルでマージされる(ディープマージ)

どれが正解なのかという疑問がでてきました。

調べる

対象のファイルへ適用される設定を調べるには--print-configオプションが使えます。

ルートで、

eslint --print-config packages/foo/foo.js

結果はこうでした。(envrules以外のセクションは削除してます)

{
  "env": {
    "browser": false,
    "node": true
  },
  "rules": {
    "no-unused-vars": 2,
    "eqeqeq": 0
  },
  "root": true
}

完全に置き換えたい

そんな時は子.eslintrcroot:trueを追加します。実は ESLint はルート設定まで遡り設定をディープマージしていくような動作をします。これがroot:trueにより「自分自身ファイルがルートです」となることでで親設定を拾わず、それだけの設定にすることができます。

{
  "root": true,
  "env": {
    "node": true
  },
  "rules": {
    "no-unused-vars": 2
  }
}

結果。

{
  "env": {
    "node": true
  },
  "rules": {
    "no-unused-vars": 2
  },
  "root": true
}