🧊

Biome Formatter と Prettier の互換性について

Prettierのコードを読んだなら、BiomeのFormatterのコードも読んでみたい・・・が、その前にちょっと調べ物。

去年かな?Prettierと95%以上の互換性を持つRust製のツールに賞金が出るぞチャレンジがあって、それを勝ち取ったのがBiomeだった。

The Prettier Challenge | Algora https://console.algora.io/challenges/prettier

というわけで、だいぶ今さらではあるし疑うわけでもないけど、あのPrettierのコードを読んだ後だと、95%って本当に可能なんか?!って気持ちでいっぱいなので、その実態も調べておきたいと思い。

Challenge specs

このチャレンジのルールをみると、

Winning the Grand Prize requires passing > 95% of the prettier JavaScript tests. The scope for the challenge is JavaScript — only ES6 syntax is required. TypeScript, GraphQL, CSS, or any other embedded language or unstable syntax are out of scope for the challenge. All formatting options must be supported.

ということで、ES6なJSだけ対応すればいいということらしい。

互換性のレポート

https://github.com/biomejs/biome/blob/main/crates/biome_js_formatter/report-challenge.md

ここにまとまってる。

https://github.com/biomejs/biome/blob/main/crates/biome_js_formatter/report-es2015.md https://github.com/biomejs/biome/blob/main/crates/biome_js_formatter/report-es2024+.md

この2ファイルが詳細で、スナップショットと差分がわかるようになってて、どっちも96-97%と高い互換性。

で、やはりignoreしてるテストもあるようで、思ってたよりもいろいろignoreされてて安心した。

https://github.com/biomejs/biome/blob/041e8251d26942cc47185c2c49a7904ac79b7d61/crates/biome_formatter_test/src/diff_report.rs#L105

(ちゃんと数えてないけど、100ファイルはいかないけど50ファイルくらいには届くかも?くらい?)

いくつかはBiomeが意図して差分とするがゆえに、ignoreしてるものもあるとのこと。

☂️ Prettier Divergence collection from the Prettier challenge · Issue #739 · biomejs/biome https://github.com/biomejs/biome/issues/739

レポート生成の流れ

https://github.com/biomejs/biome/blob/041e8251d26942cc47185c2c49a7904ac79b7d61/crates/biome_js_formatter/tests/specs/prettier/README.md

ここに書いてあった。

なるほど。

ちなみに、互換性の計算ロジックはこうなってるらしい。

📎 Prettier Compatibility Metric · Issue #2555 · rome/tools https://github.com/rome/tools/issues/2555#issuecomment-1124787893

あの頃はまだRomeだったのね。