From a167a7ecf557614d691dfaceec36947a8c723242 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Fri, 21 Jul 2017 23:32:31 +0200 Subject: [PATCH] allow to use default export of root module in concatenated module in inner modules better error messages when parsing fails fixes #5314 #5304 --- lib/optimize/ConcatenatedModule.js | 43 ++++++++++++------- test/cases/scope-hoisting/issue-5314/index.js | 9 ++++ .../cases/scope-hoisting/issue-5314/module.js | 2 + 3 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 test/cases/scope-hoisting/issue-5314/index.js create mode 100644 test/cases/scope-hoisting/issue-5314/module.js diff --git a/lib/optimize/ConcatenatedModule.js b/lib/optimize/ConcatenatedModule.js index ff59f117075..ef74f1eec8c 100644 --- a/lib/optimize/ConcatenatedModule.js +++ b/lib/optimize/ConcatenatedModule.js @@ -309,12 +309,22 @@ class ConcatenatedModule extends Module { const m = info.module; const source = m.source(innerDependencyTemplates, outputOptions, requestShortener); const code = source.source(); - const ast = acorn.parse(code, { - ranges: true, - locations: true, - ecmaVersion: Parser.ECMA_VERSION, - sourceType: "module" - }); + let ast; + try { + ast = acorn.parse(code, { + ranges: true, + locations: true, + ecmaVersion: Parser.ECMA_VERSION, + sourceType: "module" + }); + } catch(err) { + if(err.loc && typeof err.loc === "object" && typeof err.loc.line === "number") { + const lineNumber = err.loc.line; + const lines = code.split("\n"); + err.message += "\n| " + lines.slice(Math.max(0, lineNumber - 3), lineNumber + 2).join("\n| "); + } + throw err; + } const scopeManager = escope.analyze(ast, { ecmaVersion: 6, sourceType: "module", @@ -529,19 +539,20 @@ class HarmonyExportExpressionDependencyConcatenatedTemplate { } apply(dep, source, outputOptions, requestShortener, dependencyTemplates) { + let content = "/* harmony default export */ var __WEBPACK_MODULE_DEFAULT_EXPORT__ = "; if(dep.originModule === this.rootModule) { - this.originalTemplate.apply(dep, source, outputOptions, requestShortener, dependencyTemplates); - } else { - const content = "/* harmony default export */ var __WEBPACK_MODULE_DEFAULT_EXPORT__ = "; - - if(dep.range) { - source.replace(dep.rangeStatement[0], dep.range[0] - 1, content + "("); - source.replace(dep.range[1], dep.rangeStatement[1] - 1, ");"); - return; - } + const used = dep.originModule.isUsed("default"); + const exportsName = dep.originModule.exportsArgument || "exports"; + if(used) content += `${exportsName}[${JSON.stringify(used)}] = `; + } - source.replace(dep.rangeStatement[0], dep.rangeStatement[1] - 1, content); + if(dep.range) { + source.replace(dep.rangeStatement[0], dep.range[0] - 1, content + "("); + source.replace(dep.range[1], dep.rangeStatement[1] - 1, ");"); + return; } + + source.replace(dep.rangeStatement[0], dep.rangeStatement[1] - 1, content); } } diff --git a/test/cases/scope-hoisting/issue-5314/index.js b/test/cases/scope-hoisting/issue-5314/index.js new file mode 100644 index 00000000000..2697608c7de --- /dev/null +++ b/test/cases/scope-hoisting/issue-5314/index.js @@ -0,0 +1,9 @@ +import a from "./module"; + +var obj = {}; + +it("should allow access to the default export of the root module", function() { + a().should.be.eql(obj); +}); + +export default obj; diff --git a/test/cases/scope-hoisting/issue-5314/module.js b/test/cases/scope-hoisting/issue-5314/module.js new file mode 100644 index 00000000000..f226f2b70a6 --- /dev/null +++ b/test/cases/scope-hoisting/issue-5314/module.js @@ -0,0 +1,2 @@ +import b from "./index"; +export default function() { return b; };