最近のESLintStylelintの設定を公開

2021-10-25

最近 ESLint と Stylelint の設定が固まってきたので、公開をば。


環境

以下の環境を前提としますが、Create React App でもそこまで変わらない気がします。

  • Next.js
  • TypeScript
  • CSS Modules(Sass)
  • Prettier

ESLint

ESLint に関わるパッケージ一覧

  • "@typescript-eslint/eslint-plugin": "5.1.0",
  • "eslint": "7.32.0",
  • "eslint-config-google": "0.14.0",
  • "eslint-config-next": "11.1.2",
  • "eslint-config-prettier": "8.3.0",
  • "eslint-plugin-css-modules": "2.11.0",
  • "eslint-plugin-filenames": "1.3.2",
  • "eslint-plugin-sort-destructure-keys": "1.4.0",
  • "eslint-plugin-sort-keys-shorthand": "2.1.0",
  • "eslint-plugin-typescript-sort-keys": "2.0.0",

"next": "11.1.2" では ESLint の v8 はまだ対応されていないようです。

@typescript-eslint/eslint-plugin は不要そうに見えるのですが、一部のエラーを抑えるためにしぶしぶ導入しています。

ESLint の設定

結構てきとうです。

{
  "extends": [
    "eslint:recommended",
    "google",
    // ここがないとエラーが抑えられない
    "plugin:@typescript-eslint/recommended",
    "plugin:css-modules/recommended",
    "plugin:typescript-sort-keys/recommended",
    "next/core-web-vitals",
    "prettier"
  ],
  "ignorePatterns": ["commitlint.config.js", "next.config.js"],
  "overrides": [
    {
      "excludedFiles": ["_app.tsx", "_document.tsx"],
      "files": "*",
      "rules": {
        "filenames/match-exported": ["error", [null, "camel"]],
        "filenames/match-regex": "error"
      }
    }
  ],
  "plugins": [
    "css-modules",
    "filenames",
    "sort-destructure-keys",
    "sort-keys-shorthand",
    "typescript-sort-keys"
  ],
  "root": true,
  "rules": {
    "@typescript-eslint/explicit-function-return-type": "error",
    "import/order": [
      "error",
      {
        "alphabetize": {
          "caseInsensitive": true,
          "order": "asc"
        }
      }
    ],
    "newline-before-return": "error",
    "no-console": "error",
    "no-multiple-empty-lines": [
      "error",
      {
        "max": 1
      }
    ],
    "react/jsx-sort-props": "error",
    "require-jsdoc": "off",
    "semi": "error",
    "sort-destructure-keys/sort-destructure-keys": "error",
    "sort-keys": "off",
    "sort-keys-shorthand/sort-keys-shorthand": "error"
  }
}

開発中常に手を加えるためこれが正解ではまったくないです、悪しからず。

Stylelint

Stylelint に関わるパッケージ一覧

ESLint と同様に。

  • "postcss-scss": "4.0.1",
  • "stylelint": "14.0.0",
  • "stylelint-config-css-modules": "2.2.0",
  • "stylelint-config-prettier": "9.0.3",
  • "stylelint-config-recommended-scss": "5.0.0",
  • "stylelint-config-sass-guidelines": "8.0.0",
  • "stylelint-config-standard": "23.0.0",
  • "stylelint-config-standard-scss": "2.0.0",
  • "stylelint-order": "5.0.0",
  • "stylelint-scss": "4.0.0",

"stylelint": "14.0.0" のメジャーアップデートから仕様がガラッと変わり、postcss-scss のインストールが必須になったみたいです。

Stylelint の設定

{
  "overrides": [
    {
      "customSyntax": "postcss-scss",
      "extends": [
        "stylelint-config-standard-scss",
        "stylelint-config-standard",
        "stylelint-config-css-modules",
        "stylelint-config-recommended-scss",
        "stylelint-config-sass-guidelines",
        "stylelint-config-prettier"
      ],
      "files": ["**/*.scss"],
      "plugins": ["stylelint-order", "stylelint-scss"],
      "rules": {
        "at-rule-no-unknown": null,
        "color-named": [
          "never",
          {
            "ignore": ["inside-function"]
          }
        ],
        "order/properties-alphabetical-order": true,
        "scss/at-rule-no-unknown": [
          true,
          {
            "ignoreAtRules": ["value"]
          }
        ],
        "selector-class-pattern": null,
        "selector-pseudo-class-no-unknown": [
          true,
          {
            "ignorePseudoClasses": ["export", "global"]
          }
        ]
      }
    }
  ]
}

全体を override していますが、これが必須かどうかはよくわかっていないです。

アルファベット順のソートが大好きなので、ちょっと偏った設定になってはいます。


そんな感じです。

ESLint 側はともかく、Stylelint のほうは v14 からガラッと仕様が変わったため、まだ不安定なところも多い印象です。

とはいえ、現状問題なく動いているので動作保証は大丈夫かとー。