Diagnostics

Node + tsx 충돌

Node + tsx "__name is not a function" 충돌

상태

해결되었습니다. 이 충돌은 package.json에 고정된 현재 tsx 버전 (4.22.3)이나 최신 Node 릴리스에서는 재현되지 않습니다. 향후 tsx/esbuild 업그레이드로 문제가 다시 발생할 경우를 대비해 이 문서를 유지합니다.

원래 증상

tsx를 통해 OpenClaw 개발 스크립트를 실행하면 시작 시 다음 오류가 발생했습니다.

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을 선택 사항으로 만들기 위해 개발 스크립트가 Bun에서 tsx로 전환된 후 (2871657e, 2026-01-06) 이 문제가 나타났습니다. 이에 해당하는 Bun 기반 경로에서는 충돌이 발생하지 않았습니다. 원래 macOS의 Node v25.3.0에서 관찰되었으며, Node 25를 실행하는 다른 플랫폼도 영향을 받을 가능성이 큰 것으로 간주되었습니다.

원인

tsx는 변환 옵션에 keepNames: true를 하드코딩하여 esbuild를 통해 TS/ESM을 변환합니다. 이 설정을 사용하면 축소 및 번들링 후에도 fn.name이 유지되도록 esbuild가 이름이 지정된 함수/클래스 선언을 __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 오류가 발생하면 업스트림에 보고하기 전에 정확한 Node 버전, tsx 버전 (node_modules/tsx/package.json), 전체 스택 추적을 수집하세요.

해결 방법(충돌이 다시 발생하는 경우)

  • node --import tsx 대신 Bun으로 개발 스크립트를 실행합니다.

  • 형식 검사를 위해 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