👌
node プロジェクトでも deno lint | deno fmt する
なぜ
- npm ツールチェインで消耗した
- こういうところでシュッと deno を入れておくことで、あわよくば本番で使う準備をする
経緯
- 久々に eslint の設定を見直したらやたら長大な感じでメンテがしんどくなった
- npm/yarn workspace で monorepo 化した際に、様々な eslint のバージョンが混在して peer-deps の管理が困難になった
- deno に組み込まれてる lint, fmt は deno かどうかはあまり関係なく、単に typescript なら使える
- 中身は https://dprint.dev/ と https://github.com/denoland/deno_lint
- deno lint は eslint の recommended 相当のものは実装してある
- 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