Skip to main content

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

Стан

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

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

Запуск сценаріїв розробки OpenClaw через tsx завершувався помилкою під час запуску:
Номери рядків опущено; обидва файли змінилися після початкового аварійного завершення, тому конкретні рядки більше не збігаються. Проблема виникла після переходу сценаріїв розробки з 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(...) викидала помилку замість повернення обгорнутого значення.

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

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

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

  • Запускайте сценарії розробки за допомогою Bun замість node --import tsx.
  • Запустіть pnpm tsgo для перевірки типів, а потім запускайте зібраний результат замість вихідного коду через tsx:
  • Спробуйте іншу версію tsx (pnpm add -D tsx@<version> змінює залежності й відповідно до політики репозиторію потребує схвалення), щоб методом поділу діапазону визначити, чи версія esbuild у її складі знову спричинила цю помилку.
  • Перевірте з іншою основною або додатковою версією Node, щоб з’ясувати, чи залежить помилка від версії.

Посилання

Пов’язане