ESLint v6.0.0 の変更点まとめ


前 [v5.16.0] | 次 [v6.1.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">We&#39;re excited to announce that ESLint v6.0.0 has been released: <a href="https://t.co/EO4ZrZIMYM">https://t.co/EO4ZrZIMYM</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1142270756442841088?ref_src=twsrc%5Etfw">2019年6月22日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `6.0.0` がリリースされました。

既存の機能を改善するための非互換な変更があります。特に、グローバル インストール (`npm install -g`) された ESLint コマンドを利用している場合、今まで通りには利用できない可能性が高いです。逆に、ローカル インストールを利用している場合はほとんど変化を感じないかもしれません。

また、[先日の TC39 会議](https://github.com/tc39/agendas/blob/master/2019/06.md)で [Dynamic Imports](https://github.com/tc39/proposal-dynamic-import) と [BigInt](https://github.com/tc39/proposal-bigint) が採択されたため、ESLint でもそれら構文の実装が開始しました。進捗状況は [#11803](https://github.com/eslint/eslint/issues/11803) をご覧ください。

**互換性のない変更 for ユーザー:**

- [Node.js 6.x のサポートを終了しました。](#-nodejs-6x-のサポートを終了しました)
- [プラグインの読み込み方が大幅に変更されました。](#-プラグインの読み込み方が大幅に変更されました)
- [`eslint:recommended`に含まれるルールが更新されました。](#-eslintrecommendedに含まれるルールが更新されました)
- [no-redeclare ルールのチェックがより厳しくなりました。](#-no-redeclare-ルールのチェックがより厳しくなりました)
- [comma-dangle ルールのチェックがより厳しくなりました。](#-comma-dangle-ルールのチェックがより厳しくなりました)
- [オプションに正規表現を指定できるルールが正規表現構文の誤りに厳しくなりました。](#-オプションに正規表現を指定できるルールが正規表現構文の誤りに厳しくなりました)
- [設定の`parserOptions`プロパティが不正な値にエラーを投げるようになりました。](#-設定のparseroptionsプロパティが不正な値にエラーを投げるようになりました)
- [設定の`globals`プロパティが不正な値にエラーを投げるようになりました。](#-設定のglobalsプロパティが不正な値にエラーを投げるようになりました)
- [設定の`overrides[].files`プロパティが dotfiles にマッチするようになりました。](#-設定のoverridesfilesプロパティが-dotfiles-にマッチするようになりました)
- [設定の`experimentalObjectRestSpread`プロパティが削除されました。](#-設定のexperimentalobjectrestspreadプロパティが削除されました)
- [共有設定の`overrides`プロパティ内の項目が、それを`extends`する設定ファイルの項目を上書きしなくなりました。](#-共有設定のoverridesプロパティ内の項目がそれをextendsする設定ファイルの項目を上書きしなくなりました)
- [`/*eslint*/`コメントが存在しないルールを無効にする場合にエラーを表示するようになりました。](#-eslintコメントが存在しないルールを無効にする場合にエラーを表示するようになりました)

**互換性のない変更 for プラグイン開発者:**

- [Node.js 6.x のサポートを終了しました。](#-nodejs-6x-のサポートを終了しました)
- [プラグインの読み込み方が大幅に変更されました。](#-プラグインの読み込み方が大幅に変更されました)
- [スコープ解析 API の中にある`eslintExplicitGlobalComment`プロパティが削除されました。](#-スコープ解析-api-の中にあるeslintexplicitglobalcommentプロパティが削除されました)
- [ルールのオプション スキーマが不正なデフォルト値を持つ場合にエラーを投げるようになりました。](#-ルールのオプション-スキーマが不正なデフォルト値を持つ場合にエラーを投げるようになりました)
- [テストの`parser`プロパティが絶対パスを必要とするようになりました。](#-テストのparserプロパティが絶対パスを必要とするようになりました)

**互換性のない変更 for 連携ツール開発者:**

- [Node.js 6.x のサポートを終了しました。](#-nodejs-6x-のサポートを終了しました)
- [`Linter`クラスはカスタムパーサーを自動的に読み込まなくなりました。](#-linterクラスはカスタムパーサーを自動的に読み込まなくなりました)
- [`CLIEngine`クラスは過去に利用したプラグインを保持しなくなりました。](#-cliengineクラスは過去に利用したプラグインを保持しなくなりました)

**マイグレーション ガイド:**

- [Migrating to v6.0.0](https://eslint.org/docs/user-guide/migrating-to-6.0.0) (英語)

**リリースノート:**

- 2019-04-13 JST - [6.0.0-alpha.0](https://eslint.org/blog/2019/04/eslint-v6.0.0-alpha.0-released)
- 2019-04-27 JST - (canceled; みんな忙しかったので)
- 2019-05-11 JST - [6.0.0-alpha.1](https://eslint.org/blog/2019/05/eslint-v6.0.0-alpha.1-released)
- 2019-05-25 JST - [6.0.0-alpha.2](https://eslint.org/blog/2019/05/eslint-v6.0.0-alpha.2-released) (すべての Breaking Changes がマージされました)
- 2019-06-08 JST - [6.0.0-rc.0](https://eslint.org/blog/2019/06/eslint-v6.0.0-rc.0-released)
- 2019-06-22 JST - [6.0.0](https://eslint.org/blog/2019/06/eslint-v6.0.0-released)

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

## 💥 互換性のない変更

### § Node.js 6.x のサポートを終了しました。

🔖 [#11557], [#11456], [#11022]

[Node.js 6 は 4 月 30 日に寿命を迎えました](https://github.com/nodejs/Release#release-schedule)。これに伴い、ESLint は Node.js 6 のサポートを終了しました。

新たなサポート範囲は以下の通りです。

- Node.js 8 (`8.10.0` 以上)
- Node.js 10 (`10.13.0` 以上)
- Node.js 11 以降 (`11.10.1` 以上)

### § プラグインの読み込み方が大幅に変更されました。

🔖 [#11388], [#10125], [RFC #7]

従来は ESLint がインストールされた場所を基準に (即ち、ESLint がインストールされた `node_modules` ディレクトリから) プラグインを読み込んでいました。これは `babel` 等の一緒に使われることが多いツール群とは異なる振る舞いであり、混乱の原因になっていました。また、[lerna] や [Yarn Plug n' Play] 等の特定の環境下で ESLint が正常に動作しない原因にもなっていました。

そのため、ESLint 6 からはこの動作が変更され、常にプロジェクト ローカル (より厳密には `$CWD/node_modules` とその祖先ディレクトリ) からプラグインを読み込むようになりました。

これまでグローバル インストールされた ESLint とプラグインを利用していた方は、利用方法を変更する必要があります。ESLint とプラグイン類をプロジェクト毎にインストールし、コマンドは [eslint-cli] 等を利用する事をお勧めします。

### § `eslint:recommended`に含まれるルールが更新されました。

🔖 [#11518], [#11357], [#10873], [#10768]

以下のルールが新たに有効になりました。

- [no-async-promise-executor] `Promise`クラスのコンストラクタに渡す関数が非同期関数だった場合に警告します。その関数内で例外がスローされた場合にプログラムがクラッシュする (正確には `unhandledRejection` が発生する) ためです。
- [no-misleading-character-class] 正規表現の文字クラスに複数のコードポイントから構成される文字がある場合に警告します。それは正しく解釈されないためです。
- [no-prototype-builtins] `hasOwnProperty`のような`Object`クラスの一部メソッドを警告します。オブジェクトを`Map`的に使う場合は`Object`クラスのメソッドを持っていない`Object.create(null)`が好まれるためです。現代では`Map`クラスを利用するのが良いでしょう。
- [no-shadow-restricted-names] `undefined`等の重要な変数のシャドーイングを警告します。
- [no-useless-catch] 無駄な`catch`句を警告します。
- [no-with] `with`構文を警告します。
- [require-atomic-updates] 非同期関数にて、共有変数がアトミックに変更されない場合に警告します。

以下のルールが有効にならなくなりました。

- [no-console] このルールは多くの場合に有用ですが (例えば、誤ってデバッグ用の記述をプロダクション コードに残さないようにする)、CLI プログラムなど`console.log`が有効なケースもあるため、推奨設定から外されました。

また、従来の`eslint:recommended`には推奨以外のルールを無効にする設定が含まれていました。ESLint 6 からは、`eslint:recommended`はいかなるルールも無効にしません。推奨されるルールを有効にするだけです。

### § [no-redeclare] ルールのチェックがより厳しくなりました。

🔖 [#11509], [#11405], [#11370]

1. [no-redeclare] ルールの`builtinGlobals`オプションがデフォルトで有効になりました。グローバル スコープでの変数定義が、設定ファイルで定義したグローバル変数と同じ名前の時に再定義エラーとなります。
2. `/*globals xxx*/`のようなコメントによるグローバル変数定義と、他のグローバル変数定義との再宣言をチェックするようになりました。

```js
/*globals Object */ "ERROR: Object は既に定義されています。"
```

### § [comma-dangle] ルールのチェックがより厳しくなりました。

🔖 [#11519], [#11502]

[comma-dangle] ルールの`functions`オプションがデフォルトで有効になりました。

### § オプションに正規表現を指定できるルールが正規表現構文の誤りに厳しくなりました。

🔖 [#11516], [#11423]

オプションに正規表現パターンを指定できるすべてのルールについて、その正規表現を`u`フラグがついているものとして解釈するようになりました。これによりサロゲート ペアを正しく扱えるようになるほか、ブラウザ互換性のための緩い構文解釈 (a.k.a. [Annex B](https://www.ecma-international.org/ecma-262/9.0/#sec-additional-ecmascript-features-for-web-browsers)) が無効化され、より厳密な構文解釈が行われるようになります。

以下のルールが影響を受けます。

- [camelcase]
- [capitalized-comments]
- [default-case]
- [dot-notation]
- [handle-callback-err]
- [id-match]
- [line-comment-position]
- [lines-around-comment]
- [max-len]
- [new-cap]
- [no-fallthrough]
- [no-unused-vars]
- [spaced-comment]
- [valid-jsdoc]

### § 設定の`parserOptions`プロパティが不正な値にエラーを投げるようになりました。

🔖 [#11610], [#9687], [espree #412], [espree #384]

1. `sourceType: "module"` を指定したにもかかわらず、`ecmaVersion` が `5` 以下であった (未指定を含む) 場合にエラーになります。ES Modules は `ecmaVersion: 2015` とそれ以降のみ利用可能です。
2. `ecmaVersion` が不正な値の時にエラーになります。
3. `sourceType` が不正な値の時にエラーになります。

なお、これらのエラーはデフォルトのパーサーを利用している場合のみ発生します。

### § 設定の`globals`プロパティが不正な値にエラーを投げるようになりました。

🔖 [#11517], [#11338 (comment)](https://github.com/eslint/eslint/pull/11338#discussion_r252497158)

設定ファイルの`globals`項目について、昔は`true`/`false`によって書き込み可能かどうかを指定していました。そして、互換性のために、不正な値も許可されていました (暗黙の型変換で`true`になると書き込み可能として)。

ESLint 6 では、不正な値はエラーになります。厳密には以下の値だけが許可されます。

- 公式の設定値
    - `"writable"` (読み書き可能)
    - `"readonly"` (読み取り専用)
    - `"off"` (未定義にする)
- 互換性のために許可される値
    - `"writeable"` (読み書き可能)
    - `"readable"` (読み取り専用)
    - `"true"` (読み書き可能)
    - `"false"` (読み取り専用)
    - `true` (読み書き可能)
    - `false` (読み取り専用)

### § 設定の`overrides[].files`プロパティが dotfiles にマッチするようになりました。

🔖 [#11225], [#11201]

```yml:.eslintrc.yml
overrides:
  - files: ["*.ts"]
    parser: "typescript-eslint-parser"
```

従来は、上記設定は`.`で始まる TypeScript ファイル (例: `.foo.ts`) にはマッチしませんでした。ESLint 6 からはマッチするようになります。

### § 設定の`experimentalObjectRestSpread`プロパティが削除されました。

🔖 [#11420], [#9990]

ESLint 5 から非推奨になっていた`experimentalObjectRestSpread`設定が削除されました。`ecmaVersion: 2018`をご利用ください。

### § 共有設定の`overrides`プロパティ内の項目が、それを`extends`する設定ファイルの項目を上書きしなくなりました。

🔖 [#11546], [#11510]

従来は、共有設定の`overrides`内にある設定を普通に書くと、その設定は黙って無視されていました。

```yml:extendee.yml
overrides:
  - files: "*.js"
    rules:
      no-console: error
```

```yml:extender.yml
extends: "./extendee.yml"
rules:
  no-console: off # extendee の設定で上書きされてしまう
```

ESLint 6 からは、あなたの設定ファイルに書かれた設定は常に共有設定より優先されます。

### § `/*eslint*/`コメントが存在しないルールを無効にする場合にエラーを表示するようになりました。

🔖 [#11742], [#9505]

以下のような、存在しないルールに対する無効化設定は、従来は無視されていました。ESLint 6 からはエラーになります。

```js:例
/*eslint no-consolw: off */
console.log("typo")
```

### § スコープ解析 API の中にある`eslintExplicitGlobalComment`プロパティが削除されました。

🔖 [#11509], [#11370], [RFC #17]

ESLint のスコープ解析機能の変数オブジェクトが持っていた`eslintExplicitGlobalComment`プロパティが削除されました。このプロパティはこれまで正式にドキュメントに書かれたことはありません。

もし、あなたのルールがこのプロパティを利用していた場合、新たに追加された[`eslintExplicitGlobalComments`]プロパティを利用するよう修正してください。

### § ルールのオプション スキーマが不正なデフォルト値を持つ場合にエラーを投げるようになりました。

🔖 [#11599], [#11473]

[ESLint v5.14.0 から各ルールの `schema` 定義でデフォルト値を指定できるようになりました](https://qiita.com/mysticatea/items/79df343e19f8608f620a#11288-%E6%A4%9C%E8%A8%BC%E3%83%AB%E3%83%BC%E3%83%AB%E3%81%AE-metaschema-%E3%81%AE%E5%9E%8B%E5%AE%9A%E7%BE%A9%E3%81%AB%E3%81%A6-default-%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F)が、このデフォルト値の書き方が不正な場合に`RuleTester`がエラーを出力するようになりました。

### § テストの`parser`プロパティが絶対パスを必要とするようになりました。 

🔖 [#11761], [#11728]

従来はテストケースの`parser`プロパティにパッケージ名を指定することができましが、テスターは自身がどこから実行されているのか知らないため、どこからパッケージを読み込めば良いのか不明瞭でした。6.0.0 からは絶対パスを渡さなければならなくなりました。

```diff:例
  tester.run("foo", rule, {
      valid: [
          {
              "code": "console.log()",
-             "parser": "babel-eslint",
+             "parser": require.resolve("babel-eslint"),
          },
      ],
      invalid: [],
  })
```

`require.resolve()`関数を利用する事で、パッケージをテスターを実行しているファイルから相対的に解決することができます。

### § `Linter`クラスはカスタムパーサーを自動的に読み込まなくなりました。

🔖 [#11388], [RFC #7]

従来は`Linter#verify(code, config)`メソッドに渡した設定が未知のパーサーを持っていた場合、`require(config.parser)`を試みてパーサーを読み込んでいました。この動作が削除されました。

あなたの連携ツールがこの動作に依存していた場合、事前に`Linter#defineParser(id,parser)`メソッドを用いてパーサーを定義するように修正してください。

### § `CLIEngine`クラスは過去に利用したプラグインを保持しなくなりました。

🔖 [#11546]

従来は`CLIEngine`クラスが過去の検証で利用したプラグインを保持していて、同じインスタンスを使い回す場合に、設定ファイルに`plugins`キーがなかったとしても、過去に利用したプラグインを利用できてしまっていました。

ESLint v6.0.0 からは、過去に利用したプラグインを保持しなくなりました。そのため、`CLIEngine`インスタンスを再利用している場合に、`plugins`設定が不足している不完全な設定が新たにエラーになる可能性があります。

## ✨ 本体への機能追加

### § Glob-based 設定が`extends`をサポートしました。

🔖 [#11554], [#8813]

設定ファイルの`overrides`プロパティの中で、`extends`とネストした`overrides`を利用できるようになりました (やっと！)。

```yaml:例
rules:
  # 省略
overrides:
  - files: "*.ts"
    extends: plugin:@typescript-eslint/recommended
```

### § プラグイン プリプロセッサを改善しました。

🔖 [#11552], [#11035], [RFC #3]

従来のプリプロセッサ機能には、Markdown ファイルの中の Vue.js コードをリントしたい、等の、JavaScript 以外のファイルの中の JavaScript 以外のコードブロックを扱う方法がありませんでした。

6.0.0 では名前付きコードブロックをサポートし、コードブロックの名前 (例: `example.md/block01.vue`) に基づいて多重にプリプロセッサを適用できるようになりました。

詳細はドキュメントを参照ください。

- [設定ファイルの`processor`プロパティ](https://eslint.org/docs/user-guide/configuring#specifying-processor)
- [プラグインのプリプロセッサ機能](https://eslint.org/docs/developer-guide/working-with-plugins#processors-in-plugins)

### § プラグインを読み込むディレクトリを変更する CLI オプションが追加されました。

🔖 [#11696], [RFC #18]

プラグインを読み込むディレクトリを変更するための CLI オプション [--resolve-plugins-relative-to] が追加されました。例えば `$(npm prefix -g)` を指定すると、グローバル インストールされたプラグインを読み込むようになります。

## 💡 新しいルール

特になし。

## 🔧 オプションが追加されたルール

### § [new-parens] `"never"`

🔖 [#11379]

`new`式の括弧が省略可能な場合に必ず省略するように矯正するオプションが追加されました。

```js
/*eslint new-parans: [error, never] */

//✘ BAD
const a = new Array()

//✔ GOOD
const b = new Array
const c = new Array(3)
```

### § [function-paren-newline] `"multiline-arguments"`

🔖 [#11406]

`"multiline"`オプションと同様に動作するが、引数が1個の場合は括弧の内側の改行を許可するオプション? が追加されました。

### § [sort-keys] `"minKeys"`

🔖 [#11625]

オブジェクトのプロパティが指定数未満だった場合にソートしないオプションが追加されました。

```js
/*eslint sort-keys: [error, asc, {minKeys: 3}] */

//✘ BAD
const obj1 = {
    b: 1,
    a: 0,
    c: 2,
}

//✔ GOOD
const obj2 = {
    b: 1,
    a: 0,
}
```

## 🎨 その他の変更

### § [no-div-regex] ルールが自動修正をサポートしました。

🔖 [#11744]

```js
const pattern = /=foo/;
// ↓↓↓↓ fixed to ↓↓↓↓
const pattern = /[=]foo/;
```

[v5.16.0]: http://qiita.com/mysticatea/items/a7aed64c42fa56fcbe00
[v6.1.0]: http://qiita.com/mysticatea/items/8a59471d6c16933a82b6
[RFC #3]: https://github.com/eslint/rfcs/tree/master/designs/2018-processors-improvements
[RFC #7]: https://github.com/eslint/rfcs/tree/master/designs/2018-simplified-package-loading
[RFC #17]: https://github.com/eslint/rfcs/tree/master/designs/2019-variable-definition-information-of-config-files
[RFC #18]: https://github.com/eslint/rfcs/tree/master/designs/2019-plugin-root-path-flag
[espree #412]: https://github.com/eslint/espree/issues/412
[espree #384]: https://github.com/eslint/espree/issues/384
[#8813]: https://github.com/eslint/eslint/issues/8813
[#9999]: https://github.com/eslint/eslint/issues/9999
[#9505]: https://github.com/eslint/eslint/issues/9505
[#9687]: https://github.com/eslint/eslint/issues/9687
[#9990]: https://github.com/eslint/eslint/issues/9990
[#10125]: https://github.com/eslint/eslint/issues/10125
[#10768]: https://github.com/eslint/eslint/issues/10768
[#10873]: https://github.com/eslint/eslint/issues/10873
[#11022]: https://github.com/eslint/eslint/issues/11022
[#11035]: https://github.com/eslint/eslint/issues/11035
[#11201]: https://github.com/eslint/eslint/issues/11201
[#11225]: https://github.com/eslint/eslint/issues/11225
[#11357]: https://github.com/eslint/eslint/issues/11357
[#11370]: https://github.com/eslint/eslint/issues/11370
[#11379]: https://github.com/eslint/eslint/issues/11379
[#11388]: https://github.com/eslint/eslint/issues/11388
[#11405]: https://github.com/eslint/eslint/issues/11405
[#11406]: https://github.com/eslint/eslint/issues/11406
[#11420]: https://github.com/eslint/eslint/issues/11420
[#11423]: https://github.com/eslint/eslint/issues/11423
[#11456]: https://github.com/eslint/eslint/issues/11456
[#11473]: https://github.com/eslint/eslint/issues/11473
[#11502]: https://github.com/eslint/eslint/issues/11502
[#11509]: https://github.com/eslint/eslint/issues/11509
[#11510]: https://github.com/eslint/eslint/issues/11510
[#11516]: https://github.com/eslint/eslint/issues/11516
[#11517]: https://github.com/eslint/eslint/issues/11517
[#11518]: https://github.com/eslint/eslint/issues/11518
[#11519]: https://github.com/eslint/eslint/issues/11519
[#11546]: https://github.com/eslint/eslint/issues/11546
[#11552]: https://github.com/eslint/eslint/issues/11552
[#11554]: https://github.com/eslint/eslint/issues/11554
[#11557]: https://github.com/eslint/eslint/issues/11557
[#11599]: https://github.com/eslint/eslint/issues/11599
[#11610]: https://github.com/eslint/eslint/issues/11610
[#11625]: https://github.com/eslint/eslint/issues/11625
[#11696]: https://github.com/eslint/eslint/issues/11696
[#11728]: https://github.com/eslint/eslint/issues/11728
[#11742]: https://github.com/eslint/eslint/issues/11742
[#11744]: https://github.com/eslint/eslint/issues/11744
[#11761]: https://github.com/eslint/eslint/issues/11761

[xxxx]: http://eslint.org/docs/rules/xxxx
[camelcase]: http://eslint.org/docs/rules/camelcase
[capitalized-comments]: http://eslint.org/docs/rules/capitalized-comments
[comma-dangle]: http://eslint.org/docs/rules/comma-dangle
[default-case]: http://eslint.org/docs/rules/default-case
[dot-notation]: http://eslint.org/docs/rules/dot-notation
[function-paren-newline]: http://eslint.org/docs/rules/function-paren-newline
[handle-callback-err]: http://eslint.org/docs/rules/handle-callback-err
[id-match]: http://eslint.org/docs/rules/id-match
[line-comment-position]: http://eslint.org/docs/rules/line-comment-position
[lines-around-comment]: http://eslint.org/docs/rules/lines-around-comment
[max-len]: http://eslint.org/docs/rules/max-len
[new-cap]: http://eslint.org/docs/rules/new-cap
[new-parens]: http://eslint.org/docs/rules/new-parens
[no-async-promise-executor]: http://eslint.org/docs/rules/no-async-promise-executor
[no-console]: http://eslint.org/docs/rules/no-console
[no-div-regex]: http://eslint.org/docs/rules/no-div-regex
[no-fallthrough]: http://eslint.org/docs/rules/no-fallthrough
[no-misleading-character-class]: http://eslint.org/docs/rules/no-misleading-character-class
[no-prototype-builtins]: http://eslint.org/docs/rules/no-prototype-builtins
[no-redeclare]: http://eslint.org/docs/rules/no-redeclare
[no-shadow-restricted-names]: http://eslint.org/docs/rules/no-shadow-restricted-names
[no-unused-vars]: http://eslint.org/docs/rules/no-unused-vars
[no-useless-catch]: http://eslint.org/docs/rules/no-useless-catch
[no-with]: http://eslint.org/docs/rules/no-with
[require-atomic-updates]: http://eslint.org/docs/rules/require-atomic-updates
[sort-keys]: http://eslint.org/docs/rules/sort-keys
[spaced-comment]: http://eslint.org/docs/rules/spaced-comment
[valid-jsdoc]: http://eslint.org/docs/rules/valid-jsdoc
[--resolve-plugins-relative-to]: https://eslint.org/docs/user-guide/command-line-interface#--resolve-plugins-relative-to
[`eslintExplicitGlobalComments`]: https://eslint.org/docs/developer-guide/working-with-rules#contextgetscope

[lerna]: https://github.com/lerna/lerna
[Yarn Plug n' Play]: https://yarnpkg.com/lang/en/docs/pnp/
[eslint-cli]: https://github.com/eslint/eslint-cli

<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->