Skip to content

Commit

Permalink
allow to use default export of root module in concatenated module in …
Browse files Browse the repository at this point in the history
…inner modules

better error messages when parsing fails

fixes #5314
#5304
  • Loading branch information
sokra committed Jul 21, 2017
1 parent 4c6eb6f commit a167a7e
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 16 deletions.
43 changes: 27 additions & 16 deletions lib/optimize/ConcatenatedModule.js
Expand Up @@ -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",
Expand Down Expand Up @@ -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);
}
}

Expand Down
9 changes: 9 additions & 0 deletions 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;
2 changes: 2 additions & 0 deletions test/cases/scope-hoisting/issue-5314/module.js
@@ -0,0 +1,2 @@
import b from "./index";
export default function() { return b; };

0 comments on commit a167a7e

Please sign in to comment.