From 6eff5de1df62e1e60d2f6409ce8e81d49ea18d0a Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Tue, 12 Apr 2022 16:01:27 +0300 Subject: [PATCH 1/3] add providedInfo test case --- test/cases/parsing/harmony-deep-exports/cjs2.js | 1 + test/cases/parsing/harmony-deep-exports/cjs3.js | 3 +++ test/cases/parsing/harmony-deep-exports/esm1.js | 2 ++ test/cases/parsing/harmony-deep-exports/index.js | 13 +++++++++++++ 4 files changed, 19 insertions(+) create mode 100644 test/cases/parsing/harmony-deep-exports/cjs2.js create mode 100644 test/cases/parsing/harmony-deep-exports/cjs3.js create mode 100644 test/cases/parsing/harmony-deep-exports/esm1.js diff --git a/test/cases/parsing/harmony-deep-exports/cjs2.js b/test/cases/parsing/harmony-deep-exports/cjs2.js new file mode 100644 index 00000000000..61d6ba1833b --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/cjs2.js @@ -0,0 +1 @@ +module.exports = require("./cjs3"); diff --git a/test/cases/parsing/harmony-deep-exports/cjs3.js b/test/cases/parsing/harmony-deep-exports/cjs3.js new file mode 100644 index 00000000000..f02c088c18c --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/cjs3.js @@ -0,0 +1,3 @@ +exports.a = 1; +exports.b = 2; +exports.cjs3DefaultProvidedInfo = __webpack_exports_info__.default.provideInfo; diff --git a/test/cases/parsing/harmony-deep-exports/esm1.js b/test/cases/parsing/harmony-deep-exports/esm1.js new file mode 100644 index 00000000000..e7edf24999f --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/esm1.js @@ -0,0 +1,2 @@ +export default 2; +export const esmDefaultProvidedInfo = __webpack_exports_info__.default.provideInfo; diff --git a/test/cases/parsing/harmony-deep-exports/index.js b/test/cases/parsing/harmony-deep-exports/index.js index b2895c18251..627455e7746 100644 --- a/test/cases/parsing/harmony-deep-exports/index.js +++ b/test/cases/parsing/harmony-deep-exports/index.js @@ -1,6 +1,19 @@ import * as C from "./reexport-namespace"; import { counter } from "./reexport-namespace"; import * as C2 from "./reexport-namespace-again"; +import cj2, { cjs3DefaultProvidedInfo } from "./cjs2"; +import esm1, { esmDefaultProvidedInfo } from "./esm1"; + +it("default providedInfo should be correct for cjs", () => { + expect(cj2.a).toBe(1); + expect(cjs3DefaultProvidedInfo).toBe(false); + expect(__webpack_exports_info__.cj2.default.provideInfo).toBe(false); +}); + +it("default providedInfo and usedInfo should be correct for esm", () => { + expect(esm1).toBe(2); + expect(esmDefaultProvidedInfo).toBe(true); +}); it("should allow to reexport namespaces 1", () => { (0, counter.reset)(); From 55bebac16a34822b0373df59f22880fbbc69c852 Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Tue, 12 Apr 2022 16:19:46 +0300 Subject: [PATCH 2/3] fix HarmonyEvaluatedImportSpecifierDependency --- ...rmonyEvaluatedImportSpecifierDependency.js | 33 +++++++++++++++++-- .../harmony-export-import-specifier/cjs1.js | 2 ++ .../harmony-export-import-specifier/cjs2.js | 1 + .../harmony-export-import-specifier/index.js | 14 ++++++++ .../harmony-export-import-specifier/some.json | 1 + .../some1.json | 3 ++ .../weird-cjs.js | 7 ++++ 7 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 test/cases/parsing/harmony-export-import-specifier/cjs1.js create mode 100644 test/cases/parsing/harmony-export-import-specifier/cjs2.js create mode 100644 test/cases/parsing/harmony-export-import-specifier/some.json create mode 100644 test/cases/parsing/harmony-export-import-specifier/some1.json create mode 100644 test/cases/parsing/harmony-export-import-specifier/weird-cjs.js diff --git a/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js b/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js index 38dc30bb16b..455a93e2724 100644 --- a/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +++ b/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js @@ -61,14 +61,43 @@ HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImpor const dep = /** @type {HarmonyEvaluatedImportSpecifierDependency} */ ( dependency ); - const { moduleGraph, runtime } = templateContext; + const { module, moduleGraph, runtime } = templateContext; const connection = moduleGraph.getConnection(dep); // Skip rendering depending when dependency is conditional if (connection && !connection.isTargetActive(runtime)) return; const exportsInfo = moduleGraph.getExportsInfo(connection.module); const ids = dep.getIds(moduleGraph); - const value = exportsInfo.isExportProvided(ids); + + let value; + + const exportsType = connection.module.getExportsType( + moduleGraph, + module.buildMeta.strictHarmonyModule + ); + switch (exportsType) { + case "default-with-named": { + value = exportsInfo.isExportProvided( + ids[0] === "default" ? ids.slice(1) : ids + ); + break; + } + case "namespace": { + if (ids[0] === "__esModule") { + value = ids.length === 1 || undefined; + } else { + value = exportsInfo.isExportProvided(ids); + } + break; + } + case "dynamic": { + if (ids[0] !== "default") { + value = exportsInfo.isExportProvided(ids); + } + break; + } + // default-only could lead to runtime error, when default value is primitive + } if (typeof value === "boolean") { source.replace(dep.range[0], dep.range[1] - 1, `${value}`); diff --git a/test/cases/parsing/harmony-export-import-specifier/cjs1.js b/test/cases/parsing/harmony-export-import-specifier/cjs1.js new file mode 100644 index 00000000000..01fa3b71d0e --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/cjs1.js @@ -0,0 +1,2 @@ +exports.a = 2; +exports.b = 3; diff --git a/test/cases/parsing/harmony-export-import-specifier/cjs2.js b/test/cases/parsing/harmony-export-import-specifier/cjs2.js new file mode 100644 index 00000000000..e650ca0fe4f --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/cjs2.js @@ -0,0 +1 @@ +module.exports = require("./cjs1"); diff --git a/test/cases/parsing/harmony-export-import-specifier/index.js b/test/cases/parsing/harmony-export-import-specifier/index.js index 2752615c713..fcc2f0bb91f 100644 --- a/test/cases/parsing/harmony-export-import-specifier/index.js +++ b/test/cases/parsing/harmony-export-import-specifier/index.js @@ -7,11 +7,15 @@ import { usedE1, usedE2 } from "./e.js"; import { h } from "./h.js"; import * as m from "./m"; import {object as obj} from "./m"; +import cjs from "./cjs2"; import * as o from "./o"; import * as p from "./p"; import * as q from "./q"; import * as so from "./side-effect-free/o"; import * as sm from "./side-effect-free/m"; +import json1 from "./some.json"; +import json2 from "./some1.json"; +import weirdCjs from "./weird-cjs"; it("namespace export as from commonjs should override named export", function () { expect(x).toBe(1); @@ -48,6 +52,16 @@ it("should handle 'm in n' case", () => { expect(obj.aaa).toBe(true); expect("not_here" in m.object).toBe(false); expect("not_here" in obj).toBe(false); + expect("__esModule" in q).toBe(true); + expect(() => "value" in q.__esModule).toThrow(); + expect(() => "not_here" in json1).toThrow(); + expect("not_here" in json2).toBe(false); + expect("a" in json2).toBe(true); + expect("a" in cjs).toBe(true); + expect("not_here" in cjs).toBe(false); + expect("not_here" in weirdCjs).toBe(false); + expect("a" in weirdCjs).toBe(true); + expect(() => "a" in weirdCjs.a).toThrow(); expect("aaa" in o).toBe(true); expect("aaa" in p).toBe(false); expect("ccc" in m).toBe(false); diff --git a/test/cases/parsing/harmony-export-import-specifier/some.json b/test/cases/parsing/harmony-export-import-specifier/some.json new file mode 100644 index 00000000000..27ba77ddaf6 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/some.json @@ -0,0 +1 @@ +true diff --git a/test/cases/parsing/harmony-export-import-specifier/some1.json b/test/cases/parsing/harmony-export-import-specifier/some1.json new file mode 100644 index 00000000000..8d6b85c7b3f --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/some1.json @@ -0,0 +1,3 @@ +{ + "a": 1 +} diff --git a/test/cases/parsing/harmony-export-import-specifier/weird-cjs.js b/test/cases/parsing/harmony-export-import-specifier/weird-cjs.js new file mode 100644 index 00000000000..698bfce670d --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/weird-cjs.js @@ -0,0 +1,7 @@ +exports.__esModule = false; + +function dynamic(exports) { + exports.a = 1; +} + +dynamic(exports); From 7033f5526225f26e8dea9cfc1f67accb7ffb4b9c Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Thu, 14 Apr 2022 15:53:24 +0300 Subject: [PATCH 3/3] fix exports type usage --- .../HarmonyEvaluatedImportSpecifierDependency.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js b/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js index 455a93e2724..af9a1cde3c3 100644 --- a/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +++ b/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js @@ -77,9 +77,12 @@ HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImpor ); switch (exportsType) { case "default-with-named": { - value = exportsInfo.isExportProvided( - ids[0] === "default" ? ids.slice(1) : ids - ); + if (ids[0] === "default") { + value = + ids.length === 1 || exportsInfo.isExportProvided(ids.slice(1)); + } else { + value = exportsInfo.isExportProvided(ids); + } break; } case "namespace": {