ESLint v5.3.0 has been released: https://t.co/qu3OgY0CDK
— ESLint (@geteslint) 2018年8月4日
ESLint 5.3.0 がリリースされました。
小さな機能追加とバグ修正が行われました。
正規表現に関する2つのルールと非同期処理に関する2つのルールが追加されています。
質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。
🚀 本体への機能追加
特になし。
💡 新しいルール
#10511: no-misleading-character-class
複数のコードポイントから構成される文字を文字クラス構文 (例: /[👍🏻]/u
) で利用したときに警告するルールです。これは、JavaScript の正規表現が複数のコードポイントから構成される文字を期待通りに扱えないためです。
例えば、絵文字 👍🏻 は絵文字 👍 (U+1F44D) と肌色セレクタ 🏻 (U+1F3FB) の2つのコードポイントから構成されます。文字クラス構文にこの文字を書く (/[👍🏻]/u
) と、👍 (U+1F44D) または 🏻 (U+1F3FB) のどちらかにマッチする正規表現になります。
なお、これはサロゲートペア (1つのコードポイントを複数のコードユニットで表現したもの) とは別の概念です。JavaScript 正規表現は (u
フラグを付与することで) サロゲートペアを正しく扱えます。
/*eslint no-misleading-character-class: error */
// 結合文字 (アクセント、異体字セレクタ等):
/^[Á]$/u.test("Á"); //→ false
/^[❇️]$/u.test("❇️"); //→ false
// 絵文字と肌色セレクタのセット:
/^[👶🏻]$/u.test("👶🏻"); //→ false
/^[👶🏽]$/u.test("👶🏽"); //→ false
// 国旗:
/^[🇯🇵]$/u.test("🇯🇵"); //→ false
// ZWJ を含むグラフィムクラスタ:
/^[👨👩👦]$/u.test("👨👩👦"); //→ false
// UTF16 サロゲートペア (u フラグがない場合):
/^[👍]$/.test("👍"); //→ false
#10655: require-atomic-updates
アトミックではない変数の書き換えを警告するルールです。詳しくは以前に書いた記事を御覧ください。
/*eslint require-atomic-updates: error */
async function getFileSize(fileList) {
let size = 0
await Promise.all(
fileList.map(async (file) => {
size += (await fs.promises.stat(file)).size
})
)
return size
}
#10661: no-async-promise-executor
Promise
コンストラクタの引数に async 関数式を与えたときに警告するルールです。
えーと、うーん?
/*eslint no-async-promise-executor: error */
let p = new Promise(async (resolve) => {
// do something.
})
#10698: require-unicode-regexp
正規表現に必ずu
フラグを付けるよう矯正するルールです。
正規表現のu
フラグには、2つの重要な効果があります。
- UTF-16 サロゲートペアを正しく扱えるようにする。
- 構文エラーを正しく投げるようになる。
歴史的経緯から、JavaScript の正規表現は構文エラーに寛容です。例えば /\w{1,2/
には構文エラーがありますが、JavaScript はエラーを投げません。代わりに "a{1,2"
のような文字列にマッチします。
u
フラグをつけることで、このような構文エラーを持つ正規表現が正しくSyntaxError
を投げるようになり、バグの発見に役立ちます。
/*eslint require-unicode-regexp: error */
//✗ BAD
{
const a = /aaa/
const b = /bbb/gi
const c = new RegExp("ccc")
const d = new RegExp("ddd", "gi")
}
//✓ GOOD
{
const a = /aaa/u
const b = /bbb/giu
const c = new RegExp("ccc", "u")
const d = new RegExp("ddd", "giu")
}
🔧 オプションが追加されたルール
特になし。
✒️ eslint --fix
をサポートしたルール
特になし。
⚠️ 非推奨になったルール
特になし。