Diagnostics

Збій Node + tsx

Аварійне завершення Node + tsx з помилкою "__name is not a function"

Стан

Вирішено. Це аварійне завершення не відтворюється з поточною версією tsx, зафіксованою в package.json (4.22.3), або з поточними випусками Node. Цю сторінку збережено на випадок, якщо майбутнє оновлення tsx/esbuild знову спричинить проблему.

Початковий симптом

Запуск сценаріїв розробки OpenClaw через tsx завершувався помилкою під час запуску:

text
[openclaw] Failed to start CLI: TypeError: __name is not a function    at createSubsystemLogger (src/logging/subsystem.ts)    at <caller> (src/agents/auth-profiles/constants.ts)

Номери рядків опущено; обидва файли змінилися після початкового аварійного завершення, тому конкретні рядки більше не збігаються.

Проблема виникла після переходу сценаріїв розробки з Bun на tsx (2871657e, 2026-01-06), щоб зробити Bun необов’язковим. Еквівалентний шлях на основі Bun не спричиняв аварійного завершення. Спочатку проблему спостерігали з Node v25.3.0 у macOS; вважалося, що вона також імовірно впливає на інші платформи, де використовується Node 25.

Причина

tsx перетворює TS/ESM за допомогою esbuild із жорстко заданим параметром keepNames: true у параметрах перетворення. Через цей параметр esbuild обгортає іменовані оголошення функцій і класів у виклик допоміжної функції __name, щоб значення fn.name зберігалося після мініфікації та пакування. Аварійне завершення означає, що в місці виклику для цього модуля в проблемній комбінації tsx/Node допоміжна функція була відсутня або перекрита, тому __name(...) викидала помилку замість повернення обгорнутого значення.

Поточна перевірка відтворення

bash
node --versionpnpm installnode --import tsx src/entry.ts status

Мінімальне ізольоване відтворення (завантажує лише модуль із початкового трасування стека):

bash
node --import tsx scripts/repro/tsx-name-repro.ts

Наразі обидві команди завершуються без помилок. Якщо будь-яка з них знову викине помилку __name is not a function, перед надсиланням звіту до upstream-проєкту збережіть точну версію Node, версію tsx (node_modules/tsx/package.json) і повне трасування стека.

Обхідні шляхи (якщо аварійне завершення повернеться)

  • Запускайте сценарії розробки за допомогою Bun замість node --import tsx.

  • Запустіть pnpm tsgo для перевірки типів, а потім запускайте зібраний результат замість вихідного коду через tsx:

    bash
    pnpm tsgonode openclaw.mjs status
  • Спробуйте іншу версію tsx (pnpm add -D tsx@<version> змінює залежності й відповідно до політики репозиторію потребує схвалення), щоб методом поділу діапазону визначити, чи версія esbuild у її складі знову спричинила цю помилку.

  • Перевірте з іншою основною або додатковою версією Node, щоб з’ясувати, чи залежить помилка від версії.

Посилання

Пов’язане

Was this useful?
On this page

On this page