期間: 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-conformancesubmodule to latest(#27104)⏳ 未リリース