ESLint v6.7.0

前 [v6.6.0](https://qiita.com/mysticatea/items/0a77713cff42d84d85c7) | 次 [v6.8.0](https://qiita.com/mysticatea/items/cc40251136ce167a010b)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v6.7.0 has been released:<a href="https://t.co/GB8fHji3dq">https://t.co/GB8fHji3dq</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1197951940682035210?ref_src=twsrc%5Etfw">November 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `6.7.0` がリリースされました。
小さな機能追加とバグ修正が行われています。

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

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

# 🚀 本体への機能追加

## 設定ファイルの`ignorePatterns`プロパティ

🔖 [RFC022](https://github.com/eslint/rfcs/blob/master/designs/2019-core-options), [#12274](https://github.com/eslint/eslint/pull/12274)

共有設定を含む設定ファイルで、`ignorePatterns`プロパティが利用できるようになりました。このプロパティは`.eslintignore`と同様に ESLint が無視するファイルをコントロールできます。

```yml:例(.eslintrc.yml)
ignorePatterns:
- "!.eslintrc.js"
- "/node_modules/"
- "**/node_modules/"

extends:
- eslint:recommended

rules:
  quotes: error
  #...
```

## Suggestions API

🔖 [RFC030](https://github.com/eslint/rfcs/tree/master/designs/2019-suggestions), [#12384](https://github.com/eslint/eslint/pull/12384)

あるエラーが複数の修正候補を持つ場合、ESLint は自動修正を行えず、修正候補を提示する手段もありませんでした。新しい Suggestions API を使うと、エディタの ESLint プラグイン等のインタラクティブな UI を通して修正候補を提示できるようになります。

- [ドキュメント](https://eslint.org/docs/developer-guide/working-with-rules#providing-suggestions)
- [`vscode-eslint`の対応状況](https://github.com/microsoft/vscode-eslint/issues/806)

今のところ、ユーザーはまだこの機能を利用できません。各検証ルールとエディタ プラグインのサポートをお待ちください。

## 【非推奨】個人設定ファイル

🔖 [RFC032](https://github.com/eslint/rfcs/tree/master/designs/2019-deprecating-personal-config), [#12426](https://github.com/eslint/eslint/pull/12426)

ESLint が実行されたディレクトリに設定ファイル (`.eslintrc.*`) が存在しなかった場合、ESLint は OS のホーム ディレクトリにある設定ファイルを読み込みます。この機能を個人設定ファイルと呼びます。

この機能が非推奨になりました。

- ESLint 7 以降、この機能を利用すると実行時警告が出力されるようになります。
- ESLint 8 でこの機能は削除されます。

今後もホームディレクトリの設定ファイルを利用したい場合は、CLI オプションで明示的に指定してください。

```console:例
eslint --config ~/.eslintrc.json lib
```

## 【非推奨】`sourceCode#isSpaceBetweenTokens()`

🔖 [#12519](https://github.com/eslint/eslint/pull/12519)

`sourceCode#isSpaceBetweenTokens()`メソッドが名前変更されました。新しい名前は`sourceCode#isSpaceBetween()`になります。

トークンだけでなく AST ノードを渡しても動作するので、単純に名前が間違っていたという理由です。元の名前のメソッドは非推奨メソッドとして残され、将来のメジャーリリースで削除されます (具体的な削除プランは示されていません)。

# 💡 新しいルール

## [grouped-accessor-pairs](https://eslint.org/docs/rules/grouped-accessor-pairs)

🔖 [#12331](https://github.com/eslint/eslint/pull/12331)

Getter と Setter のペアを離れた場所に定義すると警告するルールです。

```js:例
/* eslint grouped-accessor-pairs: error */

//✘ BAD
const obj1 = {
   get value() { },
   foo() { },
   set value(v) { },
}

//✔ GOOD
const obj2 = {
   get value() { },
   set value(v) { },
   foo() { },
}
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IGdyb3VwZWQtYWNjZXNzb3ItcGFpcnM6IGVycm9yICovXG5cbi8v4pyYIEJBRFxuY29uc3Qgb2JqMSA9IHtcbiAgIGdldCB2YWx1ZSgpIHsgfSxcbiAgIGZvbygpIHsgfSxcbiAgIHNldCB2YWx1ZSh2KSB7IH0sXG59XG5cbi8v4pyUIEdPT0RcbmNvbnN0IG9iajIgPSB7XG4gICBnZXQgdmFsdWUoKSB7IH0sXG4gICBzZXQgdmFsdWUodikgeyB9LFxuICAgZm9vKCkgeyB9LFxufVxuIiwib3B0aW9ucyI6eyJwYXJzZXJPcHRpb25zIjp7ImVjbWFWZXJzaW9uIjoxMSwic291cmNlVHlwZSI6Im1vZHVsZSIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6e30sImVudiI6e319fQ==)

## [no-setter-return](https://eslint.org/docs/rules/no-setter-return)

🔖 [#12346](https://github.com/eslint/eslint/pull/12346)

Setter に値を返す`return`文を書くと警告するルールです。[getter-return](https://eslint.org/docs/rules/getter-return) ルールの兄弟です。

```js:例
/* eslint no-setter-return: error */

//✘ BAD
const obj1 = {
    set value(v) {
        return this._value
    },
}

//✔ GOOD
const obj2 = {
    set value(v) {
        if (v == null) return
        this._value = v
    },
}
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLXNldHRlci1yZXR1cm46IGVycm9yICovXG5cbi8v4pyYIEJBRFxuY29uc3Qgb2JqMSA9IHtcbiAgICBzZXQgdmFsdWUodikge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVcbiAgICB9LFxufVxuXG4vL+KclCBHT09EXG5jb25zdCBvYmoyID0ge1xuICAgIHNldCB2YWx1ZSh2KSB7XG4gICAgICAgIGlmICh2ID09IG51bGwpIHJldHVyblxuICAgICAgICB0aGlzLl92YWx1ZSA9IHZcbiAgICB9LFxufVxuIiwib3B0aW9ucyI6eyJwYXJzZXJPcHRpb25zIjp7ImVjbWFWZXJzaW9uIjoxMSwic291cmNlVHlwZSI6Im1vZHVsZSIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6e30sImVudiI6e319fQ==)

## [prefer-exponentiation-operator](https://eslint.org/docs/rules/prefer-exponentiation-operator)

🔖 [#12360](https://github.com/eslint/eslint/pull/12360)

`Math.pow()`関数の代わりに`**`演算子を使うように指示するルールです。

```js:例
/* eslint prefer-exponentiation-operator: error */

//✘ BAD
const b1 = Math.pow(2, 8);
const b2 = Math.pow(a, b);
const b3 = Math.pow(a + b, c + d);
const b4 = Math.pow(-1, n);

//✔ GOOD
const a1 = 2 ** 8;
const a2 = a ** b;
const a3 = (a + b) ** (c + d);
const a4 = (-1) ** n;
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IHByZWZlci1leHBvbmVudGlhdGlvbi1vcGVyYXRvcjogZXJyb3IgKi9cblxuLy/inJggQkFEXG5jb25zdCBiMSA9IE1hdGgucG93KDIsIDgpO1xuY29uc3QgYjIgPSBNYXRoLnBvdyhhLCBiKTtcbmNvbnN0IGIzID0gTWF0aC5wb3coYSArIGIsIGMgKyBkKTtcbmNvbnN0IGI0ID0gTWF0aC5wb3coLTEsIG4pO1xuXG4vL+KclCBHT09EXG5jb25zdCBhMSA9IDIgKiogODtcbmNvbnN0IGEyID0gYSAqKiBiO1xuY29uc3QgYTMgPSAoYSArIGIpICoqIChjICsgZCk7XG5jb25zdCBhNCA9ICgtMSkgKiogbjtcbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6MTEsInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)

## [no-dupe-else-if](https://eslint.org/docs/rules/no-dupe-else-if)

🔖 [#12504](https://github.com/eslint/eslint/pull/12504)

`else-if`文の連鎖の中で、重複する条件式のために常に`false`になる`if`文を警告するルールです。

```js:例
/* eslint no-dupe-else-if: error */

//✘ BAD
if (a || b) {
    //...
} else if (a) {
    //...
}

//✔ GOOD
if (a || b) {
    //...
} else if (c) {
    //...
}
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLWR1cGUtZWxzZS1pZjogZXJyb3IgKi9cblxuLy/inJggQkFEXG5pZiAoYSB8fCBiKSB7XG4gICAgLy8uLi5cbn0gZWxzZSBpZiAoYSkge1xuICAgIC8vLi4uXG59XG5cbi8v4pyUIEdPT0RcbmlmIChhIHx8IGIpIHtcbiAgICAvLy4uLlxufSBlbHNlIGlmIChjKSB7XG4gICAgLy8uLi5cbn1cbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6MTEsInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)

## [no-constructor-return](https://eslint.org/docs/rules/no-constructor-return)

🔖 [#12529](https://github.com/eslint/eslint/pull/12529)

コンストラクタの中で`return`文で値を返すことを禁止するルールです。

```js:例
/* eslint no-constructor-return: error */

//✘ BAD
class B {
    constructor() {
        return {}
    }
}

//✔ GOOD
class A {
    constructor(arg) {
        if (arg == null) return
        this.value = arg
    }
}
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLWNvbnN0cnVjdG9yLXJldHVybjogZXJyb3IgKi9cblxuLy/inJggQkFEXG5jbGFzcyBBIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgfVxufVxuXG4vL+KclCBHT09EXG5jbGFzcyBCIHtcbiAgICBjb25zdHJ1Y3RvcihhcmcpIHtcbiAgICAgICAgaWYgKGFyZyA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgdGhpcy52YWx1ZSA9IGFyZ1xuICAgIH1cbn1cbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6MTEsInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)

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

## [no-underscore-dangle](https://eslint.org/docs/rules/no-underscore-dangle) `allowAfterThisConstructor`

🔖 [#11489](https://github.com/eslint/eslint/pull/11489)

`this.constructor` に続くアンダーバーを許可するオプションが追加されました。

```js:例
/* eslint no-underscore-dangle: [error, { allowAfterThisConstructor: true }] */

//✘ BAD
class B {
    foo(obj) {
        obj.constructor._privateStuff
    }
}

//✔ GOOD
class A {
    foo(obj) {
        this.constructor._privateStuff
    }
}
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLXVuZGVyc2NvcmUtZGFuZ2xlOiBbZXJyb3IsIHsgYWxsb3dBZnRlclRoaXNDb25zdHJ1Y3RvcjogdHJ1ZSB9XSAqL1xuXG4vL+KcmCBCQURcbmNsYXNzIEIge1xuICAgIGZvbyhvYmopIHtcbiAgICAgICAgb2JqLmNvbnN0cnVjdG9yLl9wcml2YXRlU3R1ZmZcbiAgICB9XG59XG5cbi8v4pyUIEdPT0RcbmNsYXNzIEEge1xuICAgIGZvbyhvYmopIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5fcHJpdmF0ZVN0dWZmXG4gICAgfVxufVxuIiwib3B0aW9ucyI6eyJwYXJzZXJPcHRpb25zIjp7ImVjbWFWZXJzaW9uIjoxMSwic291cmNlVHlwZSI6Im1vZHVsZSIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6e30sImVudiI6e319fQ==)

## [no-implicit-globals](https://eslint.org/docs/rules/no-implicit-globals) `lexicalBindings`

🔖 [#11996](https://github.com/eslint/eslint/pull/11996)

レキシカル スコープの宣言 `class`, `const`, `let` も警告するルールが追加されました。

```js:例
/* eslint no-implicit-globals: [error, { lexicalBindings: true }] */

//✘ BAD
class B {}
const b1 = 0
let b2 = 0

//✔ GOOD
{
    class A {}
    const a1 = 0
    let a2 = 0
}
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLWltcGxpY2l0LWdsb2JhbHM6IFtlcnJvciwgeyBsZXhpY2FsQmluZGluZ3M6IHRydWUgfV0gKi9cblxuLy/inJggQkFEXG5jbGFzcyBCIHt9XG5jb25zdCBiMSA9IDBcbmxldCBiMiA9IDBcblxuLy/inJQgR09PRFxue1xuICAgIGNsYXNzIEEge31cbiAgICBjb25zdCBhMSA9IDBcbiAgICBsZXQgYTIgPSAwXG59XG4iLCJvcHRpb25zIjp7InBhcnNlck9wdGlvbnMiOnsiZWNtYVZlcnNpb24iOjExLCJzb3VyY2VUeXBlIjoic2NyaXB0IiwiZWNtYUZlYXR1cmVzIjp7fX0sInJ1bGVzIjp7fSwiZW52Ijp7fX19)

## [no-useless-computed-key](https://eslint.org/docs/rules/no-useless-computed-key) `enforceForClassMembers`

🔖 [#12110](https://github.com/eslint/eslint/pull/12110)

クラス構文の不要な Computed Keys も警告するオプションが追加されました。

```js:例
/* eslint no-useless-computed-key: [error, { enforceForClassMembers: true }] */

//✘ BAD
class B {
    ["foo"]() { }
}

//✔ GOOD
class A {
    [foo]() { }
}
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLXVzZWxlc3MtY29tcHV0ZWQta2V5OiBbZXJyb3IsIHsgZW5mb3JjZUZvckNsYXNzTWVtYmVyczogdHJ1ZSB9XSAqL1xuXG4vL+KcmCBCQURcbmNsYXNzIEIge1xuICAgIFtcImZvb1wiXSgpIHsgfVxufVxuXG4vL+KclCBHT09EXG5jbGFzcyBBIHtcbiAgICBbZm9vXSgpIHsgfVxufVxuIiwib3B0aW9ucyI6eyJwYXJzZXJPcHRpb25zIjp7ImVjbWFWZXJzaW9uIjoxMSwic291cmNlVHlwZSI6InNjcmlwdCIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6e30sImVudiI6e319fQ==)

## [no-invalid-this](https://eslint.org/docs/rules/no-invalid-this) `capIsConstructor`

🔖 [#12308](https://github.com/eslint/eslint/pull/12308)

ES5 スタイルのコンストラクタ (名前が大文字で始まる関数) をコンストラクタとして扱わないオプションが追加されました。React では関数コンポーネントに大文字で始まる関数名を使う習慣があるためです。

```js:例
/* eslint no-invalid-this: [error, { capIsConstructor: false }] */

//✘ BAD
function Foo() {
    this.value = 0
}
```

> [Online Playground](https://eslint.org/demo#eyJ0ZXh0IjoiLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogW2Vycm9yLCB7IGNhcElzQ29uc3RydWN0b3I6IGZhbHNlIH1dICovXG5cbi8v4pyYIEJBRFxuZnVuY3Rpb24gRm9vKCkge1xuICAgIHRoaXMudmFsdWUgPSAwXG59XG4iLCJvcHRpb25zIjp7InBhcnNlck9wdGlvbnMiOnsiZWNtYVZlcnNpb24iOjExLCJzb3VyY2VUeXBlIjoibW9kdWxlIiwiZWNtYUZlYXR1cmVzIjp7fX0sInJ1bGVzIjp7fSwiZW52Ijp7fX19)

# ✒️ `eslint --fix` をサポートしたルール

特になし。

# ⚠️ 非推奨になったルール

特になし。