2017-12-07 17:31:00 +08:00
|
|
|
/*
|
|
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
|
|
Author Tobias Koppers @sokra
|
|
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
|
2017-12-19 22:50:09 +08:00
|
|
|
const Template = require("./Template");
|
|
|
|
|
2017-12-07 17:31:00 +08:00
|
|
|
module.exports = class RuntimeTemplate {
|
|
|
|
constructor(outputOptions, requestShortener) {
|
|
|
|
this.outputOptions = outputOptions || {};
|
|
|
|
this.requestShortener = requestShortener;
|
|
|
|
}
|
2017-12-19 22:50:09 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
comment({ request, chunkName, chunkReason, message, exportName }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
let content;
|
2018-02-25 09:00:20 +08:00
|
|
|
if (this.outputOptions.pathinfo) {
|
|
|
|
content = [message, request, chunkName, chunkReason]
|
|
|
|
.filter(Boolean)
|
|
|
|
.map(item => this.requestShortener.shorten(item))
|
|
|
|
.join(" | ");
|
2017-12-19 22:50:09 +08:00
|
|
|
} else {
|
2018-02-25 09:00:20 +08:00
|
|
|
content = [message, chunkName, chunkReason]
|
|
|
|
.filter(Boolean)
|
|
|
|
.map(item => this.requestShortener.shorten(item))
|
|
|
|
.join(" | ");
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
if (!content) return "";
|
|
|
|
if (this.outputOptions.pathinfo) {
|
2017-12-23 15:11:28 +08:00
|
|
|
return Template.toComment(content) + " ";
|
2017-12-19 22:50:09 +08:00
|
|
|
} else {
|
2017-12-23 15:11:28 +08:00
|
|
|
return Template.toNormalComment(content) + " ";
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
throwMissingModuleErrorFunction({ request }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
const err = `Cannot find module "${request}"`;
|
2018-02-25 09:00:20 +08:00
|
|
|
return `function webpackMissingModule() { var e = new Error(${JSON.stringify(
|
|
|
|
err
|
|
|
|
)}); e.code = 'MODULE_NOT_FOUND'; throw e; }`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
missingModule({ request }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return `!(${this.throwMissingModuleErrorFunction({ request })}())`;
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
missingModuleStatement({ request }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return `${this.missingModule({ request })};\n`;
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
missingModulePromise({ request }) {
|
|
|
|
return `Promise.resolve().then(${this.throwMissingModuleErrorFunction({
|
|
|
|
request
|
|
|
|
})})`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
moduleId({ module, request }) {
|
|
|
|
if (!module)
|
|
|
|
return this.missingModule({
|
|
|
|
request
|
|
|
|
});
|
2017-12-19 22:50:09 +08:00
|
|
|
return `${this.comment({ request })}${JSON.stringify(module.id)}`;
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
moduleRaw({ module, request }) {
|
|
|
|
if (!module)
|
|
|
|
return this.missingModule({
|
|
|
|
request
|
|
|
|
});
|
2017-12-19 22:50:09 +08:00
|
|
|
return `__webpack_require__(${this.moduleId({ module, request })})`;
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
moduleExports({ module, request }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return this.moduleRaw({
|
|
|
|
module,
|
|
|
|
request
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
moduleNamespace({ module, request, strict }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
const rawModule = this.moduleRaw({
|
|
|
|
module,
|
|
|
|
request
|
|
|
|
});
|
2017-12-23 01:23:20 +08:00
|
|
|
const exportsType = module.buildMeta && module.buildMeta.exportsType;
|
2018-02-25 09:00:20 +08:00
|
|
|
if (exportsType === "namespace") {
|
2017-12-19 22:50:09 +08:00
|
|
|
return rawModule;
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (exportsType === "named") {
|
|
|
|
return `Object.assign({/* fake namespace object */}, ${
|
|
|
|
rawModule
|
|
|
|
}, { "default": ${rawModule} })`;
|
|
|
|
} else if (strict) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return `Object({ /* fake namespace object */ "default": ${rawModule} })`;
|
|
|
|
} else {
|
2018-02-25 09:00:20 +08:00
|
|
|
return `Object(function() { var module = ${
|
|
|
|
rawModule
|
2018-02-27 01:42:07 +08:00
|
|
|
}; return typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }); }())`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
moduleNamespacePromise({ block, module, request, message, strict, weak }) {
|
|
|
|
if (!module)
|
|
|
|
return this.missingModulePromise({
|
|
|
|
request
|
|
|
|
});
|
2017-12-19 22:50:09 +08:00
|
|
|
const promise = this.blockPromise({
|
|
|
|
block,
|
|
|
|
message
|
|
|
|
});
|
|
|
|
|
|
|
|
let getModuleFunction;
|
|
|
|
let idExpr = JSON.stringify(module.id);
|
|
|
|
const comment = this.comment({
|
|
|
|
request
|
|
|
|
});
|
|
|
|
let header = "";
|
2018-02-25 09:00:20 +08:00
|
|
|
if (weak) {
|
|
|
|
if (idExpr.length > 8) {
|
|
|
|
// 'var x="nnnnnn";x,"+x+",x' vs '"nnnnnn",nnnnnn,"nnnnnn"'
|
2017-12-19 22:50:09 +08:00
|
|
|
header += `var id = ${idExpr}; `;
|
|
|
|
idExpr = "id";
|
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
header += `if(!__webpack_require__.m[${
|
|
|
|
idExpr
|
|
|
|
}]) { var e = new Error("Module '" + ${
|
|
|
|
idExpr
|
|
|
|
} + "' is not available (weak dependency)"); e.code = 'MODULE_NOT_FOUND'; throw e; } `;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
const rawModule = this.moduleRaw({
|
|
|
|
module,
|
|
|
|
request
|
|
|
|
});
|
2017-12-23 01:23:20 +08:00
|
|
|
const exportsType = module.buildMeta && module.buildMeta.exportsType;
|
2018-02-25 09:00:20 +08:00
|
|
|
if (exportsType === "namespace") {
|
|
|
|
if (header) {
|
2017-12-19 22:50:09 +08:00
|
|
|
getModuleFunction = `function() { ${header}return ${rawModule}; }`;
|
|
|
|
} else {
|
2018-02-25 09:00:20 +08:00
|
|
|
getModuleFunction = `__webpack_require__.bind(null, ${comment}${
|
|
|
|
idExpr
|
|
|
|
})`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (exportsType === "named") {
|
|
|
|
getModuleFunction = `function() { ${header}var module = ${
|
|
|
|
rawModule
|
|
|
|
}; return Object.assign({/* fake namespace object */}, module, { "default": module }); }`;
|
|
|
|
} else if (strict) {
|
|
|
|
getModuleFunction = `function() { ${
|
|
|
|
header
|
|
|
|
}return { /* fake namespace object */ "default": ${rawModule} }; }`;
|
2017-12-19 22:50:09 +08:00
|
|
|
} else {
|
2018-02-25 09:00:20 +08:00
|
|
|
getModuleFunction = `function() { ${header}var module = ${
|
|
|
|
rawModule
|
2018-02-27 01:42:07 +08:00
|
|
|
}; return typeof module === "object" && module && module.__esModule ? module : Object.assign({/* fake namespace object */}, typeof module === "object" && module, { "default": module }); }`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return `${promise || "Promise.resolve()"}.then(${getModuleFunction})`;
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
importStatement({ update, module, request, importVar, originModule }) {
|
|
|
|
if (!module)
|
|
|
|
return this.missingModuleStatement({
|
|
|
|
request
|
|
|
|
});
|
2017-12-19 22:50:09 +08:00
|
|
|
const comment = this.comment({
|
|
|
|
request
|
|
|
|
});
|
|
|
|
const optDeclaration = update ? "" : "var ";
|
|
|
|
|
2017-12-23 01:23:20 +08:00
|
|
|
const exportsType = module.buildMeta && module.buildMeta.exportsType;
|
2018-02-25 09:00:20 +08:00
|
|
|
let content = `/* harmony import */ ${optDeclaration}${
|
|
|
|
importVar
|
|
|
|
} = __webpack_require__(${comment}${JSON.stringify(module.id)});\n`;
|
2017-12-23 01:23:20 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
if (!exportsType && !originModule.buildMeta.strictHarmonyModule) {
|
|
|
|
content += `/* harmony import */ ${optDeclaration}${
|
|
|
|
importVar
|
|
|
|
}_default = /*#__PURE__*/__webpack_require__.n(${importVar});\n`;
|
2017-12-23 01:23:20 +08:00
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
if (exportsType === "named") {
|
|
|
|
if (Array.isArray(module.buildMeta.providedExports))
|
|
|
|
content += `${optDeclaration}${
|
|
|
|
importVar
|
|
|
|
}_namespace = /*#__PURE__*/Object.assign({}, ${
|
|
|
|
importVar
|
|
|
|
}, {"default": ${importVar}});\n`;
|
2017-12-23 01:23:20 +08:00
|
|
|
else
|
2018-02-25 09:00:20 +08:00
|
|
|
content += `${optDeclaration}${
|
|
|
|
importVar
|
|
|
|
}_namespace = /*#__PURE__*/{ /* fake namespace object */ "default": ${
|
|
|
|
importVar
|
|
|
|
} };\n`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
2017-12-23 01:23:20 +08:00
|
|
|
return content;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
exportFromImport({
|
|
|
|
module,
|
2018-02-10 00:35:28 +08:00
|
|
|
request,
|
2017-12-19 22:50:09 +08:00
|
|
|
exportName,
|
|
|
|
originModule,
|
|
|
|
asiSafe,
|
|
|
|
isCall,
|
|
|
|
callContext,
|
|
|
|
importVar
|
|
|
|
}) {
|
2018-02-25 09:00:20 +08:00
|
|
|
if (!module)
|
|
|
|
return this.missingModule({
|
|
|
|
request
|
|
|
|
});
|
2017-12-23 01:23:20 +08:00
|
|
|
const exportsType = module.buildMeta && module.buildMeta.exportsType;
|
2017-12-19 22:50:09 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
if (!exportsType) {
|
|
|
|
if (exportName === "default") {
|
|
|
|
if (!originModule.buildMeta.strictHarmonyModule) {
|
|
|
|
if (isCall) return `${importVar}_default()`;
|
|
|
|
else if (asiSafe) return `(${importVar}_default())`;
|
|
|
|
else return `${importVar}_default.a`;
|
2017-12-19 22:50:09 +08:00
|
|
|
} else {
|
|
|
|
return importVar;
|
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (originModule.buildMeta.strictHarmonyModule) {
|
|
|
|
if (exportName) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return "/* non-default import from non-esm module */undefined";
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (!exportName) {
|
|
|
|
if (asiSafe) {
|
|
|
|
return `/*#__PURE__*/{ /* fake namespace object */ "default": ${
|
|
|
|
importVar
|
|
|
|
} }`;
|
2017-12-19 22:50:09 +08:00
|
|
|
} else {
|
2018-02-25 09:00:20 +08:00
|
|
|
return `/*#__PURE__*/Object({ /* fake namespace object */ "default": ${
|
|
|
|
importVar
|
|
|
|
} })`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
if (exportsType === "named") {
|
|
|
|
if (exportName === "default") {
|
2017-12-23 01:23:20 +08:00
|
|
|
return importVar;
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (!exportName) {
|
2017-12-23 01:23:20 +08:00
|
|
|
return `${importVar}_namespace`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
if (exportName) {
|
2017-12-19 22:50:09 +08:00
|
|
|
const used = module.isUsed(exportName);
|
2018-02-25 09:00:20 +08:00
|
|
|
const comment =
|
|
|
|
used !== exportName ? Template.toNormalComment(exportName) + " " : "";
|
2017-12-19 22:50:09 +08:00
|
|
|
const access = `${importVar}[${comment}${JSON.stringify(used)}]`;
|
2018-02-25 09:00:20 +08:00
|
|
|
if (isCall) {
|
|
|
|
if (callContext === false && asiSafe) return `(0,${access})`;
|
|
|
|
else if (callContext === false) return `Object(${access})`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
return access;
|
|
|
|
} else {
|
|
|
|
return importVar;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
blockPromise({ block, message }) {
|
|
|
|
if (!block || !block.chunkGroup || block.chunkGroup.chunks.length === 0) {
|
2017-12-19 22:50:09 +08:00
|
|
|
const comment = this.comment({
|
|
|
|
message
|
|
|
|
});
|
2017-12-23 15:11:28 +08:00
|
|
|
return `Promise.resolve(${comment.trim()})`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
const chunks = block.chunkGroup.chunks.filter(
|
|
|
|
chunk => !chunk.hasRuntime() && chunk.id !== null
|
|
|
|
);
|
2017-12-19 22:50:09 +08:00
|
|
|
const comment = this.comment({
|
|
|
|
message,
|
|
|
|
chunkName: block.chunkName,
|
|
|
|
chunkReason: block.chunkReason
|
|
|
|
});
|
2018-02-25 09:00:20 +08:00
|
|
|
if (chunks.length === 1) {
|
2017-12-19 22:50:09 +08:00
|
|
|
const chunkId = JSON.stringify(chunks[0].id);
|
|
|
|
return `__webpack_require__.e(${comment}${chunkId})`;
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (chunks.length > 0) {
|
|
|
|
const requireChunkId = chunk =>
|
|
|
|
`__webpack_require__.e(${JSON.stringify(chunk.id)})`;
|
|
|
|
return `Promise.all(${comment.trim()}[${chunks
|
|
|
|
.map(requireChunkId)
|
|
|
|
.join(", ")}])`;
|
2017-12-19 22:50:09 +08:00
|
|
|
} else {
|
2017-12-23 15:11:28 +08:00
|
|
|
return `Promise.resolve(${comment.trim()})`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onError() {
|
|
|
|
return "__webpack_require__.oe";
|
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
defineEsModuleFlagStatement({ exportsArgument }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return `__webpack_require__.r(${exportsArgument});\n`;
|
|
|
|
}
|
2017-12-07 17:31:00 +08:00
|
|
|
};
|