Node + tsx の「__name is not a function」クラッシュ
ステータス
解決済みです。このクラッシュは、現在package.json に固定されている tsx バージョン(4.22.3)でも、現在の Node リリースでも再現しません。今後の tsx/esbuild アップグレードで再発した場合に備えて、ここに残しています。
当初の症状
tsx を介して OpenClaw の開発スクリプトを実行すると、起動時に次のエラーが発生しました。
tsx(2871657e、2026-01-06)に切り替わった後に発生しました。同等の Bun ベースのパスではクラッシュしませんでした。当初は macOS 上の Node v25.3.0 で確認されましたが、Node 25 を実行する他のプラットフォームも影響を受ける可能性が高いと考えられていました。
原因
tsx は、変換オプションに keepNames: true をハードコードし、esbuild を介して TS/ESM を変換します。この設定により、esbuild は名前付き関数やクラスの宣言を __name ヘルパーの呼び出しでラップし、ミニファイやバンドル後も fn.name が維持されるようにします。このクラッシュは、影響を受ける tsx/Node の組み合わせにおいて、そのモジュールの呼び出し箇所でヘルパーが欠落していたか、シャドーイングされていたことを意味します。そのため、__name(...) はラップされた値を返さず、例外をスローしました。
現在の再現確認
__name is not a function が再びスローされた場合は、アップストリームに報告する前に、正確な Node バージョン、tsx バージョン(node_modules/tsx/package.json)、および完全なスタックトレースを記録してください。
回避策(クラッシュが再発した場合)
-
node --import tsxの代わりに Bun で開発スクリプトを実行します。 -
型チェックには
pnpm tsgoを実行し、tsxを介してソースを実行する代わりに、ビルドされた出力を実行します。 -
別の
tsxバージョンを試し(pnpm add -D tsx@<version>は依存関係の変更であり、リポジトリポリシーに従って承認が必要です)、同梱されている esbuild のバージョンでバグが再発したかどうかを切り分けます。 - 別の Node メジャー/マイナーバージョンでテストし、障害が特定のバージョンに固有かどうかを確認します。