期間: 2026-09-24 〜 2026-09-28 · PR 52 件(新機能 4 / 変更・修正 23 / その他 25)

新機能

型認識ルール typescript/no-generated-empty-object-type を追加(#26958)

何ができるようになったか

Pick<Data, never> のように、型操作の結果が {} になってしまうものを報告する型認識(type-aware)ルールを suspicious カテゴリに追加した。型解析は TSGolint 側で行い、ルールにはオプション・自動修正・サジェスチョンは無い。

  • 使い方: 設定で typescript/no-generated-empty-object-type を有効にし、--type-aware で実行する
  • 注意: tsgolint#1229 を含むバックエンドが必要。この PR では固定しているバックエンドパッケージのバージョンは変えていない

⏳ 未リリース · トピック: 型認識Lint

oxc-transform-react に reportDiagnostics オプションを追加(#26624)

何ができるようになったか

オプトインの reactCompiler.reportDiagnostics を追加した。true にすると、コンパイルに成功したときに React Compiler が出した回復可能な診断が、コンパイラが付けた重大度(Suppression は Error、IncompatibleLibrary は Warning など)のまま result.errors に追加される。fatal は従来どおり code が使えるかどうかを表す。既定値は変わらず、回復可能な診断は含めない(Babel の既定 logger: null に合わせたもの)。

  • 使い方: reactCompiler: { reportDiagnostics: true }
  • 嬉しい場面: 関数がなぜコンパイルされずスキップされたかを知りたいとき(コンパイラ導入時の棚卸しや、eslint-disable による抑制が実際に効いたかの確認)。@vitejs/plugin-react の logDiagnostics はこのオプションに転送するだけで動くようになる

⏳ 未リリース · トピック: React-Compiler

正規表現パーサーがバッファ境界アサーションに対応(#27048)

何ができるようになったか

oxc_regular_expression に、regjsparser の #166 を移植し、仕様に沿ったバッファ境界アサーションのパースを追加した。上流の 90 ケースすべてを取り込んでいる。

⏳ 未リリース · トピック: パーサー

oxc_str に JSStr・JSChar・JSStrBuilder 型を追加(#26435)

何ができるようになったか

#26242 の一部として、JSStr・JSChar・JSStrBuilder 型と、後続 PR で使う多数のメソッドを追加した。Miri の CI ワークフローも更新している。

⏳ 未リリース · トピック: oxc_str

変更・修正

React Compiler が暗黙の arguments オブジェクトでは最適化をやめるように(#26896)

Before

暗黙の arguments オブジェクトを使うコードもコンパイルしており、連続したレンダーで値が更新されない(1 → 1)ことがあった。

After

React 本家の 59aff3e を移植し、arguments を使う場合はコンパイルを中止(bail out)する。連続レンダーが 1 → 2 になることを確認済みで、5 つのベンチマークで性能低下は見られなかった。

⏳ 未リリース · トピック: React-Compiler

HTML コメントの値の扱いを修正(#22933)

Before

HTML コメントの値からコメント記号が正しく取り除かれず、行の途中で出力される閉じ注釈が不正になることがあった(#22803)。

After

HTML コメントの記号を完全に取り除きつつコメントの範囲は保持し、行の途中で出力されても閉じ注釈が正しくなるようにした。AST・ESTree シリアライズ・codegen・oxlint の JS プラグイン用コメントにも手が入っている。

⏳ 未リリース · トピック: パーサー

JSDoc の行末のダブルスペースを保持するように(#26861)

Before

/** コメントの各行をすべて trim() して出力していたため、Markdown の改行(ハードブレーク)を意味する行末のダブルスペースが消えていた。

After

Prettier の printIndentableBlockComment に合わせ、/** コメントの中間行で行末に 2 つ以上の空白がある場合は、ちょうど 2 つを残す。* だけの行・空白 1 つ・開始行・JSDoc でないブロックコメントは従来どおり trim する。出力は Prettier 3.9.8 とバイト単位で一致(#26854)。

⏳ 未リリース · トピック: Oxfmt

フォーマッタが /*** コメントも JSDoc として扱うように(#27035)

Before

本来の JSDoc の定義どおり /** だけを JSDoc として扱っていた。

After

JSDoc 3 を壊さない範囲で広く扱うほうがフォーマッタには都合がよいとして、/*** も JSDoc として扱う(TypeScript も /** に限定していない)。差異は DIVERGENCES.md に記載。

⏳ 未リリース · トピック: Oxfmt

隣接するブロックコメントの揃え方を Prettier に合わせる(#27036)

Before

隣接(入れ子状に並んだ)ブロックコメントを、Prettier の merge-nestled-jsdoc-comments と同じようには扱っていなかった。

After

Prettier の該当処理に合わせて、隣接するブロックコメントをまとめて揃えるようにした。

⏳ 未リリース · トピック: Oxfmt

通常のブロックコメントの行末スペースを保持するように(#27037)

Before

通常のブロックコメントでは最初の行だけ行末スペースを削っており、一貫していなかった(CSS のブロックコメントの挙動とも違っていた)。

After

通常のブロックコメントの行末スペースはユーザーのものとして残す(#17786)。

⏳ 未リリース · トピック: Oxfmt

JSDoc の整形を元のプラグインにさらに合わせる(#27039)

Before

先頭にない JSDoc や legal コメントの扱い、ハードブレーク用の行末スペース、詰められる箇所の余分な空白が、元の JSDoc プラグインと違っていた。

After

先頭以外の JSDoc と legal コメントを扱い、行末の 2 スペース(ハードブレーク)を保持し、詰められるときは不要な空白を取り除くようにした。

⏳ 未リリース · トピック: Oxfmt

代入演算子の前のコメントが消える・重複する問題を修正(#26997)

Before

oxfmt 0.69.0(#26725)以降、type myType /* Comment */ の後に改行して = // Comment と続く入力で、ブロックコメントが消え、行コメントが 2 回出力されていた。const・代入・クラスやオブジェクトのプロパティ、演算子の後の // oxfmt-ignore でも同じ問題があった(#23665)。

After

演算子の前に未出力のコメントがある間は演算子の直後に何も付けず、すべてをソース順に右辺の先頭コメントとして出力する。出力は 0.68.0 と同じに戻り、型エイリアスでは Prettier 3.9.6 と一致する。

⏳ 未リリース · トピック: Oxfmt

= まわりのコメントを元の側・元の行に保つ(#27041)

Before

#26997 の修正後も、= の前後のコメントの置き場所はプロジェクトの一貫した方針に揃っていなかった。

After

= の周りのコメントを、元にあった側と行に保つ方針を適用した。DIVERGENCES.md と Prettier コンフォーマンスのスナップショットも更新。

⏳ 未リリース · トピック: Oxfmt

React Compiler のべき乗演算を JavaScript の意味に合わせる(#26895)

Before

定数伝播などで扱う ** / **= の結果が、JavaScript の意味と一致しない場合があった。

After

React 本家の 2b19aecd0e を移植し、** と **=(非有限値やシャドウされた NaN を含む)の回帰テストを追加した。

⏳ 未リリース · トピック: React-Compiler

非 8 進数の数値で . や e の後の _ をエラーにしないように(#27072)

Before

09.1_1・09e1_1・08.1_2e3_4 のような正しい非 8 進数リテラルでエラーになっていた。

After

oxc_parser と同じくエラーにしない。これで lexer の Babel コンフォーマンスが 100% に達した。

⏳ 未リリース · トピック: レキサー基盤

JS プラグインの CFG ウォーカーが undefined の子要素でクラッシュしないように(#27075)

Before

declare module "*.css"; のように body を持たない宣言があると、コードパス解析を使う JS プラグインがクラッシュしていた(#27054)。

After

通常の AST ウォーカーと同様に undefined の子要素をスキップする。.ts と .d.ts でコードパスイベントが発火することを確認する E2E テストを追加。

⏳ 未リリース · トピック: JSプラグイン

--type-check-only モードでは型認識ルールを実行しないように(#27076)

Before

--type-check-only では無効化コメントを集める lint パスを飛ばすのに型認識ルールは実行されていたため、抑制したはずの lint エラーが出力に漏れ、デバッグビルドではアサーションに失敗していた(voidzero-dev/vite-plus#2830)。

After

type_check_only を TSGolint に渡し、ルールの一覧を空にしてファイルを送る。本物の TypeScript エラーは引き続き報告される。

⏳ 未リリース · トピック: 型認識Lint

引数なしの new Date を不純として扱う(#26894)

Before

レンダー中の引数なしの new Date() を不純な呼び出しとして扱っていなかった。

After

React 本家の Date の純粋性チェック(ff8f88f)をそのまま移植し、引数なしの Date 呼び出しを不純とする。タイムスタンプを渡す生成は引き続き許可。React Compiler に加えて lint ルール react/purity にも同じ判定を入れた。

⏳ 未リリース · トピック: React-Compiler

レキサーの文脈解析が正しいコードを誤読する問題を修正(#27085)

Before

正しいコードでも、let の後の of と改行・async(...) の呼び出し引数・implements 付きのクラス・export = {} などで、正規表現と除算の判別を誤っていた。export async function・export declare global・別行のインターフェースメンバーの後の状態も誤っていた。

After

これらを修正。ユニットテストは 2 回(2 回目はアンカーとショートカットを無効にして)字句解析して結果が一致することを確認するようにし、各ケースの回帰テストを追加した。

⏳ 未リリース · トピック: レキサー基盤

tsc と異なるトークンの読み方を修正(#27090)

Before

正しいコードでも、途中から始めた文脈解析の中の yield/await、keyof/readonly/infer などの後の改行と <、型引数のトップレベルの :、if の後の ++ などで、正規表現と除算や >> の分割を tsc と違うように読んでいた。

After

tsc と同じ読み方に修正し、各ケースの回帰テストを追加。文脈解析で正しく判別できるようになったため、インクリメント/デクリメントとモジュール指定子のショートカットは削除した。

⏳ 未リリース · トピック: レキサー基盤

React Compiler が再帰する関数式をコンパイルできるように(#26796)

Before

名前付き関数式で自分自身を呼ぶ(再帰する)コンポーネントで内部エラーになっていた(#26284)。

After

スコープの刈り込みの前に名前付き関数式のプライベートな束縛を登録し、内部エラーなくコンパイルできるようにした。既存の手動メモ化の中止(bailout)は維持。

⏳ 未リリース · トピック: React-Compiler

for-of の先頭部分と import 属性の文脈解析を修正(#27100)

Before

for (x! of /re/) や for (var x: T of /re/) の / を除算として読んでいた。import 属性の後の let を名前として読んでいた。

After

for の先頭で値の後に来る of は tsc と同じくキーワードとして扱い、import 属性の句で文が終わるようにした。回帰テストを追加し、メインのベンチマークセットで 1.5% 高速化。

⏳ 未リリース · トピック: レキサー基盤

JS プラグインのルール計測にセレクタのマッチ時間を含める(#27111)

Before

#26415 で追加された JS プラグインのルールごとの計測に、セレクタのマッチにかかる時間が含まれていなかった。

After

セレクタのマッチ時間もルールのコストとして計測に含める。複雑なセレクタを使うルールでは、この時間が大きくなることがある。

⏳ 未リリース · トピック: JSプラグイン

Markdown フォーマッタが HTML と入れ子リストの間の空行を保持するように(#27112)

Before

HTML ブロックの後に入れ子のリストが続くと間の空行が失われ、出力が冪等でなかった。

After

空行を保持するようにした。差異は DIVERGENCES.md に記載。

⏳ 未リリース · トピック: Markdownフォーマッタ

同じプロセスで Oxfmt の CLI を何度も呼べるように(#27051)

Before

同じ Node.js プロセスで runCli() を 2 回以上呼ぶと、毎回 Rayon のグローバルスレッドプールを初期化しようとしてパニックしていた。

After

グローバルスレッドプールを一度だけ初期化し、以降の呼び出しでは再利用する。スレッド数は最初の呼び出しのものがプロセスの終了まで使われる。Vite+ の Node.js プロセス内から Oxlint・Oxfmt を直接呼ぶための変更。

⏳ 未リリース · トピック: Oxfmt

途中で止まった文脈解析をグループの外へ正しく続けるように(#27114)

Before

o = { a: f({} / 2), b: {} / 3 } の最後の / を正規表現として読み、async 関数の後の await をキーワードとして読んでいた。

After

グループの中で止まった解析を続けるときは、そのグループのフレームまで戻って閉じ括弧を処理してから外側で再開する。オペランドのアンカーから始めた解析は、それが開く構文の中でだけ有効にした。

⏳ 未リリース · トピック: レキサー基盤

引数にコメントがあるときはテスト呼び出し用のレイアウトを使わない(#27119)

Before

引数にコメントを含むテスト呼び出し(it(...) など)でもテスト呼び出し用のレイアウトを使っていた(#24960、#26926)。

After

引数(型引数を含む)にコメントがある場合はこのレイアウトを使わない。差異は DIVERGENCES.md に記載。

⏳ 未リリース · トピック: Oxfmt

その他

  • リリース: npm のサブパッケージが公開されるのを待ってから親パッケージを公開するように(#27030)⏳ 未リリース
  • Minifier: if を for にインライン化するときに join_with_left_associative_op を使う(挙動は変わらないリファクタ)(#26463)⏳ 未リリース
  • chore(oxlint): require tsgolint 7.0.2003(#27021)⏳ 未リリース
  • docs(parser): document AST property order(#27038)⏳ 未リリース
  • chore(docs): standardize on AGENTS.md(#27043)⏳ 未リリース
  • レキサーの文脈解析のリファクタ(重複・不要な状態・到達しないコードの削除など、出力は変わらない)(#26993、#27086、#27087、#27088、#27091、#27092、#27093、#27101、#27102)⏳ 未リリース
  • レキサーのテスト・ベンチマーク(ready-lexer に just doc を追加、誤って失敗するテストのスキップ、wallclock ベンチマーク追加、> の規則なしでの検証)(#27050、#27071、#27110、#27115)⏳ 未リリース
  • oxc_str の整理(コメント整形、トレイトのテスト明確化、clippy の理由修正、Debug の import、JSChar::is_lead_surrogate / is_trail_surrogate 追加、WTF-8 定数の命名)(#27011、#27012、#27013、#27014、#27015、#27099)⏳ 未リリース
  • test(estree): update estree-conformance submodule to latest(#27104)⏳ 未リリース