👌

node プロジェクトでも deno lint | deno fmt する

2022/01/12に公開

なぜ

  • npm ツールチェインで消耗した
  • こういうところでシュッと deno を入れておくことで、あわよくば本番で使う準備をする

経緯

  • 久々に eslint の設定を見直したらやたら長大な感じでメンテがしんどくなった
  • npm/yarn workspace で monorepo 化した際に、様々な eslint のバージョンが混在して peer-deps の管理が困難になった
  • deno に組み込まれてる lint, fmt は deno かどうかはあまり関係なく、単に typescript なら使える
  • eslint + typescript をメンテするより、 eslint 吹き飛ばして deno で全部やったほうが楽では
    • 当然だけど .vue とか .svelte はパースできないので対象外

やる

https://deno.land/ に従って deno をインストール。 (curl -fsSL https://deno.land/install.sh | sh)

deno.jsonc に設定を書く

{
  "compilerOptions": {
    "lib": ["deno.window"],
    "strict": true
  },
  "lint": {
    "files": {
      "include": [
        "src"
      ],
      "exclude": ["node_modules"]
    },
    "rules": {
      "tags": ["recommended"],
      "exclude": [
        "no-unused-vars",
        "no-implicit-any",
        "no-explicit-any",
        "require-await",
        "ban-ts-comment"
      ]
    }
  },
  "fmt": {
    "files": {
      "include": [
        "src",
        "deno.jsonc"
      ],
      "exclude": ["node_modules"]
    },
    "options": {
      "useTabs": false,
      "lineWidth": 100,
      "indentWidth": 2,
      "singleQuote": true
    }
  }
}

まだ glob pattern での指定はできないっぽいので、ディレクトリ単位で指定する。 (当然だけど deno は node_modules も追ってしまうので除外する)

実行する

$ deno lint -c deno.jsonc 
Checked 1 file

$ deno fmt -c deno.jsonc
Checked 2 files

vscode の設定

vscode に vscode_deno を入れる。

Using Visual Studio Code | Manual | Deno

.vscode/settings.json
{
  "deno.enable": false,
  "deno.lint": true,
  "deno.config": "./deno.jsonc",
  "[typescript]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "denoland.vscode-deno"
  }
}

lint 目的で使う場合、 deno.enable: true しない。これを有効にすると、依存の解決のルールが deno になってしまい (LSPが乗っ取られる)、node とは非互換になる。

というわけで format だけ有効にしておく。このとき、 prettier 拡張が入ってると競合するので、 vscode の拡張管理から disable(workspace) する。

GitHub Actions で使う

GitHub Actions 上で deno を実行する

.github/workflows/test.yml
name: test

on:
  push:

permissions:
  contents: read
jobs:
  test:
    runs-on: Ubuntu-20.04
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - uses: denoland/setup-deno@v1
        with:
          deno-version: v1.17.1
      - name: Use Node.js 16
        uses: actions/setup-node@v2
        with:
          node-version: 16
          cache: 'yarn'
          cache-dependency-path: yarn.lock
      - run: yarn install
      - run: deno lint -c deno.jsonc
      - run: deno fmt -c deno.jsonc --check

特に苦労するところとかなくシュッと動いた

おわり

というのが動いてるだけのサンプルリポジトリを作った。https://github.com/mizchi/lint-with-deno

Discussion