mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-11-02 07:43:42 +08:00
In JavaScript dependencies, a createRequire require call with a computed specifier, and require.resolve called with a computed request or read as a value, now compile. The new runtime unit scr_require.c resolves the specifier with Node 24's CommonJS algorithm (builtins, relative and absolute paths with Node's extension search, package "main", "exports" and self-reference, node_modules and NODE_PATH lookup) when the call runs: - require.resolve returns the id or real path Node returns, and throws Node's MODULE_NOT_FOUND error when nothing resolves. - require throws the same MODULE_NOT_FOUND error when nothing resolves, so packages that probe for optional addons, such as pi-tui, take their absent branch as in Node. When the specifier resolves to a native addon, a builtin or another file, Node would load that module: the program prints an SC2020 error naming it and exits with status 1, without running the catch clause around the call. Coverage lists these calls as deferred to runtime. TypeScript sources keep the compile-time refusal. Refs #1777.
69 lines
2.7 KiB
TypeScript
69 lines
2.7 KiB
TypeScript
/** Runtime requirements derived from the lowered program, shared by compiler hosts. */
|
|
import { type IrModule } from "../ir/ir.js";
|
|
import { moduleRuntimeFeatures } from "../ir/runtime-features.js";
|
|
import { hasForeignFfiCallback } from "./ffi-callbacks.js";
|
|
import type { NativeLinkFeatures } from "./native-link-info.js";
|
|
import { youngNurseryRequested } from "./young-nursery.js";
|
|
|
|
export function executableLinkFeatures(mod: IrModule): NativeLinkFeatures {
|
|
const features = moduleRuntimeFeatures(mod);
|
|
return {
|
|
...(mod.workers ? { workers: true } : {}),
|
|
...(youngNurseryRequested() && mod.lib === undefined ? { youngNursery: true } : {}),
|
|
regex: features.regex,
|
|
copying: features.copying,
|
|
textDecoderLegacy: features.legacyTextDecoder,
|
|
fileHandle: features.fileHandle,
|
|
fetch: features.fetch,
|
|
...(features.eventTarget ? { eventTarget: true } : {}),
|
|
...(features.wasm ? { wasm: true } : {}),
|
|
...(features.warningReplace ? { warningReplace: true } : {}),
|
|
...(features.stdioExtended ? { stdioExtended: true } : {}),
|
|
zlib: features.zlib,
|
|
assert: features.assert,
|
|
inspect: features.inspect,
|
|
dynInvoke: features.dynInvoke,
|
|
dc: features.dc,
|
|
dynAsync: features.dynAsync,
|
|
...(features.dynTier ? { dynTier: true } : {}),
|
|
...(features.streamDyn ? { streamDyn: true } : {}),
|
|
...(features.handleProps ? { handleProps: true } : {}),
|
|
...(features.declAdopt ? { declAdopt: true } : {}),
|
|
...(features.dynForAwait ? { dynForAwait: true } : {}),
|
|
...(features.eventsOnceSignal ? { eventsOnceSignal: true } : {}),
|
|
...(features.dynBuffer ? { dynBuffer: true } : {}),
|
|
...(features.builtinValues ? { builtinValues: true } : {}),
|
|
...(features.computedRequire ? { computedRequire: true } : {}),
|
|
events: features.processEvents,
|
|
emitter: features.emitter,
|
|
symbol: features.symbol,
|
|
bigint: features.bigint,
|
|
searchParams: features.searchParams,
|
|
qs: features.qs,
|
|
utilPromisify: features.utilPromisify,
|
|
dynBuiltinClass: features.dynBuiltinClass,
|
|
dynBuiltinStream: features.dynBuiltinStream,
|
|
parseArgs: features.parseArgs,
|
|
stream: features.stream,
|
|
net: features.net,
|
|
http: features.http,
|
|
http2: features.http2,
|
|
dgram: features.dgram,
|
|
dnsPromises: features.dnsPromises,
|
|
dgramDyn: features.dgramDyn,
|
|
textCodecDyn: features.textCodecDyn,
|
|
watch: features.fsWatch,
|
|
foreignFfi: hasForeignFfiCallback(mod.ffiImports ?? []),
|
|
nodeTest: features.nodeTest,
|
|
tls: features.tls,
|
|
tlsCa: features.tlsCa,
|
|
cipher: features.cipher,
|
|
ecdh: features.ecdh,
|
|
dh: features.dh,
|
|
pki: features.pki,
|
|
ed25519: features.ed25519,
|
|
webcrypto: features.webcrypto,
|
|
perfLoop: features.perfLoop,
|
|
};
|
|
}
|