突然ですが1週間の活動を週報という形でまとめておこうと思い立ちました。基本的に三日坊主のため継続できるか怪しいですが、とりあえずやってみます。

denoland/deno

Issue

  • setTimeout still consumes time even if it's followed by clearTimeout
    • setTimeout した直後に clearTimeout しても、時間消費自体はキャンセルされずに行われてしまう、という問題を見つけました。自力で直そうとしたのですが Rust と JavaScript の相互作用をするレイヤーをいじる必要があり、うまい方針が思いつかなかったため issue として起票しました。

Pull Request

  • fix(fmt,lint): do not print number of checked files when quiet option is enabled
    • deno fmtdeno lint で、検査対象となったファイルの数を出力する機能があるのですが、--quiet フラグをつけたときにもこの出力が出てしまうというバグがありました。その修正です。
  • fix(logger): change log level to which prefix is added
    • 上記の修正をしている間に発見したのですが、JavaScriptレイヤーのデバッグログは DEBUG JS - foobar のように出力されるのに、Rustのデバッグログは foobar とだけ出ていました。一方、Rustはエラーレベルのログに対して ERROR RS - foobar というようにprefixがつくようになっていました。JSとRustで統一されていないのはおかしいだろうということで、修正してPRを立てました。

denoland/deno_lint

Issue

  • Rules that should be refined further
    • deno_lint は ESLint と typescript-eslint の recommended ルールを一通り移植することが完了しており、次のフェーズに進もうとしている段階です。そんな中で、ルールの実装を一通り見直してみると、コーナーケースに対応できていなさそうに見えるものがいくつかありました。それらをチェックリストで管理しながら修正していこう、という目的で立てた issue です。
  • Add prefer-const rule
    • prefer-const ルールを追加しようという issue です。このルールは ESLint の中でも特に有用なルールだと個人的には思っていますが、まだ deno_lint には実装されていなかったようです(逆に驚き)。オリジナルの実装を見てみると、かなり大変そうということが分かりますが、良い機会なので挑戦してみることにしました。来週はこちらの実装をメインで頑張っていきます。

Pull Request

上で挙げた、実装を少し手直しする必要があるものについてのPRです。

RDambrosio016/RSLint

deno_lint のとある issue の中にひっそりと貼られていたリンクで、RSLint という新進気鋭のRust製 JavaScript Linter があることを知りました。

作者のブログを読むと、かの rust-analyer が採用しているデータ構造を使い、柔軟な lint rule 実装が可能になるとのこと。実際、deno_lint でいくつかルールを実装した僕としても、ASTだけに頼った lint rule 記述はかなり窮屈で、ESLint のオリジナルの挙動を完全に模倣できているか不安な部分も結構あったりしている、という実感がありました。

そういうわけで RSLint のアーキテクチャにとても興味をもち、リポジトリを watch し始めてみたら、ちょうどいいタイミングで good first issue が作られました。これをきっかけに今週1週間でいくつかPRを送ることができたので、それをまとめます。

Pull Request

  • Docs: Add no-await-in-loop doc
    • good first issue だったものです。no-await-in-loop にドキュメントを追加するというもの。まだ若いプロジェクトなのに、ドキュメント生成の仕組みなどもとてもしっかり整備されていて、良い開発者体験を得ました。あと、deno_lintno-await-in-loop を実装したのは僕で、実装のときはAST-basedなやり方の縛りをモロに受ける形となってかなり苦労したのですが、RSLint での実装を見てみるととってもシンプルで、素直に書かれていました。RSLint のアーキテクチャが優れていることをさらに実感しました。
  • Chore: allow macros to deal with trailing commas
    • ルール実装やテストケースの作成などで使われているマクロが、trailing commaを受け付けないようになっていました。僕は trailing comma を付けたい派です。マクロが trailing comma を受け付けられるように修正しました。
  • Fix: allow cons method to work if there is no else block
    • if statement について、 else ブロックが存在しない場合に if (foo) { /* ここ */ } の「ここ」部分のブロックを正しく取得できなかったので、修正しました。= を追加するだけという、人生で最も小さいPRです。
  • Feat: add no-setter-return
    • no-setter-return ルールを実装するPRです。すでに存在していた gette-return ルールを参考にしつつではありますが、新規のルールを作成するという経験をすることができました。ルール自体が複雑なため RSLint のアーキテクチャをもってしても多少込み入った実装にはなりましたが、とはいえとても苦しい、ということはなかったです。
  • Refactor: make getter-return be consistent with others
    • getter-return ルールのリファクタリングです。

eslint/eslint

Pull Request

typescript-eslint/typescript-eslint

Pull Request