Skip to content

Commit

Permalink
Merge commit 'ba703401d580ad623af17fe96ed98b4d801e0313'
Browse files Browse the repository at this point in the history
# Conflicts:
#	test/__snapshots__/StatsTestCases.test.js.snap
  • Loading branch information
sokra committed May 29, 2018
2 parents 1e09650 + ba70340 commit c01cb97
Show file tree
Hide file tree
Showing 38 changed files with 403 additions and 260 deletions.
63 changes: 25 additions & 38 deletions lib/ContextModule.js
Expand Up @@ -253,7 +253,7 @@ class ContextModule extends Module {
}

getFakeMap(dependencies) {
if (!this.options.namespaceObject) return 1;
if (!this.options.namespaceObject) return 9;
// if we filter first we get a new array
// therefor we dont need to create a clone of dependencies explicitly
// therefore the order of this is !important!
Expand All @@ -268,20 +268,24 @@ class ContextModule extends Module {
.reduce((map, dep) => {
const exportsType =
dep.module.buildMeta && dep.module.buildMeta.exportsType;
if (!exportsType) hasNonHarmony = true;
if (exportsType === "namespace") hasNamespace = true;
if (exportsType === "named") hasNamed = true;
map[dep.module.id] =
{
namespace: 1,
named: 2
}[exportsType] || 0;
const id = dep.module.id;
if (!exportsType) {
map[id] = this.options.namespaceObject === "strict" ? 1 : 7;
hasNonHarmony = true;
} else if (exportsType === "namespace") {
map[id] = 9;
hasNamespace = true;
} else if (exportsType === "named") {
map[id] = 3;
hasNamed = true;
}
return map;
}, Object.create(null));
if (!hasNamespace && hasNonHarmony && !hasNamed) return 0;
if (hasNamespace && !hasNonHarmony && !hasNamed) return 1;
if (!hasNamespace && !hasNonHarmony && hasNamed) return 2;
if (!hasNamespace && !hasNonHarmony && !hasNamed) return 1;
if (!hasNamespace && hasNonHarmony && !hasNamed)
return this.options.namespaceObject === "strict" ? 1 : 7;
if (hasNamespace && !hasNonHarmony && !hasNamed) return 9;
if (!hasNamespace && !hasNonHarmony && hasNamed) return 3;
if (!hasNamespace && !hasNonHarmony && !hasNamed) return 9;
return fakeMap;
}

Expand All @@ -292,26 +296,14 @@ class ContextModule extends Module {
}

getReturn(type) {
if (type === 1) return "module";
if (type === 2)
return 'Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module })';
if (type === 0) {
if (this.options.namespaceObject === "strict") {
return '/* fake namespace object */ { "default": module }';
} else {
return '(typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }))';
}
}
if (type === 9) return "__webpack_require__(id)";
return `__webpack_require__.t(id, ${type})`;
}

getReturnModuleObjectSource(fakeMap, fakeMapDataExpression = "fakeMap[id]") {
if (typeof fakeMap === "number")
return `return ${this.getReturn(fakeMap)};`;
return `return ${fakeMapDataExpression} === 1 ? ${this.getReturn(
1
)} : ${fakeMapDataExpression} ? ${this.getReturn(2)} : ${this.getReturn(
0
)};`;
return `return __webpack_require__.t(id, ${fakeMapDataExpression})`;
}

getSyncSource(dependencies, id) {
Expand All @@ -324,7 +316,6 @@ ${this.getFakeMapInitStatement(fakeMap)}
function webpackContext(req) {
var id = webpackContextResolve(req);
var module = __webpack_require__(id);
${returnModuleObject}
}
function webpackContextResolve(req) {
Expand Down Expand Up @@ -359,7 +350,6 @@ function webpackContext(req) {
e.code = 'MODULE_NOT_FOUND';
throw e;
}
var module = __webpack_require__(id);
${returnModuleObject}
}
function webpackContextResolve(req) {
Expand Down Expand Up @@ -394,7 +384,6 @@ function webpackAsyncContext(req) {
e.code = 'MODULE_NOT_FOUND';
throw e;
}
var module = __webpack_require__(id);
${returnModuleObject}
});
}
Expand Down Expand Up @@ -423,11 +412,10 @@ module.exports = webpackAsyncContext;`;
const map = this.getUserRequestMap(dependencies);
const fakeMap = this.getFakeMap(dependencies);
const thenFunction =
fakeMap !== 1
fakeMap !== 9
? `function(id) {
var module = __webpack_require__(id);
${this.getReturnModuleObjectSource(fakeMap)}
}`
${this.getReturnModuleObjectSource(fakeMap)}
}`
: "__webpack_require__";
return `var map = ${JSON.stringify(map, null, "\t")};
${this.getFakeMapInitStatement(fakeMap)}
Expand Down Expand Up @@ -464,9 +452,8 @@ module.exports = webpackAsyncContext;`;
const map = this.getUserRequestMap(dependencies);
const fakeMap = this.getFakeMap(dependencies);
const thenFunction =
fakeMap !== 1
fakeMap !== 9
? `function(id) {
var module = __webpack_require__(id);
${this.getReturnModuleObjectSource(fakeMap)};
}`
: "__webpack_require__";
Expand Down Expand Up @@ -546,7 +533,7 @@ function webpackAsyncContext(req) {
});
}
return ${requestPrefix}.then(function() {
var module = __webpack_require__(ids[0]);
var id = ids[0];
${returnModuleObject}
});
}
Expand Down
38 changes: 31 additions & 7 deletions lib/MainTemplate.js
Expand Up @@ -44,6 +44,7 @@ const Template = require("./Template");
// __webpack_require__.d = the exported property define getter function
// __webpack_require__.o = Object.prototype.hasOwnProperty.call
// __webpack_require__.r = define compatibility on export
// __webpack_require__.t = create a fake namespace object
// __webpack_require__.n = compatibility get default export
// __webpack_require__.h = the webpack hash
// __webpack_require__.w = an object containing all installed WebAssembly.Instance export objects keyed by module id
Expand Down Expand Up @@ -258,13 +259,7 @@ module.exports = class MainTemplate extends Tapable {
Template.indent([
`if(!${this.requireFn}.o(exports, name)) {`,
Template.indent([
"Object.defineProperty(exports, name, {",
Template.indent([
"configurable: false,",
"enumerable: true,",
"get: getter"
]),
"});"
"Object.defineProperty(exports, name, { enumerable: true, get: getter });"
]),
"}"
])
Expand All @@ -276,11 +271,40 @@ module.exports = class MainTemplate extends Tapable {
buf.push(`${this.requireFn}.r = function(exports) {`);
buf.push(
Template.indent([
"if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {",
Template.indent([
"Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });"
]),
"}",
"Object.defineProperty(exports, '__esModule', { value: true });"
])
);
buf.push("};");

buf.push("");
buf.push("// create a fake namespace object");
buf.push("// mode & 1: value is a module id, require it");
buf.push("// mode & 2: merge all properties of value into the ns");
buf.push("// mode & 4: return value when already ns object");
buf.push("// mode & 8|1: behave like require");
buf.push(`${this.requireFn}.t = function(value, mode) {`);
buf.push(
Template.indent([
`if(mode & 1) value = ${this.requireFn}(value);`,
`if(mode & 8) return value;`,
"if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;",
"var ns = Object.create(null);",
`${this.requireFn}.r(ns);`,
"Object.defineProperty(ns, 'default', { enumerable: true, value: value });",
"if(mode & 2 && typeof value != 'string') for(var key in value) " +
`${this.requireFn}.d(ns, key, function(key) { ` +
"return value[key]; " +
"}.bind(null, key));",
"return ns;"
])
);
buf.push("};");

buf.push("");
buf.push(
"// getDefaultExport function for compatibility with non-harmony modules"
Expand Down
62 changes: 38 additions & 24 deletions lib/RuntimeTemplate.js
Expand Up @@ -94,19 +94,27 @@ module.exports = class RuntimeTemplate {
}

moduleNamespace({ module, request, strict }) {
const rawModule = this.moduleRaw({
if (!module)
return this.missingModule({
request
});
const moduleId = this.moduleId({
module,
request
});
const exportsType = module.buildMeta && module.buildMeta.exportsType;
if (exportsType === "namespace") {
const rawModule = this.moduleRaw({
module,
request
});
return rawModule;
} else if (exportsType === "named") {
return `Object.assign({/* fake namespace object */}, ${rawModule}, { "default": ${rawModule} })`;
return `__webpack_require__.t(${moduleId}, 3)`;
} else if (strict) {
return `Object({ /* fake namespace object */ "default": ${rawModule} })`;
return `__webpack_require__.t(${moduleId}, 1)`;
} else {
return `Object(function() { var module = ${rawModule}; return typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }); }())`;
return `__webpack_require__.t(${moduleId}, 7)`;
}
}

Expand Down Expand Up @@ -140,23 +148,39 @@ module.exports = class RuntimeTemplate {
}
header += `if(!__webpack_require__.m[${idExpr}]) { var e = new Error("Module '" + ${idExpr} + "' is not available (weak dependency)"); e.code = 'MODULE_NOT_FOUND'; throw e; } `;
}
const rawModule = this.moduleRaw({
const moduleId = this.moduleId({
module,
request
});
const exportsType = module.buildMeta && module.buildMeta.exportsType;
if (exportsType === "namespace") {
if (header) {
const rawModule = this.moduleRaw({
module,
request
});
getModuleFunction = `function() { ${header}return ${rawModule}; }`;
} else {
getModuleFunction = `__webpack_require__.bind(null, ${comment}${idExpr})`;
}
} else if (exportsType === "named") {
getModuleFunction = `function() { ${header}var module = ${rawModule}; return Object.assign({/* fake namespace object */}, module, { "default": module }); }`;
if (header) {
getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 3); }`;
} else {
getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 3)`;
}
} else if (strict) {
getModuleFunction = `function() { ${header}return { /* fake namespace object */ "default": ${rawModule} }; }`;
if (header) {
getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 1); }`;
} else {
getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 1)`;
}
} else {
getModuleFunction = `function() { ${header}var module = ${rawModule}; return typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }); }`;
if (header) {
getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 7); }`;
} else {
getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 7)`;
}
}

