diff options
author | 2023-09-23 09:40:06 +0800 | |
---|---|---|
committer | 2023-09-22 18:40:06 -0700 | |
commit | 1445775d64df9f45ea25ae64fa47ee3c0d321baa (patch) | |
tree | 6b9e853f2a0dae12b0f54ec989d72a2139444942 | |
parent | feefaf00d799e152e1c816e7cd8c8beb70c7f074 (diff) | |
download | bun-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.ts | 2 | ||||
-rw-r--r-- | src/js/out/WebCoreJSBuiltins.cpp | 4 | ||||
-rw-r--r-- | test/cli/run/require-cache-bug-5188.js | 1 |
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")); |