🧊

AstroコンパイラのRust実装を読む

AIのせいでちゃんと書く気が起きないのでざっくり。

Experimental Rust compiler | Docs https://docs.astro.build/en/reference/experimental-flags/rust-compiler/

今までGoで書かれてたけど、Rustにするよってやつ。

A new compiler for Astro · withastro/roadmap · Discussion #1306 https://github.com/withastro/roadmap/discussions/1306

先月リリースされたAstroのv6から利用できるようになってる、experimentalな機能。

withastro/compiler-rs

withastro/compiler-rs: The Astro compiler https://github.com/withastro/compiler-rs

どうやらこのリポジトリが、コンパイラーとしての表向きの実装らしい。 TSから使えるように、napi-rsでビルドしてる。

  • ASTのJSONを返すparse()
  • コンパイルしてメタデータ化するtransform()

この2つがAPIとして公開されてる。

肝心のparserとかの実装がないな?って思ったら、それは別になってた。

withastro/oxc

withastro/oxc at feat/astro https://github.com/withastro/oxc/tree/feat/astro

それがこっちで、なんと我らがOxcリポジトリのforkだった。

Astro対応をいれたブランチがそのままPRとしても見えるようになってる。

feat: some sort of Astro support by Princesseuh · Pull Request #2 · withastro/oxc https://github.com/withastro/oxc/pull/2

変更としては、

  • oxc_span: SourceType::Astro
  • oxc_ast: Astro関連のASTを追加
    • AstroRoot
    • AstroFrontMatter
    • AstroScript
    • AstroDoctype
    • AstroComment
  • oxc_parser: Astro関連のパースロジックの追加
    • 既存のparse()の隣に、parse_astro()が生えてる
    • cfg(feature = "astro")されてる
    • AstroはJSXライクでありJSXではないので、Lexerから手を入れ直してる

というあたり。

<style>はパースせず、単なるJSXElementとして中身はそのまま保持。compiler-rs側でspanから切り出して、別の実装に投げてた。

当時から、Oxcベースってのは知ってたけど、oxc_allocatorとかそういう公開crateを使って、独自に実装してるんだと勝手に思い込んでた。

実際は、がっつりリポジトリごとforkして実装されてた!

Erikaさん一人でやってる風ではあるが、どういうステータスなんだろうか。MDXパーサーとかもやってて忙しそうではある。

formatter対応もあった

feat: add support for formatting Astro files by Princesseuh · Pull Request #5 · withastro/oxc https://github.com/withastro/oxc/pull/5

この流れならそりゃあ当然ではあるが、oxc_formatterのJS/TSXを扱うコードの中に、AstroのJSXライクなテンプレ処理が織り込まれてる。

これが完全なJSXだったなら、こんな苦労はなかったとも思いつつ、まぁいろいろあるわな〜。

さて、つぎはTSRX対応のことを考えないといけないのだろうか・・・。

TSRX | TypeScript Language Extension for Declarative UI https://tsrx.dev/