Node.js Advent Calendar 2015の7日目の記事です。遅刻してごめんなさいごめんなさい。
sinopiaをs3対応して記事を書こうと思ったのですが、思ったより手こずってしまい、ESLintの2系のalpha版が出たので、そちらについて調べました。
ESLint v2.0.0-alpha-1 released
新しいルール
下記のルールが新しく追加される。
-
array-callback-return
- Arrayのfilterやreduceなど、callback内で値を返す必要があるのに返してない場合にエラーを出す。
-
no-implicit-globals
- 暗黙的にグローバルに定義されている変数がある場合にエラーを出す
-
no-restricted-imports
- 任意のパッケージのimportを禁止する
-
prefer-rest-params
- ES6のRest Parameterを使ったほうが良い時にエラーを出す
-
yield-star-spacing
-
yield
前後のスペースのルール
-
マイグレーションが必要そうなところ
設定ファイル
.eslintrc
とpackage.json
のeslintConfig
フィールドの両方がある場合、現状は両方の設定がマージされ適用されるが、2.0.0からは.eslintrc.*
が存在する場合はpackage.json
のeslintCofig
フィールドは無視される。
.eslintrc.*
とpackage.json
のeslintConfig
フィールドが併用されている環境がある場合は、どちらかに寄せよう。
組み込みのグローバル変数
2.0.0以前はES6の機能であるPromise
, Map
, Set
, Symbol
が何も設定しなくてもグローバル変数と認識されており、ES5の環境で上記の機能が使えない場合にも、no-undef
ルール等でエラーとして認識されないという問題があった。
$ eslint -v
v1.10.3
$ cat .eslintrc.json
{
"extends": "eslint:recommended"
}
$ cat index.js
'use strict';
// Promiseを使ったコード
new Promise(function (resolve) {
resolve(10000);
});
$ eslint index.js
# 何もエラーが出ない
2.0.0からは、明示的にenv: { es6: true }
を設定しないとエラーになった。
$ eslint -v
v2.0.0-alpha-1
$ cat .eslintrc.json
{
"extends": "eslint:recommended"
}
$ cat index.js
'use strict';
// Promiseを使ったコード
new Promise(function (resolve) {
resolve(10000);
});
$ eslint index.js
/Users/pirosikick/src/github.com/pirosikick/eslint-next-playground/next/index.js
2:5 error "Promise" is not defined no-undef
✖ 1 problem (1 error, 0 warnings)
# env: { es6: true }を追加
$ cat .eslintrc.json
{
"env": {
"es6": true
},
"extends": "eslint:recommended"
}
$ eslint index.js
# 何もエラーが出ない
ecmaFeaturesオプション
2.0.0からecmaFeatures
オプションのES6系のフラグ(arrowFunctions
やblockBindings
など。modules
, jsx
, experimentalObjectRestSpread
以外)は廃止になって、代わりにparserOptions.ecmaVersion
オプションに6
を設定するとES6系のフラグを全部trueにしたのと同じになる。
module.exports = {
parserOptions: {
// 3, 5 ,6が設定可能で、デフォルトは5
ecmaVersion: 6
}
};
ecmaFeatures
のmodules
フラグは廃止になり、parserOptions.souceType
に"module"
を設定すると同じ設定になる。
module.exports = {
parserOptions: {
// "script"と"module"が設定可能で、デフォルトは"script"
sourceType: "module"
}
};
ecmaFeatures
のjsx
フラグとexperimentalObjectRestSpread
フラグはparserOptions.ecmaFeatures
に設定する。
module.exports = {
parserOptions: {
ecmaFeatures: {
jsx: true,
experimentalObjectRestSpread: true
}
}
};
ルール開発周りのSchemaの修正とCode Path Analysisについては、もうちょっと調べて書きます。