return `${promise || "Promise.resolve()"}.then(${getModuleFunction})`;
Expand All @@ -168,29 +192,23 @@ module.exports = class RuntimeTemplate {
request
});
}
if (module.id === null) {
throw new Error(
`RuntimeTemplate.importStatement(): Module ${module.identifier()} has no id. This should not happen.`
);
}
const comment = this.comment({
const moduleId = this.moduleId({
module,
request
});
const optDeclaration = update ? "" : "var ";

const exportsType = module.buildMeta && module.buildMeta.exportsType;
let content = `/* harmony import */ ${optDeclaration}${importVar} = __webpack_require__(${comment}${JSON.stringify(
module.id
)});\n`;
let content = `/* harmony import */ ${optDeclaration}${importVar} = __webpack_require__(${moduleId});\n`;

if (!exportsType && !originModule.buildMeta.strictHarmonyModule) {
content += `/* harmony import */ ${optDeclaration}${importVar}_default = /*#__PURE__*/__webpack_require__.n(${importVar});\n`;
}
if (exportsType === "named") {
if (Array.isArray(module.buildMeta.providedExports))
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/Object.assign({}, ${importVar}, {"default": ${importVar}});\n`;
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/__webpack_require__.t(${moduleId}, 1);\n`;
else
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/{ /* fake namespace object */ "default": ${importVar} };\n`;
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/__webpack_require__.t(${moduleId});\n`;
}
return content;
}
Expand Down Expand Up @@ -224,11 +242,7 @@ module.exports = class RuntimeTemplate {
if (exportName) {
return "/* non-default import from non-esm module */undefined";
} else {
if (asiSafe) {
return `/*#__PURE__*/{ /* fake namespace object */ "default": ${importVar} }`;
} else {
return `/*#__PURE__*/Object({ /* fake namespace object */ "default": ${importVar} })`;
}
return `/*#__PURE__*/__webpack_require__.t(${importVar})`;
}
}
}
Expand Down
Expand Up @@ -593,7 +593,7 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
const exportsName = module.exportsArgument;
return `__webpack_require__.d(${exportsName}, ${JSON.stringify(
key
)}, function() { return { "default": ${name} }; });\n`;
)}, function() { return __webpack_require__.t(${name}); });\n`;
}

getConditionalReexportStatement(module, key, name, valueKey) {
Expand Down
10 changes: 3 additions & 7 deletions lib/optimize/ConcatenatedModule.js
Expand Up @@ -27,7 +27,7 @@ const ensureNsObjSource = (
if (!info.hasNamespaceObject) {
info.hasNamespaceObject = true;
const name = info.exportMap.get(true);
const nsObj = [`var ${name} = {};`];
const nsObj = [`var ${name} = {};`, `__webpack_require__.r(${name});`];
for (const exportName of info.module.buildMeta.providedExports) {
const finalName = getFinalName(
info,
Expand Down Expand Up @@ -1059,17 +1059,13 @@ class ConcatenatedModule extends Module {
result.add(
`var ${
info.interopNamespaceObjectName
} = /*#__PURE__*/Object.assign({ /* fake namespace object */ }, ${
info.name
}, { "default": ${info.name} });\n`
} = /*#__PURE__*/__webpack_require__.t(${info.name}, 2);\n`
);
} else if (!info.module.buildMeta.exportsType) {
result.add(
`var ${
info.interopNamespaceObjectName
} = /*#__PURE__*/{ /* fake namespace object */ "default": ${
info.name
} };\n`
} = /*#__PURE__*/__webpack_require__.t(${info.name});\n`
);
}
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "webpack",
"version": "4.9.2",
"version": "4.10.0",
"author": "Tobias Koppers @sokra",
"description": "Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.",
"license": "MIT",
Expand Down

0 comments on commit c01cb97

Please sign in to comment.