ESLintは最近勢いがある、JavaScriptのLinterです。
要するに
JSHintのAPIへの悲しみ、それらが一通り解決されているESLintへの感謝です。
JSHint APIの謎
JSHintをNode.jsプログラム中から使うためのAPIの話です。
サンプルコード
var source = [
'function goo() {}',
'foo = 3;'
];
var options = {
undef: true
};
var predef = {
foo: false
};
JSHINT(source, options, predef);
console.log(JSHINT.data());
戻り値がない
JSHINT関数の結果は戻り値で取得できません。
なぜか結果を状態で持ちます。
つまり並列実行可能かどうかは実装を見て確認しないといけません。
複数回実行した結果を積算しない
結果を戻り値で返さないなら複数回JSHINT関数を実行した場合に、結果を積み上げていくのでしょうか?
必要なシチュエーションは思いつきませんが、APIとしては妥当そうです。
実際はそんなことはありません。
サンプルコード
エラー結果から対応するルールがわからない
codeという人間に優しくない参考情報は出ますが、ルールそのものの名前は出ません。
エラーが大量に出るルールを無効にして、緩めのルールからLintを使い始めたい気持ちがあります。
その需要に直接的な参考情報を返すことができません。
[
{
id: '(error)',
raw: 'Read only.',
code: 'W020',
evidence: 'foo = 3;',
line: 2,
character: 1,
scope: '(main)',
a: undefined,
b: undefined,
c: undefined,
d: undefined,
reason: 'Read only.'
}
]
外部ドキュメントがあれば、まだいいのですが・・・なさそうです。
ソースコード上にcodeに対応するメッセージ一覧はあります。
定義済み変数の指定がオブジェクト
var predef = {
foo: false
};
値にfalse以外を指定することがあるのでしょうか?
複数指定する場合に配列にしたくあります。
predef = ['_', 'alert', 'toastr', 'self', 'jsPlumb', 'Promise']
.reduce((a, b) => {
a[b] = true
return a
}, {})
ESLintの素晴らしさ
以上の背景を踏まえた上でESLintのAPIドキュメントを読みます。
結果が戻り値で帰ってきます
var linter = require("eslint").linter;
var messages = linter.verify("var foo;", {
rules: {
semi: 2
}
}, "foo.js");
結果にruleIdが含まれています
{
fatal: false,
severity: 2,
ruleId: "semi",
severity: 2,
line: 1,
column: 23,
message: "Expected a semicolon.",
fix: {
range: [1, 15],
text: ";"
}
}
定義済み変数は配列で指定します
An array of global variables to declare (default: empty array).
感想
早くJSHintからESLintに移行したくあります。
ただ、安易な気持ちでESLintをコマンドライン実行したら
✖ 1352 problems (1352 errors, 0 warnings)
と出てきて心が折れそうです!