JavaScriptの強力なLintツールであるESLintが先頃、バージョン6.7.0をリリースした。今回のリリースでは、手操作によるLint提案を行うSuggestion APIと、ESLintが無視するファイルをコントロールするための"ignorePatterns"設定プロパティが新たに提供されている。
ESLint 6.7.0では、"--fix"コマンドによってコードの実行動作が変更された場合、あるいはルールを修正する有効な方法が複数存在する場合には、"context.resport()"で別の"suggest"選択肢を提供することによる対応が行われる。このオプションを使用すれば、IDEやコードエディタなど他のツールがヘルパを提供して、提案を手作業で選択する操作が可能になる。
開発者はsuggestionオブジェクトの配列を使って、レポート引数に"suggest"キーで提案を埋め込むことができる。suggestionオブジェクトは適用可能な個々の提案を表現するもので、その提案を適用する効果を説明する"desc"キー文字列あるいは"messageId"キーのいずれかと、提案の結果を定義した関数である"fix"キーが必要である。
context.report({
node: node,
message: "Unnecessary escape character: \\{{character}}.",
data: { character },
suggest: [
{
desc: "Remove the `\\`. This maintains the current functionality.",
fix: function(fixer) {
return fixer.removeRange(range);
}
},
{
desc: "Replace the `\\` with `\\\\` to include the actual backslash character.",
fix: function(fixer) {
return fixer.insertTextBeforeRange(range, "\\");
}
}
]
});
"ignorePatterns"オプションをコンフィギュレーションに設定することで、特定のファイルおよびディレクトリを無視するように、ESListに指示することが可能になった。"ignorePatterns"プロパティを導入する前は、特定のファイルおよびディレクトリを無視するために、プロジェクトのルートディレクトリに.estlintignoreファイルを作成する必要があった。"ignorePatterns"プロパティは、コンフィギュレーションファイルのあるディレクトリにのみ有効である。また、.eslintignoreファイルが存在する場合は、その定義がコンフィギュレーションファイルの"ignorePatterns"プロパティをオーバーライドする。
{
"ignorePatterns": ["temp.js", "node_modules/"],
"rules": {
//...
}
}
これまでのバージョンのESLintでは、setterに戻り値があってもエラーにはならず、その値は無視されていた。しかしながら、setterの戻り値は使用することができないので、不必要であるか、あるいはエラーの可能性がある。
ESLint 6.7.0では"no-setter-return"ルールが導入されて、このようなsetterからの戻り値は不許可となり、setter関数のreturnステートメントがレポートされるようになった。このルールはオブジェクトリテラル、クラス定義、クラス式のsetterをチェックする。
ESLintでは、"no-implicit-globals"ルールによってグローバルスコープの宣言を禁止する。スクリプトで生成されるグローバル変数は他のスクリプトが生成するグローバル変数と名前の衝突を起こす可能性があり、ランタイムエラーや意図しない動作を生み出す原因になるからだ。ESLint 6.7.0ではこのルールが拡張され、"lexicalBinding"をtrueにすることで、"const"、"let"、"class"宣言も同じようにチェックされるようになった。
"lexicalBindings"オプションがtrueの場合に、このルールによって不正コードとなる例を示す。
/*eslint no-implicit-globals: ["error", {"lexicalBindings": false}]*/
const foo = 1;
let baz;
class Bar {}
"lexicalBindings"オプションがtrueの場合に正しいコードは、次のようになる。
/*eslint no-implicit-globals: ["error", {"lexicalBindings": true}]*/
{
const foo = 1;
let baz;
class Bar {}
}
(function() {
const foo = 1;
let baz;
class Bar {}
}());
ES2016で導入された中置べき乗演算子"**"は、標準の `Math.pow`関数の代替となるものだ。ESLint 6.7.0では、"prefer-exponemtiation-operator"ルールは"Math.pow"の使用を不許可とし、"**"演算子を使うように指示するものだ。このルールは"Math.pow"呼び出しを禁止し、代わりに"**"演算子の使用を提案する。
このルールによる不正コードは次のようなものだ。
/*eslint prefer-exponentiation-operator: "error"*/
const foo = Math.pow(2, 8);
const bar = Math.pow(a, b);
let baz = Math.pow(a + b, c + d);
let quux = Math.pow(-1, n);
べき乗演算子ルールでは、以下のコードが正しいものと判断される。
/*eslint prefer-exponentiation-operator: "error"*/
const foo = 2 ** 8;
const bar = a ** b;
let baz = (a + b) ** (c + d);
let quux = (-1) ** n;
新たなルールの追加や既存ルールの拡張以外にも、ESLint 6.7.0リリースでは、過去に発見されたいくつかのバグが修正されている。詳細はESLint 6.7.0 リリースを参照してほしい。
ESLintはOpenJS Foundationのプロジェクトで、MITライセンス下でオープンソースとして提供される。コントリビューションはESLint GitHubレポジトリ経由で受け入れられていて、ESLintコントリビューションガイドラインに準拠する必要がある。