aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Ai Hoshino <ambiguous404@gmail.com> 2023-09-23 09:40:06 +0800
committerGravatar GitHub <noreply@github.com> 2023-09-22 18:40:06 -0700
commit1445775d64df9f45ea25ae64fa47ee3c0d321baa (patch)
tree6b9e853f2a0dae12b0f54ec989d72a2139444942
parentfeefaf00d799e152e1c816e7cd8c8beb70c7f074 (diff)
downloadbun-1445775d64df9f45ea25ae64fa47ee3c0d321baa.tar.gz
bun-1445775d64df9f45ea25ae64fa47ee3c0d321baa.tar.zst
bun-1445775d64df9f45ea25ae64fa47ee3c0d321baa.zip
fix(runtime): exclude unevaluated module in `require.cache` (#5903)
Close: #5898
-rw-r--r--src/js/builtins/ImportMetaObject.ts2
-rw-r--r--src/js/out/WebCoreJSBuiltins.cpp4
-rw-r--r--test/cli/run/require-cache-bug-5188.js1
3 files changed, 4 insertions, 3 deletions
diff --git a/src/js/builtins/ImportMetaObject.ts b/src/js/builtins/ImportMetaObject.ts
index 17eb274cd..bf498e9f9 100644
--- a/src/js/builtins/ImportMetaObject.ts
+++ b/src/js/builtins/ImportMetaObject.ts
@@ -165,7 +165,7 @@ export function createRequireCache() {
},
has(target, key: string) {
- return $requireMap.$has(key) || Loader.registry.$has(key);
+ return $requireMap.$has(key) || Boolean(Loader.registry.$get(key)?.evaluated);
},
deleteProperty(target, key: string) {
diff --git a/src/js/out/WebCoreJSBuiltins.cpp b/src/js/out/WebCoreJSBuiltins.cpp
index 0ae099aa6..8b7260b30 100644
--- a/src/js/out/WebCoreJSBuiltins.cpp
+++ b/src/js/out/WebCoreJSBuiltins.cpp
@@ -168,9 +168,9 @@ WEBCORE_FOREACH_EVENTSOURCE_BUILTIN_CODE(DEFINE_BUILTIN_GENERATOR)
const JSC::ConstructAbility s_importMetaObjectCreateRequireCacheCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_importMetaObjectCreateRequireCacheCodeConstructorKind = JSC::ConstructorKind::None;
const JSC::ImplementationVisibility s_importMetaObjectCreateRequireCacheCodeImplementationVisibility = JSC::ImplementationVisibility::Public;
-const int s_importMetaObjectCreateRequireCacheCodeLength = 1333;
+const int s_importMetaObjectCreateRequireCacheCodeLength = 1353;
static const JSC::Intrinsic s_importMetaObjectCreateRequireCacheCodeIntrinsic = JSC::NoIntrinsic;
-const char* const s_importMetaObjectCreateRequireCacheCode = "(function () {\"use strict\";\n var moduleMap = new Map, inner = {};\n return new Proxy(inner, {\n get(target, key) {\n const entry = @requireMap.@get(key);\n if (entry)\n return entry;\n const esm = @Loader.registry.@get(key);\n if (esm\?.evaluated) {\n const namespace = @Loader.getModuleNamespaceObject(esm.module), mod = @createCommonJSModule(key, namespace, !0, @undefined);\n return @requireMap.@set(key, mod), mod;\n }\n return inner[key];\n },\n set(target, key, value) {\n return @requireMap.@set(key, value), !0;\n },\n has(target, key) {\n return @requireMap.@has(key) || @Loader.registry.@has(key);\n },\n deleteProperty(target, key) {\n return moduleMap.@delete(key), @requireMap.@delete(key), @Loader.registry.@delete(key), !0;\n },\n ownKeys(target) {\n var array = [...@requireMap.@keys()];\n for (let key of @Loader.registry.@keys())\n if (!array.includes(key) && @Loader.registry.@get(key)\?.evaluated)\n @arrayPush(array, key);\n return array;\n },\n getPrototypeOf(target) {\n return null;\n },\n getOwnPropertyDescriptor(target, key) {\n if (@requireMap.@has(key) || @Loader.registry.@get(key)\?.evaluated)\n return {\n configurable: !0,\n enumerable: !0\n };\n }\n });\n})\n";
+const char* const s_importMetaObjectCreateRequireCacheCode = "(function () {\"use strict\";\n var moduleMap = new Map, inner = {};\n return new Proxy(inner, {\n get(target, key) {\n const entry = @requireMap.@get(key);\n if (entry)\n return entry;\n const esm = @Loader.registry.@get(key);\n if (esm\?.evaluated) {\n const namespace = @Loader.getModuleNamespaceObject(esm.module), mod = @createCommonJSModule(key, namespace, !0, @undefined);\n return @requireMap.@set(key, mod), mod;\n }\n return inner[key];\n },\n set(target, key, value) {\n return @requireMap.@set(key, value), !0;\n },\n has(target, key) {\n return @requireMap.@has(key) || Boolean(@Loader.registry.@get(key)\?.evaluated);\n },\n deleteProperty(target, key) {\n return moduleMap.@delete(key), @requireMap.@delete(key), @Loader.registry.@delete(key), !0;\n },\n ownKeys(target) {\n var array = [...@requireMap.@keys()];\n for (let key of @Loader.registry.@keys())\n if (!array.includes(key) && @Loader.registry.@get(key)\?.evaluated)\n @arrayPush(array, key);\n return array;\n },\n getPrototypeOf(target) {\n return null;\n },\n getOwnPropertyDescriptor(target, key) {\n if (@requireMap.@has(key) || @Loader.registry.@get(key)\?.evaluated)\n return {\n configurable: !0,\n enumerable: !0\n };\n }\n });\n})\n";
// internalRequire
const JSC::ConstructAbility s_importMetaObjectInternalRequireCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
diff --git a/test/cli/run/require-cache-bug-5188.js b/test/cli/run/require-cache-bug-5188.js
index cb9bd2099..5b14e6b4c 100644
--- a/test/cli/run/require-cache-bug-5188.js
+++ b/test/cli/run/require-cache-bug-5188.js
@@ -9,6 +9,7 @@ ok(!Object.getOwnPropertyNames(require.cache).includes("bad"));
require("msgpackr-extract");
strictEqual(require.cache["extract"], undefined);
+ok(!("extract" in require.cache)); // https://github.com/oven-sh/bun/issues/5898
ok(!Object.hasOwnProperty.call(require.cache, "extract"));
ok(!Object.getOwnPropertyNames(require.cache).includes("extract"));