From 454bee59e652c33b3980d20a80ab8c1a10d0230d Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Wed, 8 Jul 2020 12:22:55 +0200 Subject: [PATCH] disable used exports optimization in development to prevent unexpected changes to module --- lib/config/defaults.js | 4 +- lib/dependencies/ExportsInfoDependency.js | 7 +- test/Defaults.unittest.js | 20 ++-- .../__snapshots__/StatsTestCases.test.js.snap | 20 ++-- test/cases/chunks/inline-options/index.js | 98 ++++++++++--------- test/cases/inner-graph/circular/index.js | 4 +- .../inner-graph/export-default-named/index.js | 22 +++-- test/cases/inner-graph/extend-class/index.js | 12 ++- test/cases/inner-graph/extend-class2/index.js | 20 ++-- .../reexport-namespace-and-default/index.js | 18 ++-- test/cases/inner-graph/simple/index.js | 14 +-- .../parsing/harmony-deep-exports/index.js | 33 +++++-- .../harmony-export-import-specifier/index.js | 26 +++-- .../dedupe-target-with-side/a.js | 2 +- .../used-exports/index.js | 13 +++ .../used-exports/module.js | 3 + .../used-exports/subject.js | 3 + 17 files changed, 197 insertions(+), 122 deletions(-) create mode 100644 test/hotCases/unexpected-invalidation/used-exports/index.js create mode 100644 test/hotCases/unexpected-invalidation/used-exports/module.js create mode 100644 test/hotCases/unexpected-invalidation/used-exports/subject.js diff --git a/lib/config/defaults.js b/lib/config/defaults.js index 880b229f9..1b1d6bf7f 100644 --- a/lib/config/defaults.js +++ b/lib/config/defaults.js @@ -550,8 +550,8 @@ const applyOptimizationDefaults = ( }); D(optimization, "sideEffects", true); D(optimization, "providedExports", true); - D(optimization, "usedExports", true); - D(optimization, "innerGraph", true); + D(optimization, "usedExports", production); + D(optimization, "innerGraph", production); D(optimization, "mangleExports", production); D(optimization, "concatenateModules", production); D(optimization, "runtimeChunk", false); diff --git a/lib/dependencies/ExportsInfoDependency.js b/lib/dependencies/ExportsInfoDependency.js index 191095110..4f2655bae 100644 --- a/lib/dependencies/ExportsInfoDependency.js +++ b/lib/dependencies/ExportsInfoDependency.js @@ -29,8 +29,13 @@ const getProperty = (moduleGraph, module, exportName, property) => { switch (property) { case "usedExports": { const usedExports = moduleGraph.getExportsInfo(module).getUsedExports(); - if (typeof usedExports === "boolean" || usedExports === undefined) + if ( + typeof usedExports === "boolean" || + usedExports === undefined || + usedExports === null + ) { return usedExports; + } return Array.from(usedExports).sort(); } } diff --git a/test/Defaults.unittest.js b/test/Defaults.unittest.js index 568cf32ba..4f0295be8 100644 --- a/test/Defaults.unittest.js +++ b/test/Defaults.unittest.js @@ -148,7 +148,7 @@ describe("Defaults", () => { "chunkIds": "natural", "concatenateModules": false, "flagIncludedChunks": false, - "innerGraph": true, + "innerGraph": false, "mangleExports": false, "mangleWasmImports": false, "mergeDuplicateChunks": true, @@ -191,7 +191,7 @@ describe("Defaults", () => { "minRemainingSize": undefined, "minSize": 10000, }, - "usedExports": true, + "usedExports": false, }, "output": Object { "assetModuleFilename": "[hash][ext]", @@ -357,12 +357,13 @@ describe("Defaults", () => { - "chunkIds": "natural", - "concatenateModules": false, - "flagIncludedChunks": false, + - "innerGraph": false, + - "mangleExports": false, + "checkWasmTypes": true, + "chunkIds": "deterministic", + "concatenateModules": true, + "flagIncludedChunks": true, - @@ ... @@ - - "mangleExports": false, + + "innerGraph": true, + "mangleExports": true, @@ ... @@ - "minimize": false, @@ -385,6 +386,9 @@ describe("Defaults", () => { - "minSize": 10000, + "minSize": 30000, @@ ... @@ + - "usedExports": false, + + "usedExports": true, + @@ ... @@ - "performance": false, + "performance": Object { + "hints": "warning", @@ -406,12 +410,13 @@ describe("Defaults", () => { - "chunkIds": "natural", - "concatenateModules": false, - "flagIncludedChunks": false, + - "innerGraph": false, + - "mangleExports": false, + "checkWasmTypes": true, + "chunkIds": "deterministic", + "concatenateModules": true, + "flagIncludedChunks": true, - @@ ... @@ - - "mangleExports": false, + + "innerGraph": true, + "mangleExports": true, @@ ... @@ - "minimize": false, @@ -434,6 +439,9 @@ describe("Defaults", () => { - "minSize": 10000, + "minSize": 30000, @@ ... @@ + - "usedExports": false, + + "usedExports": true, + @@ ... @@ - "performance": false, + "performance": Object { + "hints": "warning", diff --git a/test/__snapshots__/StatsTestCases.test.js.snap b/test/__snapshots__/StatsTestCases.test.js.snap index da8e45883..dbb435cf9 100644 --- a/test/__snapshots__/StatsTestCases.test.js.snap +++ b/test/__snapshots__/StatsTestCases.test.js.snap @@ -447,29 +447,31 @@ Child all: `; exports[`StatsTestCases should print correct stats for chunk-module-id-range 1`] = ` -"Hash: f33d111f25cd01c8c3cf +"Hash: 024b7b1350be3708ba8e Time: X ms Built at: 1970-04-20 12:42:42 PublicPath: (none) - Asset Size -main1.js 1.9 KiB [emitted] [name: main1] -main2.js 1.9 KiB [emitted] [name: main2] + Asset Size +main1.js 4.39 KiB [emitted] [name: main1] +main2.js 4.38 KiB [emitted] [name: main2] Entrypoint main1 = main1.js Entrypoint main2 = main2.js -chunk main2.js (main2) 136 bytes [entry] [rendered] +chunk main2.js (main2) 136 bytes (javascript) 668 bytes (runtime) [entry] [rendered] > ./main2 main2 ./a.js 20 bytes [built] ./d.js 20 bytes [built] ./e.js 20 bytes [built] ./f.js 20 bytes [built] ./main2.js 56 bytes [built] -chunk main1.js (main1) 136 bytes [entry] [rendered] + + 3 hidden chunk modules +chunk main1.js (main1) 136 bytes (javascript) 668 bytes (runtime) [entry] [rendered] > ./main1 main1 ./a.js 20 bytes [built] ./b.js 20 bytes [built] ./c.js 20 bytes [built] ./d.js 20 bytes [built] - ./main1.js 56 bytes [built]" + ./main1.js 56 bytes [built] + + 3 hidden chunk modules" `; exports[`StatsTestCases should print correct stats for chunks 1`] = ` @@ -3568,10 +3570,10 @@ Child development: chunk dev-main-very-big_js-4647fb9d.js (main-very-big_js-4647fb9d) 1.57 KiB ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] > ./ main ./very-big.js?3 1.57 KiB [built] - chunk dev-main-very-big_js-62f7f644.js (main-very-big_js-62f7f644) 1.57 KiB (javascript) 4.84 KiB (runtime) ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [entry] [rendered] + chunk dev-main-very-big_js-62f7f644.js (main-very-big_js-62f7f644) 1.57 KiB (javascript) 5.11 KiB (runtime) ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [entry] [rendered] > ./ main ./very-big.js?1 1.57 KiB [built] - + 5 hidden root modules + + 6 hidden root modules chunk dev-vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2.js (id hint: vendors) 402 bytes ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] split chunk (cache group: defaultVendors) > ./ main ./node_modules/big.js?1 268 bytes [built] diff --git a/test/cases/chunks/inline-options/index.js b/test/cases/chunks/inline-options/index.js index acf02f708..4b127cc08 100644 --- a/test/cases/chunks/inline-options/index.js +++ b/test/cases/chunks/inline-options/index.js @@ -116,67 +116,71 @@ it("should not find module when mode is weak and chunk not served elsewhere (wit }); }); -it("should contain only one export from webpackExports from module", function () { - return import(/* webpackExports: "usedExports" */ "./dir12/a?1").then( - module => { - expect(module.usedExports).toEqual(["usedExports"]); - } - ); -}); - -it("should contain only webpackExports from module", function () { - return import( - /* webpackExports: ["a", "usedExports", "b"] */ "./dir12/a?2" - ).then(module => { - expect(module.usedExports).toEqual(["a", "b", "usedExports"]); +if (process.env.NODE_ENV === "production") { + it("should contain only one export from webpackExports from module", function () { + return import(/* webpackExports: "usedExports" */ "./dir12/a?1").then( + module => { + expect(module.usedExports).toEqual(["usedExports"]); + } + ); }); -}); -it("should contain only webpackExports from module in eager mode", function () { - return import( - /* + it("should contain only webpackExports from module", function () { + return import( + /* webpackExports: ["a", "usedExports", "b"] */ "./dir12/a?2" + ).then(module => { + expect(module.usedExports).toEqual(["a", "b", "usedExports"]); + }); + }); + + it("should contain only webpackExports from module in eager mode", function () { + return import( + /* webpackMode: "eager", webpackExports: ["a", "usedExports", "b"] */ "./dir12/a?3" - ).then(module => { - expect(module.usedExports).toEqual(["a", "b", "usedExports"]); + ).then(module => { + expect(module.usedExports).toEqual(["a", "b", "usedExports"]); + }); }); -}); -it("should contain webpackExports from module in weak mode", function () { - require.resolve("./dir12/a?4"); - return import( - /* + it("should contain webpackExports from module in weak mode", function () { + require.resolve("./dir12/a?4"); + return import( + /* webpackMode: "weak", webpackExports: ["a", "usedExports", "b"] */ "./dir12/a?4" - ).then(module => { - expect(module.usedExports).toEqual(["a", "b", "usedExports"]); + ).then(module => { + expect(module.usedExports).toEqual(["a", "b", "usedExports"]); + }); }); -}); -it("should not mangle webpackExports from module", function () { - return import(/* webpackExports: "longnameforexport" */ "./dir12/a?5").then( - module => { - expect(module).toHaveProperty("longnameforexport"); - } - ); -}); - -it("should not mangle default webpackExports from module", function () { - return import(/* webpackExports: "default" */ "./dir12/a?6").then(module => { - expect(module).toHaveProperty("default"); + it("should not mangle webpackExports from module", function () { + return import(/* webpackExports: "longnameforexport" */ "./dir12/a?5").then( + module => { + expect(module).toHaveProperty("longnameforexport"); + } + ); }); -}); -it("should contain only webpackExports from module in context mode", function () { - const x = "b"; - return import(/* webpackExports: "usedExports" */ `./dir13/${x}`).then( - module => { - expect(module.usedExports).toEqual(["usedExports"]); - } - ); -}); + it("should not mangle default webpackExports from module", function () { + return import(/* webpackExports: "default" */ "./dir12/a?6").then( + module => { + expect(module).toHaveProperty("default"); + } + ); + }); + + it("should contain only webpackExports from module in context mode", function () { + const x = "b"; + return import(/* webpackExports: "usedExports" */ `./dir13/${x}`).then( + module => { + expect(module.usedExports).toEqual(["usedExports"]); + } + ); + }); +} function testChunkLoading(load, expectedSyncInitial, expectedSyncRequested) { var sync = false; diff --git a/test/cases/inner-graph/circular/index.js b/test/cases/inner-graph/circular/index.js index 86a932adb..eadbc521d 100644 --- a/test/cases/inner-graph/circular/index.js +++ b/test/cases/inner-graph/circular/index.js @@ -5,6 +5,8 @@ it("export should be unused when only unused functions use it", () => { expect(y("a")).toBe("okBAA"); expect(exportAUsed).toBe(true); expect(exportBUsed).toBe(true); - expect(exportCUsed).toBe(false); + if (process.env.NODE_ENV === "production") { + expect(exportCUsed).toBe(false); + } return import("./chunk"); }); diff --git a/test/cases/inner-graph/export-default-named/index.js b/test/cases/inner-graph/export-default-named/index.js index d9b7bcd9c..8eb272ff6 100644 --- a/test/cases/inner-graph/export-default-named/index.js +++ b/test/cases/inner-graph/export-default-named/index.js @@ -21,21 +21,25 @@ it("a should be used", () => { expect(a).toBe(true); }); -it("b should be unused", () => { - expect(b).toBe(false); -}); +if (process.env.NODE_ENV === "production") { + it("b should be unused", () => { + expect(b).toBe(false); + }); +} it("c should be used", () => { expect(c).toBe(true); }); -it("d should be used", () => { - expect(d).toBe(true); -}); +if (process.env.NODE_ENV === "production") { + it("d should be used", () => { + expect(d).toBe(true); + }); -it("e should be unused", () => { - expect(e).toBe(false); -}); + it("e should be unused", () => { + expect(e).toBe(false); + }); +} it("f should be used", () => { expect(f).toBe(true); diff --git a/test/cases/inner-graph/extend-class/index.js b/test/cases/inner-graph/extend-class/index.js index 8ebb93e00..92a68764e 100644 --- a/test/cases/inner-graph/extend-class/index.js +++ b/test/cases/inner-graph/extend-class/index.js @@ -14,9 +14,11 @@ it("should load modules correctly", () => { require("./module2"); }); -it("B should not be used", () => { - expect(exportsInfoForB).toBe(false); -}); +if (process.env.NODE_ENV === "production") { + it("B should not be used", () => { + expect(exportsInfoForB).toBe(false); + }); +} it("A should be used", () => { expect(exportsInfoForA).toBe(true); @@ -27,7 +29,9 @@ it("Z used, inner graph can not determine const usage", () => { }); it("Pure super expression should be unused, another used", () => { - expect(exportsInfoForMixin1).toBe(false); + if (process.env.NODE_ENV === "production") { + expect(exportsInfoForMixin1).toBe(false); + } expect(exportsInfoForMixin2).toBe(true); expect(exportsInfoForMixin3).toBe(true); diff --git a/test/cases/inner-graph/extend-class2/index.js b/test/cases/inner-graph/extend-class2/index.js index ace9be996..895e369f5 100644 --- a/test/cases/inner-graph/extend-class2/index.js +++ b/test/cases/inner-graph/extend-class2/index.js @@ -25,20 +25,24 @@ it("A should be used", () => { expect(exprA).toBe(true); }); -it("B should not be used", () => { - expect(declB).toBe(false); - expect(exprB).toBe(false); -}); +if (process.env.NODE_ENV === "production") { + it("B should not be used", () => { + expect(declB).toBe(false); + expect(exprB).toBe(false); + }); +} it("C should be used", () => { expect(declC).toBe(true); expect(exprC).toBe(true); }); -it("D should not be used", () => { - expect(declD).toBe(false); - expect(exprD).toBe(false); -}); +if (process.env.NODE_ENV === "production") { + it("D should not be used", () => { + expect(declD).toBe(false); + expect(exprD).toBe(false); + }); +} it("E should be used", () => { expect(declE).toBe(true); diff --git a/test/cases/inner-graph/reexport-namespace-and-default/index.js b/test/cases/inner-graph/reexport-namespace-and-default/index.js index 931a4048b..295a7ba33 100644 --- a/test/cases/inner-graph/reexport-namespace-and-default/index.js +++ b/test/cases/inner-graph/reexport-namespace-and-default/index.js @@ -1,15 +1,17 @@ -import {exportDefaultUsed as export1} from "./package1/script"; -import {exportDefaultUsed as export2} from "./package1/script2"; -import {exportDefaultUsed as export3} from "./package2/script"; +import { exportDefaultUsed as export1 } from "./package1/script"; +import { exportDefaultUsed as export2 } from "./package1/script2"; +import { exportDefaultUsed as export3 } from "./package2/script"; it("should load module correctly", () => { - require('./module'); + require("./module"); }); -it("default export should be unused", () => { - expect(export1).toBe(false); - expect(export2).toBe(false); -}); +if (process.env.NODE_ENV === "production") { + it("default export should be unused", () => { + expect(export1).toBe(false); + expect(export2).toBe(false); + }); +} it("default export should be used", () => { expect(export3).toBe(true); diff --git a/test/cases/inner-graph/simple/index.js b/test/cases/inner-graph/simple/index.js index 4a5e42f8c..e993b773d 100644 --- a/test/cases/inner-graph/simple/index.js +++ b/test/cases/inner-graph/simple/index.js @@ -12,11 +12,13 @@ it("export should be unused when only unused functions use it", () => { f1(); expect(pureUsed).toBe(42); expect(fWithDefault()).toBe(42); - expect(exportUsed).toBe(false); - expect(export2Used).toBe(true); - expect(export3Used).toBe(true); - expect(export4Used).toBe(true); - expect(export5Used).toBe(true); - expect(export6Used).toBe(true); + if (process.env.NODE_ENV === "production") { + expect(exportUsed).toBe(false); + expect(export2Used).toBe(true); + expect(export3Used).toBe(true); + expect(export4Used).toBe(true); + expect(export5Used).toBe(true); + expect(export6Used).toBe(true); + } return import("./chunk"); }); diff --git a/test/cases/parsing/harmony-deep-exports/index.js b/test/cases/parsing/harmony-deep-exports/index.js index 85cdd2640..9c4bc28c1 100644 --- a/test/cases/parsing/harmony-deep-exports/index.js +++ b/test/cases/parsing/harmony-deep-exports/index.js @@ -32,21 +32,34 @@ it("should be able to call a deep function in commonjs", () => { it("should report consistent exports info", () => { const x1 = counter.exportsInfo; - expect(x1.incrementInfo).toBe(true); - expect(x1.counterInfo).toBe(true); - expect(x1.resetInfo).toBe(true); - expect(x1.unusedExport).toBe(false); - expect(x1.unusedExportInfo).toBe(false); - expect(x1.somethingElse).toBe(false); - expect(x1.somethingElseInfo).toBe(false); + if (process.env.NODE_ENV === "production") { + expect(x1.incrementInfo).toBe(true); + expect(x1.counterInfo).toBe(true); + expect(x1.resetInfo).toBe(true); + expect(x1.unusedExport).toBe(false); + expect(x1.unusedExportInfo).toBe(false); + expect(x1.somethingElse).toBe(false); + expect(x1.somethingElseInfo).toBe(false); + expect(C.exportsInfo.nsInfo).toBe(true); + expect(C.exportsInfo.ns2).toBe(false); + expect(C.exportsInfo.ns2Info).toBe(false); + } else if (process.env.NODE_ENV === "development") { + expect(x1.incrementInfo).toBe(undefined); + expect(x1.counterInfo).toBe(undefined); + expect(x1.resetInfo).toBe(undefined); + expect(x1.unusedExport).toBe(true); + expect(x1.unusedExportInfo).toBe(undefined); + expect(x1.somethingElse).toBe(true); + expect(x1.somethingElseInfo).toBe(undefined); + expect(C.exportsInfo.nsInfo).toBe(undefined); + expect(C.exportsInfo.ns2).toBe(true); + expect(C.exportsInfo.ns2Info).toBe(undefined); + } expect(x1.increment).toBe(true); expect(x1.counter).toBe(true); expect(x1.reset).toBe(true); expect(x1.incrementProvideInfo).toBe(true); expect(x1.somethingElseProvideInfo).toBe(false); - expect(C.exportsInfo.nsInfo).toBe(true); - expect(C.exportsInfo.ns2).toBe(false); - expect(C.exportsInfo.ns2Info).toBe(false); expect(C.exportsInfo.increment).toBe(x1.increment); expect(C.exportsInfo.counter).toBe(x1.counter); expect(C.exportsInfo.reset).toBe(x1.reset); diff --git a/test/cases/parsing/harmony-export-import-specifier/index.js b/test/cases/parsing/harmony-export-import-specifier/index.js index eaa994a69..013653cb1 100644 --- a/test/cases/parsing/harmony-export-import-specifier/index.js +++ b/test/cases/parsing/harmony-export-import-specifier/index.js @@ -1,31 +1,37 @@ "use strict"; import { x, y } from "./a"; -import {d2, usedD1, usedD2} from "./d.js"; -import {b1, usedB1, usedB2, usedB3, usedB4} from "./b.js"; -import {usedE1, usedE2} from "./e.js"; -import {h} from "./h.js"; +import { d2, usedD1, usedD2 } from "./d.js"; +import { b1, usedB1, usedB2, usedB3, usedB4 } from "./b.js"; +import { usedE1, usedE2 } from "./e.js"; +import { h } from "./h.js"; -it("namespace export as from commonjs should override named export", function() { +it("namespace export as from commonjs should override named export", function () { expect(x).toBe(1); expect(y).toBe(3); }); it("named namespace export should work correctly", function () { expect(d2).toBe(2); - expect(usedD1).toBe(false); + if (process.env.NODE_ENV === "production") { + expect(usedD1).toBe(false); + } expect(usedD2).toBe(true); expect(b1.d2).toBe(2); expect(usedB1).toBe(true); - expect(usedB2).toBe(false); - expect(usedB3).toBe(false); - expect(usedB4).toBe(false); + if (process.env.NODE_ENV === "production") { + expect(usedB2).toBe(false); + expect(usedB3).toBe(false); + expect(usedB4).toBe(false); + } }); it("complex case should work correctly", () => { expect(h.f1.e.e1).toBe(10); expect(h.g1.e1).toBe(10); expect(usedE1).toBe(true); - expect(usedE2).toBe(false); + if (process.env.NODE_ENV === "production") { + expect(usedE2).toBe(false); + } }); diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/a.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/a.js index 9bc18503a..d8b651342 100644 --- a/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/a.js +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/a.js @@ -1,2 +1,2 @@ export * from "./empty"; -export const valueUsed = __webpack_exports_info__.value.useInfo; +export const valueUsed = __webpack_exports_info__.value.used; diff --git a/test/hotCases/unexpected-invalidation/used-exports/index.js b/test/hotCases/unexpected-invalidation/used-exports/index.js new file mode 100644 index 000000000..c01ff0665 --- /dev/null +++ b/test/hotCases/unexpected-invalidation/used-exports/index.js @@ -0,0 +1,13 @@ +import { ghi } from "./subject"; +import value from "./module"; + +it("should not invalidate subject in unrelated locations", done => { + expect(ghi).toBe(42); + expect(value).toBe(40); + import.meta.webpackHot.accept("./module", () => { + expect(ghi).toBe(42); + expect(value).toBe(41); + done(); + }); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/unexpected-invalidation/used-exports/module.js b/test/hotCases/unexpected-invalidation/used-exports/module.js new file mode 100644 index 000000000..4ef19b5f2 --- /dev/null +++ b/test/hotCases/unexpected-invalidation/used-exports/module.js @@ -0,0 +1,3 @@ +export { abc as default } from "./subject"; +--- +export { def as default } from "./subject"; diff --git a/test/hotCases/unexpected-invalidation/used-exports/subject.js b/test/hotCases/unexpected-invalidation/used-exports/subject.js new file mode 100644 index 000000000..c497990ba --- /dev/null +++ b/test/hotCases/unexpected-invalidation/used-exports/subject.js @@ -0,0 +1,3 @@ +export const abc = 40; +export const def = 41; +export const ghi = 42;