From 69f9e6df7a56fa9450833e7cdf46dd8a764d306e Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 31 Mar 2025 16:45:33 +0200 Subject: [PATCH 1/2] Turbopack: fix side effects optimization bug the local fragment need to reference evaluation references --- .../src/references/mod.rs | 1 + .../basic/input/index.js | 24 +++++++++++++++---- .../node_modules/package-named-local/a.js | 1 + .../node_modules/package-named-local/b.js | 2 ++ .../package-named-local/default.js | 1 + .../node_modules/package-named-local/index.js | 12 ++++++++++ .../package-named-local/not-compiled.js | 1 + .../package-named-local/not-executed.js | 1 + .../package-named-local/package.json | 3 +++ .../node_modules/package-named-local/x.js | 1 + .../node_modules/package-named-local/y.js | 3 +++ .../input/node_modules/package-named/index.js | 2 -- .../input/node_modules/package-star/index.js | 1 - .../follow-keeps-side-effect/input/index.js | 5 ++++ .../input/package.json | 6 +++++ .../input/reexport.js | 7 ++++++ .../input/valueContainer.js | 4 ++++ .../input/valueSetter.js | 3 +++ .../follow-keeps-side-effect/options.json | 3 +++ .../follow-keeps-side-effect/input/index.js | 1 + .../follow-keeps-side-effect/options.json | 3 +++ 21 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/a.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/b.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/default.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/index.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/not-compiled.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/not-executed.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/package.json create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/x.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/y.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/index.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/package.json create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/reexport.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/valueContainer.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/valueSetter.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/options.json create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/tree-shaking/follow-keeps-side-effect/input/index.js create mode 100644 turbopack/crates/turbopack-tests/tests/execution/turbopack/tree-shaking/follow-keeps-side-effect/options.json diff --git a/turbopack/crates/turbopack-ecmascript/src/references/mod.rs b/turbopack/crates/turbopack-ecmascript/src/references/mod.rs index 92f2c605e53634..fb502a5183f0cd 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/mod.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/mod.rs @@ -276,6 +276,7 @@ impl AnalyzeEcmascriptModuleResultBuilder { /// If you're unsure about which function to use, use `add_reference()` pub fn add_esm_evaluation_reference(&mut self, idx: usize) { self.esm_references.insert(idx); + self.esm_local_references.insert(idx); self.esm_evaluation_references.insert(idx); } diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/index.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/index.js index 36791659688793..371cacd646dcde 100644 --- a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/index.js +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/index.js @@ -1,3 +1,20 @@ +import { + a as a0, + b as b0, + c as c0, + d as d0, + e as e0, + def as def0, +} from "package-named"; +it("should optimize named reexports from side effect free module", () => { + expect(a0).toBe("a"); + expect(b0).toBe("b"); + expect(c0).toBe("x"); + expect(d0).toBe("y"); + expect(e0).toBe("x"); + expect(def0).toBe("default"); +}); + import { a as a1, b as b1, @@ -7,8 +24,8 @@ import { local as local1, default as default1, def as def1, -} from "package-named"; -it("should optimize named reexports from side effect free module", () => { +} from "package-named-local"; +it("should optimize named reexports with locals from side effect free module", () => { expect(a1).toBe("a"); expect(b1).toBe("b"); expect(c1).toBe("x"); @@ -19,11 +36,10 @@ it("should optimize named reexports from side effect free module", () => { expect(def1).toBe("default"); }); -import { a as a2, b as b2, local as local2 } from "package-star"; +import { a as a2, b as b2 } from "package-star"; it("should optimize star reexports from side effect free module", () => { expect(a2).toBe("a"); expect(b2).toBe("b"); - expect(local2).toBe("local"); }); import { diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/a.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/a.js new file mode 100644 index 00000000000000..9233cce2f0e186 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/a.js @@ -0,0 +1 @@ +export const a = "a"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/b.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/b.js new file mode 100644 index 00000000000000..79044b663db8bb --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/b.js @@ -0,0 +1,2 @@ +const myB = "b"; +export { myB as b }; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/default.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/default.js new file mode 100644 index 00000000000000..17e060e96f9f21 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/default.js @@ -0,0 +1 @@ +export default "default"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/index.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/index.js new file mode 100644 index 00000000000000..cf8203e5ada104 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/index.js @@ -0,0 +1,12 @@ +export { notCompiled } from "./not-compiled.js"; +export { notExecuted } from "./not-executed.js"; +export * from "./not-compiled.js"; +export * from "./not-executed.js"; +export { a } from "./a.js"; +export { b } from "./b.js"; +export { x as c } from "./x.js"; +export { y as d } from "./y.js"; +export { x as e } from "./y.js"; +export { default as def } from "./default.js"; +export const local = "local"; +export default "local-default"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/not-compiled.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/not-compiled.js new file mode 100644 index 00000000000000..850b713f4687f8 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/not-compiled.js @@ -0,0 +1 @@ +))) diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/not-executed.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/not-executed.js new file mode 100644 index 00000000000000..d7651bb289d5d9 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/not-executed.js @@ -0,0 +1 @@ +throw new Error("Module should not be executed"); diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/package.json b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/package.json new file mode 100644 index 00000000000000..a43829151e1423 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/x.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/x.js new file mode 100644 index 00000000000000..985ed7b9d82e5a --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/x.js @@ -0,0 +1 @@ +export const x = "x"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/y.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/y.js new file mode 100644 index 00000000000000..7e92113032c4c0 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named-local/y.js @@ -0,0 +1,3 @@ +export * from "./x.js"; + +export const y = "y"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named/index.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named/index.js index b0f6fbe6d42148..2607288865a330 100644 --- a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named/index.js +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-named/index.js @@ -10,5 +10,3 @@ export { x as c } from "./x.js"; export { y as d } from "./y.js"; export { x as e } from "./y.js"; export { default as def } from "./default.js"; -export const local = "local"; -export default "local-default"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-star/index.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-star/index.js index ee0717661118d6..a9932284c5cf46 100644 --- a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-star/index.js +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/basic/input/node_modules/package-star/index.js @@ -1,5 +1,4 @@ export { notCompiled } from "./not-compiled.js"; -export { notExisting } from "./not-existing.js"; export { notExecuted } from "./not-executed.js"; export * from "./not-executed.js"; export * from "./a.js"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/index.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/index.js new file mode 100644 index 00000000000000..dab6b80b1bce26 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/index.js @@ -0,0 +1,5 @@ +import getValue from "./reexport.js"; + +it("should not optimize away side effects", () => { + expect(getValue()).toBe(42); +}); diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/package.json b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/package.json new file mode 100644 index 00000000000000..ad9f3bdb826df3 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/package.json @@ -0,0 +1,6 @@ +{ + "sideEffects": [ + "./index.js", + "./valueSetter.js" + ] +} diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/reexport.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/reexport.js new file mode 100644 index 00000000000000..43e26e14878b6a --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/reexport.js @@ -0,0 +1,7 @@ +import { value } from "./valueSetter.js"; + +export { value } from "./valueSetter.js"; + +export default () => { + return value +} diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/valueContainer.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/valueContainer.js new file mode 100644 index 00000000000000..d31ec4e34e2b8e --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/valueContainer.js @@ -0,0 +1,4 @@ +export let value = undefined; +export function setValue(newValue) { + value = newValue; +} diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/valueSetter.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/valueSetter.js new file mode 100644 index 00000000000000..3d64dab93fd07a --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/input/valueSetter.js @@ -0,0 +1,3 @@ +import { setValue } from "./valueContainer.js"; +setValue(42); +export * from "./valueContainer.js"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/options.json b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/options.json new file mode 100644 index 00000000000000..af13697f09f935 --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/side-effects-optimization/follow-keeps-side-effect/options.json @@ -0,0 +1,3 @@ +{ + "treeShakingMode": "reexports-only" +} diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/tree-shaking/follow-keeps-side-effect/input/index.js b/turbopack/crates/turbopack-tests/tests/execution/turbopack/tree-shaking/follow-keeps-side-effect/input/index.js new file mode 100644 index 00000000000000..69c69a74041e1d --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/tree-shaking/follow-keeps-side-effect/input/index.js @@ -0,0 +1 @@ +import "../../../side-effects-optimization/follow-keeps-side-effect/input/index.js"; diff --git a/turbopack/crates/turbopack-tests/tests/execution/turbopack/tree-shaking/follow-keeps-side-effect/options.json b/turbopack/crates/turbopack-tests/tests/execution/turbopack/tree-shaking/follow-keeps-side-effect/options.json new file mode 100644 index 00000000000000..000d78a6b3cbbc --- /dev/null +++ b/turbopack/crates/turbopack-tests/tests/execution/turbopack/tree-shaking/follow-keeps-side-effect/options.json @@ -0,0 +1,3 @@ +{ + "treeShakingMode": "module-fragments" +} From 10c154f55bea1442027071ca54fa05a7bfdb1f4f Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 1 Apr 2025 08:21:23 +0200 Subject: [PATCH 2/2] update snapshot --- test/development/acceptance/ReactRefreshLogBox.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/development/acceptance/ReactRefreshLogBox.test.ts b/test/development/acceptance/ReactRefreshLogBox.test.ts index 6cf70ac6c62471..225352b112cb4a 100644 --- a/test/development/acceptance/ReactRefreshLogBox.test.ts +++ b/test/development/acceptance/ReactRefreshLogBox.test.ts @@ -180,8 +180,8 @@ describe('ReactRefreshLogBox', () => { | ^", "stack": [ "[project]/index.js [ssr] (ecmascript) index.js (3:7)", - "", - "", + "[project]/pages/index.js [ssr] (ecmascript) pages/index.js (1:1)", + "[project]/pages/index.js [ssr] (ecmascript) pages/index.js (1:1)", "", ], }