ESLint v3.6.0 released: https://t.co/fwTadlTxuN
— ESLint (@geteslint) 2016年9月23日
ESLint 3.6.0 がリリースされました。
今回のリリースで ECMAScript® 2017 Draft の一部をサポートしました!
これにより、babel-eslint
を利用しなくても async/await や関数関連の末尾カンマを利用できるようになります。
これらの新しい言語機能を利用する場合は、
{
"parserOptions": {
"ecmaVersion": 2017
}
}
と設定します。
今後も Stage 4 (finished) に到達した言語機能から順にサポートしていきます。
質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。
ES2017 サポートのために修正されたルール
ES2017 の新しい構文をサポートするために、以下のルールが修正されました。
この他にも ES2017 の新しい構文の周りで誤検知・見逃しをするルールがあるかもしれません。もしも見つけた場合はご一報頂けると幸いです。
#7172: array-callback-return
配列メソッドのコールバックとして async
関数が使われた場合、戻り値が無くとも警告しないように修正されました。
/*eslint array-callback-return:error*/
//✔ GOOD
Promise.all(list.map(async x => { await doSomething(x) })
従来は「戻り値が必要だ」と警告されていました。
#7173: prefer-arrow-callback
eslint --fix
が async
関数を正しく扱えなかったので修正されました。
#7174: space-unary-ops
await
式の await
文脈キーワードと後続する式との間のスペースをチェックするようになりました。
/*eslint space-unary-ops:error*/
async function wrap() {
//✔ GOOD
await [1,2,3].reduce(doSomething)
//✘ BAD
await[1,2,3].reduce(doSomething)
}
#7175: no-unused-expressions
await
式を副作用のない式だと誤検出していた不具合が修正されました。
#7176: arrow-parens
async
アロー関数で正しく動作していなかった不具合が修正されました。
#7178: no-extra-parens
await
式関連の演算子結合度を正しく判定できるようになりました。
ちなみに、await
演算子の結合度は単項演算子と同じです。
よく似ている yield
演算子とは完全に異なるのでご留意ください。
#7179: keyword-spacing
async
・await
文脈キーワードの前にある空白をチェックするようになりました。
新しいルール
今回はありません。
オプションが追加されたルール
#6938: eol-last
ファイル末尾に空行が無いと警告する always
オプションと、ファイル末尾に空行があると警告する never
オプションが追加されました。デフォルトは always
(既存の動作) です。
また、既存の2つのオプション windows
と linux
は非推奨になりました。
改行文字を指定する場合は linebreak-style
ルールを利用してください。
表現が難しいので例示は割愛。
#7085: class-methods-use-this
特定の名称のメソッドではthis
を使用しない事を許可できるようになりました。
/*eslint class-methods-use-this: [error, {exceptMethods: [foo]}]*/
// ✔ GOOD
class A {
foo() {
}
bar() {
this.foo()
}
}
// ✘ BAD
class A {
bar() {
}
}
#7137: no-restricted-properties
以下の2つが新たにできるようになりました。
- 指定した名称の変数での全プロパティアクセスを禁止する
- あらゆる変数での指定プロパティアクセスを禁止する
従来は変数名とプロパティ名を両方指定する必要があったため、用途が限定されていました。
/*eslint no-restricted-properties: [
error,
{object: require},
{property: __defineGetter__},
{property: __defineSetter__}
]*/
// ✔ GOOD
require("a")
obj
// ✘ BAD
require.resolve
require.cache
require.extensions
obj.__defineGetter__
a.__defineGetter__
b.__defineSetter__
新たに eslint --fix をサポートしたルール
#6668: strict
自動修正では余分な "use strict"
を削除します。
function foo() {
"use strict"
"use strict"
}
// ↓
function foo() {
"use strict"
}
残念ながら追加はしてくれません。
Strict モードが切り替わると既存のコードが構文エラーになる可能性があるためです。
#6978: prefer-template
文字列と式との連結をテンプレートに変換します。
let b = "hello, " + name + "!"
// ↓
let b = `hello, ${ name }!`
連結演算子 +
の周囲の空白・コメントは維持されます。
修正後の空白は、template-curly-spacing ルールや no-multi-spaces ルールが有効になっていれば、それらの自動修正が好み通りに整えてくれるでしょう。
#6996: quote-props
プロパティ名を囲むクォートが必要ならば追加し、不要ならば削除します。
追加時のクォートの種類は別途 quotes ルールが決定します。
let obj = {"a": 1, b: 2}
// ↓
let obj = {a: 1, b: 2}
#7113: no-regex-spaces
正規表現内の連続した空白を繰り返し表現に修正します。
let s = / /
// ↓
let s = / {4}/