diff options
author | 2023-09-14 00:39:36 -0400 | |
---|---|---|
committer | 2023-09-13 21:39:36 -0700 | |
commit | 9976e3f528bae74667a2f4742c4b165b7f68c76d (patch) | |
tree | eb4a123f5c533f73559f894bff77d5db65906a56 /src/js/_codegen/replacements.ts | |
parent | fbafbd3394a2c1a1112df148fa2b151ee0955cc5 (diff) | |
download | bun-9976e3f528bae74667a2f4742c4b165b7f68c76d.tar.gz bun-9976e3f528bae74667a2f4742c4b165b7f68c76d.tar.zst bun-9976e3f528bae74667a2f4742c4b165b7f68c76d.zip |
fix(runtime): make most globals configurable/deletable, allow resuming the console iterator (#5216)
* Fix #5177
* Fix #5175
* make most globals deletable/overridable
* not done
* cool
* a
* done
* fix test
* oops
* yippee
Diffstat (limited to 'src/js/_codegen/replacements.ts')
-rw-r--r-- | src/js/_codegen/replacements.ts | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/src/js/_codegen/replacements.ts b/src/js/_codegen/replacements.ts index 4621d6134..5ce646ad5 100644 --- a/src/js/_codegen/replacements.ts +++ b/src/js/_codegen/replacements.ts @@ -24,13 +24,14 @@ export const globalReplacements: ReplacementRule[] = [ ]; // This is a list of globals we should access using @ notation +// This prevents a global override attacks. +// Note that the public `Bun` global is immutable. // undefined -> __intrinsic__undefined -> @undefined export const globalsToPrefix = [ "AbortSignal", "Array", "ArrayBuffer", "Buffer", - "Bun", "Infinity", "Loader", "Promise", @@ -79,6 +80,41 @@ export const warnOnIdentifiersNotPresentAtRuntime = [ "notImplementedIssueFn", ]; +// These are passed to --define to the bundler +export const define: Record<string, string> = { + "process.env.NODE_ENV": "production", + "IS_BUN_DEVELOPMENT": "false", + + $streamClosed: "1", + $streamClosing: "2", + $streamErrored: "3", + $streamReadable: "4", + $streamWaiting: "5", + $streamWritable: "6", +}; + +// ------------------------------ // + +for (const name in enums) { + const value = enums[name]; + if (typeof value !== "object") throw new Error("Invalid enum object " + name + " defined in " + import.meta.file); + if (typeof value === null) throw new Error("Invalid enum object " + name + " defined in " + import.meta.file); + const keys = Array.isArray(value) ? value : Object.keys(value).filter(k => !k.match(/^[0-9]+$/)); + define[`$${name}IdToLabel`] = "[" + keys.map(k => `"${k}"`).join(", ") + "]"; + define[`$${name}LabelToId`] = "{" + keys.map(k => `"${k}": ${keys.indexOf(k)}`).join(", ") + "}"; +} + +for (const name of globalsToPrefix) { + define[name] = "__intrinsic__" + name; +} + +for (const key in define) { + if (key.startsWith("$")) { + define["__intrinsic__" + key.slice(1)] = define[key]; + delete define[key]; + } +} + export interface ReplacementRule { from: RegExp; to: string; |