🐱

lint-staged × ESLintの--max-warnings=0をつけてコミットできなくなったときの対処法

2021/09/22に公開

はじめに

husky と lint-staged を使ってコミット前に ESLint を走らせるようにした。
しかし、ESLint のオプション--max-warnings=0がついているかつステージングのファイルが.eslintignoreに含まれている場合にコミットできなくなったので、
対処法をメモ。

前提条件

ESLint, husky, lint-staged の設定済み

ESLint: v7.30.0
lint-staged: v11.1.2
husky: 7.0.2

package.json
"scripts": {
  ...,
  "prepare": "husky install",
  "lint-staged": "lint-staged"
},
"lint-staged": {
    "*.{js,ts,jsx,tsx}": [
      "eslint --max-warnings=0 ."
    ]
  },
.eslintignore
src/test.ts
src/test.ts
import { Hoge } from './hoge';
export const hogehoge = () => {}

前提条件の状態でコミットを試みる

前提条件にあるsrc/test.tsをコミットしようとすると下記の Warning が表示されコミットできない。

0:0 warning File ignored because of a matching ignore pattern. Use "--no-ignore" to override

.eslintignoreに設定されているファイルをコミットしようとすると、上記の Warning が発生しそれが--max-warnings=0にひっかかっているのか?
原因はわからないが、.eslintignoreに設定されているファイルを--max-warnings=0で ESLint を実行するとダメなようだ。

対処法

lint-staged の README に書かれている内容を試すとコミットできるようになった。

https://github.com/okonet/lint-staged#how-can-i-ignore-files-from-eslintignore

具体的には.lintstagedrc.jsに下記のソースを追加し、lint-staged に読み込ませることで対処が可能。

ESLint のバージョン >= 7

.lintstagedrc.js
const { ESLint } = require('eslint')

const removeIgnoredFiles = async (files) => {
  const eslint = new ESLint()
  const isIgnored = await Promise.all(
    files.map((file) => {
      return eslint.isPathIgnored(file)
    })
  )
  const filteredFiles = files.filter((_, i) => !isIgnored[i])
  return filteredFiles.join(' ')
}

module.exports = {
  '**/*.{ts,tsx,js,jsx}': async (files) => {
    const filesToLint = await removeIgnoredFiles(files)
    return [`eslint --max-warnings=0 ${filesToLint}`]
  },
}

ESLint のバージョン < 7

.lintstagedrc.js
const { CLIEngine } = require('eslint')

const cli = new CLIEngine({})

module.exports = {
  '*.js': (files) =>
    'eslint --max-warnings=0 ' + files.filter((file) => !cli.isPathIgnored(file)).join(' '),
}
package.json
"scripts": {
  ...,
  "lint-staged": "lint-staged --config .lintstagedrc.js"
},

原理はよくわかってないが、.eslintignore対象のファイルを除外して ESLint を実行してるってことなのかな。

これで.eslintignoreに含まれているファイルをコミットすることができたら成功です 👍

参考

https://github.com/okonet/lint-staged#how-can-i-ignore-files-from-eslintignore

GitHubで編集を提案

Discussion