2022年の6月は、GitHub主催でMaintainer Monthは、オープンソースのメンテナーが集まって情報共有したり、メンテナーを祝ったり、支援したりするイベントが行われていました。

Maintainer Monthに気づいたのはThank you to our maintainers | The GitHub Blogのとき(6/24)なのだったので、残り一週間でしたがオープンソースのメンテナンスとメンテナーについて色々書いていました。

オープンソースのメンテナーそのものに関する話って意外と書く機会がないので、ちょうどいい機会だと思って書いてみました。 Maintainer Monthのイベントの目的もそうですが、メンテナーとしての自分の話を色々書いてみたので興味があったら読んでみてください。

オープンソースのメンテナーがやっている仕事(タスク)

Maintainer Monthは6月で終わったので、6月にやっていたオープンソースのメンテナンス関係のタスクを振り返ってみます。 実際オープンソースのメンテナンスでどういうことやってるのかを参考になるかなーと思います。

自分は色々なオープンソースをやるタイプなので、それぞれライブラリ/ツール/プロダクトなどで書いていきます。

JavaScript Primer

これは、今年の1月ぐらいから徐々にやっていましたがjsprimerをES2022に対応しました。 ES2022の仕様に合わせてリリースする予定だったので、事前にリリースノートまでは用意しておいて、リリースされた記事などを書いてリリースしました。

ES2022は結構変更が多かったので大変だった。

textlint

RFC: Improve error location · Issue #835 · textlint/textlintというエラー位置の詳細情報を含めるというRFCを実装を完了して、リリースまで持っていくのをやっていました。

実装自体は、結構前に大体できていたんですが、結構大きな範囲の変更(ファイルを100コ近くいじってる)が必要になってしまって、その確認が重たくて放置していました。 これが、Maintainer Month: オープンソースをメンテナンスするコツでも言ってた、「小さなリズム」でやるべき理由でもありますね。

この過程でバリデーションを色々強化していたのですが、GitHub Copilotの補完が便利でした。

そのほかには、Twitterでtextlint関係のエラーの話をみて、詳細をIssueとして作ってもらって、調べてみたらtextlintのコアではなくルール側のバグだったのでこれを修正していました。textlintのコア自体は大きくならないようにしてますが、調べてみないとどっちのバグか分かりにくいという状況はたまにあります。

この辺ももっと切り分けがしやすくできるといいなーと思いながら、修正していました。

github-advisory-database-rss

github-advisory-database-rssというGitHub Advisory Databaseの脆弱性情報をRSSとして取得できるサイトを作ってます。

GitHub Advisory DatabaseがErlangとElixirに対応したので、RSS Feeds for GitHub Advisory Databaseも同じく対応していました。

ついでなので、依存関係も一緒にアップデートしていました(自分はこういうときに依存も上げてしまうこと多い)。

TypeScriptを使ったNode.js ESMの対応(失敗)

check-ends-with-periodというライブラリはTypeScriptで書かれています。 TypeScript 4.7+でNode.js ESMサポートしたというのでこのライブラリで実験してみようと思って対応していました。

実際にやってみたらできないという現実にぶつかって失敗しました。

理想的には、同じsrc/*.txからCJS向けのファイルとESM向けのファイルをそれぞれ出力したいという構成でやりたい感じでした。

TypeScriptでは、ESMをimportするには.tsのファイルでimport foo from "./foo.js" のように.js拡張子をつけてimportする必要があります しかし、TypeScript Design Goalsでは、import pathを書き換えないなどの原則があります。 また、Node.jsのESMサポートはtype: modulepackage.jsonに書くと、.jsファイルはESMとして扱われます。これは同じ.js拡張子でESMとCJSを出し分けるのが無理という話になっています。 (ものすごい非合法的なハックはあります。)

TypeScriptのデザインとNode.jsのESMサポートの仕組みが噛み合ってなくて、tsconfigファイルでCJSとESMをだし分けたいみたいなやり方ができないことに気がつきました。 詳細は同じような話をしていたIssueに書いています。

なのでやってみたけど、失敗して保留しています。(もちろんbundlerとか別のツールを使えばできるけど、tscのみでやりたい)

safe-marked

safe-markedmarkedDOMPurifyを組み合わせて、デフォルトで安全なHTMLを出力するMarkdown変換器です。

内部的に使ってるJSDOMがメジャーアップデートしてたので、更新してました。 このリポジトリはrenovatebotでmajorのPRが出るので、それに反応して作業してます。

Secretlint

Secretlintは、パスワードとかAPIトークンとかの機密情報をチェックするLintツールです。

こっちもTypeScript 4.7で、CJSでのDynamic Importが正式にサポートされたので、TSをアップデートしたのでそこに対応していました。CJSでのDynamic Importは、ESMでルールとかプラグインを書くために必要になってます。

また、secretlintignore-が使えないバグが報告されたので、これを修正していました。

あとは、SecretlintのDocker ImageにSARIFフォーマットの対応が入ってた方がいいんじゃない?というIssueがきたので、そうだよねって話をしてPR出してもらって入れていました。

HonKit

HonKitはGitBookのForkですが、GitBook時代からある気がするバグが報告されたのでそれを修正していました。

@security-alert

SARIFファイルをGitHubのコメントとして書いたり、整形できる@security-alertをツールをやっていて、 最近これのCo-Authorが増えたのでレビューとかしていました。 あとはOrganizationに移したり、allstar設定したりとかしていました。

JSer.info

毎週記事を書いた。

まとめ

6月にやっていたオープンソース活動はこんな感じでした。

基本的に重要な通知はいまだにメールで受け取っていますが、メール開く気分じゃないときって結構あるので、Issueのトリアージとかだけでもやってくれる人いると結構助かるなーって印象です。 でも、Issueのトリアージやってくれる人って意外と多くないから、結構難しいだよなーって感じもしました。(いい感じにHelp Wantedを明示できるといいのだけど)