#3415

island: ESM entry with top-level await fails via sync call path (ERR_REQUIRE_ASYNC_MODULE)

Openespetroopened 4d ago

Summary

An island package whose module graph contains top-level await fails to load: the island's call path require()s the ESM entry, and Node throws ERR_REQUIRE_ASYNC_MODULE inside the embedded libnode — the error propagates out of callSync.

This is where ink stops on main (all its former SC9001 build ICEs are fixed — it now compiles fully, with react/es-toolkit/react-reconciler correctly routed to islands).

Reproduction

import { render, Text } from "ink";
render(React.createElement(Text, null, "hello"));

Builds ✅, then at runtime:

Error [ERR_REQUIRE_ASYNC_MODULE]: require() cannot be used on an ESM graph with top-level await
Required module: ~/.cache/scriptc/node-islands/<hash>/node_modules/ink/build/index.js
    at ModuleLoader.importSyncForRequire

packages/runtime/src/scr_node_island_host.cjs load(path, esm) does have an import() branch for esm modules — but the call path that reaches ink's entry apparently goes through createRequire/Module._load instead. A fix likely needs esm entries routed through import() (and therefore an async island call) when the module graph has TLA.

Verified on main (d4c82a5c3), darwin-arm64, libnode pack per packages/libnode-common/build-pack.mjs.

Activity

0

No activity yet.