mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-11 02:03:59 +08:00
events.once(emitter, name) was refused. The emitter dispatches statically emitted events to typed listeners through invokers built per argument tuple, so the lowering takes the event's tuple from the program-wide event table and builds a capture-free function that boxes that tuple into the any[] Node fulfills with, and one for the 'error' tuple. scr_events_once registers both as one-shot typed listeners behind emitted adapters (emitterOnceAdapter). The first to fire settles the promise (fulfilled with the arguments, or rejected with the error) and removes the other, as in Node; awaiting 'error' itself registers only the one listener. The shared state holds the emitter and the listener closures weakly, so a never-fired once creates no cycle. Options, computed or meta event names, EventTarget and stream receivers, and events emitted with computed names or checked-dynamic listeners stay refused. The fallback declarations type the result Promise<unknown[]>; under @types/node (Promise<any[]>) TypeScript code narrows it to unknown[].
node-types fixture
A project whose node_modules contains @types/node — the adoption path for real-world Node/TypeScript projects. The vendored node_modules are COMMITTED TEST DATA, pinned so the type surface (and therefore the pinned diagnostics) never drifts with the registry:
@types/node24.13.3undici-types7.18.2 (its dependency — declares the web-platform globals: fetch/Response/AbortSignal/ReadableStream/...)
What the fixture pins (see tests/harness/project-config.test.ts):
argv-env.ts— the SUPPORTED process surface (argv, env) typed by @types/node lowers statically and the binary runs: with @types/node present, the shipped fallback declarations forprocess/node:fs/consolestand down (their types come from @types/node), but the same members lower to the same libCalls, recognized by name + @types/node provenance.fenced.ts— surface @types/node DECLARES but scriptc does not lower (process.uptime, Buffer.from, setInterval) reports the SC2020-family fence naming @types/node, instead of typechecking its way into a broken binary — and never a raw "Cannot find name" error.source-import/— an imported TypeScript source may use theRequestInfoglobal supplied by TypeScript's default DOM lib while scriptc adopts the project's @types/node declarations.
Projects WITHOUT @types/node (every other fixture and the whole corpus) keep the shipped fallback declarations and behave exactly as before.