Skip to content

Commit 4f8edb8

Browse files
authored
fix(runtime): require cache should not include unevaluated ESM modules. (#5233)
1 parent cb01cb0 commit 4f8edb8

File tree

6 files changed

+40
-8
lines changed

6 files changed

+40
-8
lines changed

src/js/builtins/ImportMetaObject.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,11 @@ export function createRequireCache() {
177177

178178
ownKeys(target) {
179179
var array = [...$requireMap.$keys()];
180-
const registryKeys = [...Loader.registry.$keys()];
181-
for (const key of registryKeys) {
182-
if (!array.includes(key)) {
180+
for (const key of Loader.registry.$keys()) {
181+
if (!array.includes(key) && Loader.registry.$get(key)?.evaluated) {
183182
$arrayPush(array, key);
184183
}
185184
}
186-
187185
return array;
188186
},
189187

@@ -193,7 +191,7 @@ export function createRequireCache() {
193191
},
194192

195193
getOwnPropertyDescriptor(target, key: string) {
196-
if ($requireMap.$has(key) || Loader.registry.$has(key)) {
194+
if ($requireMap.$has(key) || Loader.registry.$get(key)?.evaluated) {
197195
return {
198196
configurable: true,
199197
enumerable: true,

src/js/out/WebCoreJSBuiltins.cpp

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/bun.lockb

3.63 KB
Binary file not shown.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const { strictEqual, ok } = require("assert");
2+
3+
Loader.registry.set("bad", { evaluated: false });
4+
strictEqual(require.cache.bad, undefined);
5+
ok(!Object.hasOwn(require.cache, "bad"));
6+
ok(!Object.getOwnPropertyNames(require.cache).includes("bad"));
7+
8+
// hard to simplify this test case, but importing this would cause require.cache.extract to be set
9+
require("msgpackr-extract");
10+
11+
strictEqual(require.cache["extract"], undefined);
12+
ok(!Object.hasOwnProperty.call(require.cache, "extract"));
13+
ok(!Object.getOwnPropertyNames(require.cache).includes("extract"));
14+
15+
for (const key of Object.keys(require.cache)) {
16+
if (!require.cache[key]) {
17+
throw new Error("require.cache has an undefined value that was in it's keys");
18+
}
19+
}
20+
21+
console.log("--pass--");

test/cli/run/require-cache.test.js renamed to test/cli/run/require-cache.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,15 @@ test("require.cache", () => {
1313
expect(stdout.toString().trim().endsWith("--pass--")).toBe(true);
1414
expect(exitCode).toBe(0);
1515
});
16+
17+
// https://github.com/oven-sh/bun/issues/5188
18+
test("require.cache does not include unevaluated modules", () => {
19+
const { stdout, exitCode } = Bun.spawnSync({
20+
cmd: [bunExe(), "run", join(import.meta.dir, "require-cache-bug-5188.js")],
21+
env: bunEnv,
22+
stderr: "inherit",
23+
});
24+
25+
expect(stdout.toString().trim().endsWith("--pass--")).toBe(true);
26+
expect(exitCode).toBe(0);
27+
});

test/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
},
1010
"dependencies": {
1111
"@prisma/client": "5.1.1",
12+
"@resvg/resvg-js": "2.4.1",
1213
"@swc/core": "1.3.38",
1314
"body-parser": "1.20.2",
1415
"comlink": "4.4.1",
@@ -20,12 +21,12 @@
2021
"iconv-lite": "0.6.3",
2122
"jest-extended": "4.0.0",
2223
"lodash": "4.17.21",
24+
"msgpackr-extract": "3.0.2",
2325
"nodemailer": "6.9.3",
2426
"pg": "8.11.1",
2527
"pg-connection-string": "2.6.1",
2628
"postgres": "3.3.5",
2729
"prisma": "5.1.1",
28-
"@resvg/resvg-js": "2.4.1",
2930
"socket.io": "4.7.1",
3031
"socket.io-client": "4.7.1",
3132
"supertest": "6.3.3",

0 commit comments

Comments
 (0)