From eddd3206dc6cb6f3666b1824760c4f61ebc497bf Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 15 Sep 2020 12:21:37 +0200 Subject: [PATCH] add raw export for named reexport from non-harmony --- lib/ConcatenationScope.js | 18 ++++++++++++++++++ ...HarmonyExportImportedSpecifierDependency.js | 14 ++++++++++++-- lib/optimize/ConcatenatedModule.js | 15 +++++++++++++-- types.d.ts | 6 ++++++ 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/lib/ConcatenationScope.js b/lib/ConcatenationScope.js index 30a55e94c..3eec5ef5f 100644 --- a/lib/ConcatenationScope.js +++ b/lib/ConcatenationScope.js @@ -23,6 +23,7 @@ const NAMESPACE_OBJECT_EXPORT = "__WEBPACK_NAMESPACE_OBJECT__"; * @property {number} index * @property {Module} module * @property {Map} exportMap mapping from export name to symbol + * @property {Map} rawExportMap mapping from export name to symbol * @property {string=} namespaceExportSymbol */ @@ -64,11 +65,28 @@ class ConcatenationScope { * @param {string} symbol identifier of the export in source code */ registerExport(exportName, symbol) { + if (!this._currentModule.exportMap) { + this._currentModule.exportMap = new Map(); + } if (!this._currentModule.exportMap.has(exportName)) { this._currentModule.exportMap.set(exportName, symbol); } } + /** + * + * @param {string} exportName name of the export + * @param {string} expression expression to be used + */ + registerRawExport(exportName, expression) { + if (!this._currentModule.rawExportMap) { + this._currentModule.rawExportMap = new Map(); + } + if (!this._currentModule.rawExportMap.has(exportName)) { + this._currentModule.rawExportMap.set(exportName, expression); + } + } + /** * @param {string} symbol identifier of the export in source code */ diff --git a/lib/dependencies/HarmonyExportImportedSpecifierDependency.js b/lib/dependencies/HarmonyExportImportedSpecifierDependency.js index bdabe9111..a7272405b 100644 --- a/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +++ b/lib/dependencies/HarmonyExportImportedSpecifierDependency.js @@ -746,13 +746,23 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS * @returns {void} */ apply(dependency, source, templateContext) { - if (templateContext.concatenationScope) return; - const { moduleGraph, runtime } = templateContext; + const { moduleGraph, runtime, concatenationScope } = templateContext; const dep = /** @type {HarmonyExportImportedSpecifierDependency} */ (dependency); const mode = dep.getMode(moduleGraph, runtime); + if (concatenationScope) { + switch (mode.type) { + case "reexport-undefined": + concatenationScope.registerRawExport( + mode.name, + "/* reexport non-default export from non-harmony */ undefined" + ); + } + return; + } + if (mode.type !== "unused" && mode.type !== "empty-star") { super.apply(dependency, source, templateContext); diff --git a/lib/optimize/ConcatenatedModule.js b/lib/optimize/ConcatenatedModule.js index 40d375427..a7bed6db3 100644 --- a/lib/optimize/ConcatenatedModule.js +++ b/lib/optimize/ConcatenatedModule.js @@ -90,6 +90,7 @@ const propertyAccess = require("../util/propertyAccess"); * @property {Scope} moduleScope * @property {Map} internalNames * @property {Map} exportMap + * @property {Map} rawExportMap * @property {string=} namespaceExportSymbol * @property {string} namespaceObjectName * @property {boolean} interopNamespaceObjectUsed @@ -326,7 +327,7 @@ const getFinalBinding = ( switch (info.type) { case "concatenated": { const exportId = exportName[0]; - const directExport = info.exportMap.get(exportId); + const directExport = info.exportMap && info.exportMap.get(exportId); if (directExport) { const usedName = /** @type {string[]} */ (exportsInfo.getUsedName( exportName, @@ -339,6 +340,15 @@ const getFinalBinding = ( exportName }; } + const rawExport = info.rawExportMap && info.rawExportMap.get(exportId); + if (rawExport) { + return { + info, + rawName: rawExport, + ids: exportName.slice(1), + exportName + }; + } const reexport = exportInfo.findTarget(moduleGraph, module => moduleToInfoMap.has(module) ); @@ -1495,7 +1505,8 @@ class ConcatenatedModule extends Module { globalScope: undefined, moduleScope: undefined, internalNames: new Map(), - exportMap: new Map(), + exportMap: undefined, + rawExportMap: undefined, namespaceExportSymbol: undefined, namespaceObjectName: undefined, interopNamespaceObjectUsed: false, diff --git a/types.d.ts b/types.d.ts index 2b506f8e8..4685c897b 100644 --- a/types.d.ts +++ b/types.d.ts @@ -1674,6 +1674,11 @@ declare interface ConcatenatedModuleInfo { * mapping from export name to symbol */ exportMap: Map; + + /** + * mapping from export name to symbol + */ + rawExportMap: Map; namespaceExportSymbol?: string; } declare interface ConcatenationBailoutReasonContext { @@ -1694,6 +1699,7 @@ declare class ConcatenationScope { ); isModuleInScope(module: Module): boolean; registerExport(exportName: string, symbol: string): void; + registerRawExport(exportName: string, expression: string): void; registerNamespaceExport(symbol: string): void; createModuleReference( module: Module,