Files
scriptc/tests/corpus/code-generation-disallowed.ts
T
Malte UblandClaude Opus 5.5 700f59c1b2 Serve Temporal's absence, v8, stream/web, dns/promises, EvalError and graceful-fs
T10 and T12 of the zero-cost compatibility plan, plus the maintainer
decisions:

- Programs that name Temporal type-check against TS 7's temporal lib
  (added only for them) and lower to Node 24's answers: typeof is
  "undefined", globalThis.Temporal is undefined, other uses throw
  ReferenceError at the root read.
- node:v8 is importable; getHeapStatistics answers allocator-derived
  figures in Node's shape; other members fence with the by-design reason.
  vm's refusal says why.
- node:stream/web exports the web stream globals themselves.
- node:dns/promises and dns.promises: lookup and lookupService as
  promises, in the link-gated scr_dns_promises.c unit.
- eval and the Function constructor throw Node's EvalError under
  --disallow-code-generation-from-strings; the corpus harness runs the
  Node oracle with that flag for `// @disallow-code-generation`.
- graceful-fs is served as node:fs.

Every new lowering replaces a refusal, and the new runtime code links only
when used, so other programs compile to identical bytes (zero-cost gate).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 12:11:05 -07:00

45 lines
1.1 KiB
TypeScript

// @disallow-code-generation
// eval and the Function constructor throw Node's EvalError, exactly as
// under node --disallow-code-generation-from-strings (the harness runs the
// Node oracle with that flag): catchable, at call time, after the
// arguments evaluate. The Function constructor converts its arguments to
// strings before it refuses; eval refuses without converting.
const log: string[] = [];
const arg = (text: string): string => {
log.push(text);
return text;
};
let allowsEval = true;
try {
new Function("");
} catch (e) {
allowsEval = false;
const err = e as Error;
console.log(err.name, err.message, err instanceof EvalError, err instanceof Error);
}
console.log("allowsEval", allowsEval);
try {
eval(arg("1 + 1"));
} catch (e) {
log.push((e as Error).name);
}
try {
Function(arg("a"), arg("return a"));
} catch (e) {
log.push((e as Error).name);
}
try {
(0, eval)(arg("2"));
} catch (e) {
log.push((e as Error).name);
}
try {
globalThis.eval(arg("3"));
} catch (e) {
log.push((e as Error).name);
}
console.log(log.join(","));
console.log(typeof eval, typeof Function);