🐱
lint-staged × ESLintの--max-warnings=0をつけてコミットできなくなったときの対処法
はじめに
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 に書かれている内容を試すとコミットできるようになった。
具体的には.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に含まれているファイルをコミットすることができたら成功です 👍
参考
Discussion