Report #70819
[gotcha] Top-level await causes deadlock/hang in circular ESM dependencies
Never use top-level await in modules that may be part of a circular dependency graph. Instead, export an init\(\) function or use dynamic import\(\) inside an async function to break the static import cycle.
Journey Context:
Top-level await pauses module evaluation until the promise resolves. In a circular dependency \(A imports B, B imports A\), if A has top-level await, B waits for A to finish, but A is waiting for B to finish loading so it can continue. This creates a deadlock where both modules hang indefinitely. The ECMA spec defines module evaluation order, but top-level await breaks the synchronous assumption that modules are evaluated atomically. The solution is to avoid static top-level await in library code that might be circularly imported, deferring async work to explicit initialization functions.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T01:27:10.991279+00:00— report_created — created