webpack/lib/RuntimeTemplate.js

285 lines
8.2 KiB
JavaScript
Raw Normal View History

/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const Template = require("./Template");
2018-04-06 13:44:58 +08:00
/**
* @typedef CommentOptions
* @property {string=} request
* @property {string=} chunkName
* @property {string=} chunkReason
* @property {string=} message
* @property {string=} exportName
*/
module.exports = class RuntimeTemplate {
constructor(outputOptions, requestShortener) {
this.outputOptions = outputOptions || {};
this.requestShortener = requestShortener;
}
2018-04-06 01:44:15 +08:00
comment(
/** @type {CommentOptions} */ {
request,
chunkName,
chunkReason,
message,
exportName
}
) {
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(" | ");
} else {
2018-02-25 09:00:20 +08:00
content = [message, chunkName, chunkReason]
.filter(Boolean)
.map(item => this.requestShortener.shorten(item))
.join(" | ");
}
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) + " ";
} else {
2017-12-23 15:11:28 +08:00
return Template.toNormalComment(content) + " ";
}
}
2018-02-25 09:00:20 +08:00
throwMissingModuleErrorFunction({ request }) {
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; }`;
}
2018-02-25 09:00:20 +08:00
missingModule({ request }) {
return `!(${this.throwMissingModuleErrorFunction({ request })}())`;
}
2018-02-25 09:00:20 +08:00
missingModuleStatement({ request }) {
return `${this.missingModule({ request })};\n`;
}
2018-02-25 09:00:20 +08:00
missingModulePromise({ request }) {
return `Promise.resolve().then(${this.throwMissingModuleErrorFunction({
request
})})`;
}
2018-02-25 09:00:20 +08:00
moduleId({ module, request }) {
if (!module)
return this.missingModule({
request
});
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
});
return `__webpack_require__(${this.moduleId({ module, request })})`;
}
2018-02-25 09:00:20 +08:00
moduleExports({ module, request }) {
return this.moduleRaw({
module,
request
});
}
2018-02-25 09:00:20 +08:00
moduleNamespace({ module, request, strict }) {
const rawModule = this.moduleRaw({
module,
request
});
const exportsType = module.buildMeta && module.buildMeta.exportsType;
2018-02-25 09:00:20 +08:00
if (exportsType === "namespace") {
return rawModule;
2018-02-25 09:00:20 +08:00
} else if (exportsType === "named") {
2018-03-26 22:56:10 +08:00
return `Object.assign({/* fake namespace object */}, ${rawModule}, { "default": ${rawModule} })`;
2018-02-25 09:00:20 +08:00
} else if (strict) {
return `Object({ /* fake namespace object */ "default": ${rawModule} })`;
} else {
2018-03-26 22:56:10 +08:00
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 }); }())`;
}
}
2018-02-25 09:00:20 +08:00
moduleNamespacePromise({ block, module, request, message, strict, weak }) {
if (!module)
return this.missingModulePromise({
request
});
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"'
header += `var id = ${idExpr}; `;
idExpr = "id";
}
2018-03-26 22:56:10 +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; } `;
}
const rawModule = this.moduleRaw({
module,
request
});
const exportsType = module.buildMeta && module.buildMeta.exportsType;
2018-02-25 09:00:20 +08:00
if (exportsType === "namespace") {
if (header) {
getModuleFunction = `function() { ${header}return ${rawModule}; }`;
} else {
2018-03-26 22:56:10 +08:00
getModuleFunction = `__webpack_require__.bind(null, ${comment}${idExpr})`;
}
2018-02-25 09:00:20 +08:00
} else if (exportsType === "named") {
2018-03-26 22:56:10 +08:00
getModuleFunction = `function() { ${header}var module = ${rawModule}; return Object.assign({/* fake namespace object */}, module, { "default": module }); }`;
2018-02-25 09:00:20 +08:00
} else if (strict) {
2018-03-26 22:56:10 +08:00
getModuleFunction = `function() { ${header}return { /* fake namespace object */ "default": ${rawModule} }; }`;
} else {
2018-03-26 22:56:10 +08:00
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 }); }`;
}
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
});
const comment = this.comment({
request
});
const optDeclaration = update ? "" : "var ";
const exportsType = module.buildMeta && module.buildMeta.exportsType;
2018-03-26 22:56:10 +08:00
let content = `/* harmony import */ ${optDeclaration}${importVar} = __webpack_require__(${comment}${JSON.stringify(
module.id
)});\n`;
2018-02-25 09:00:20 +08:00
if (!exportsType && !originModule.buildMeta.strictHarmonyModule) {
2018-03-26 22:56:10 +08:00
content += `/* harmony import */ ${optDeclaration}${importVar}_default = /*#__PURE__*/__webpack_require__.n(${importVar});\n`;
}
2018-02-25 09:00:20 +08:00
if (exportsType === "named") {
if (Array.isArray(module.buildMeta.providedExports))
2018-03-26 22:56:10 +08:00
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/Object.assign({}, ${importVar}, {"default": ${importVar}});\n`;
else
2018-03-26 22:56:10 +08:00
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/{ /* fake namespace object */ "default": ${importVar} };\n`;
}
return content;
}
exportFromImport({
module,
2018-02-10 00:35:28 +08:00
request,
exportName,
originModule,
asiSafe,
isCall,
callContext,
importVar
}) {
2018-02-25 09:00:20 +08:00
if (!module)
return this.missingModule({
request
});
const exportsType = module.buildMeta && module.buildMeta.exportsType;
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`;
} else {
return importVar;
}
2018-02-25 09:00:20 +08:00
} else if (originModule.buildMeta.strictHarmonyModule) {
if (exportName) {
return "/* non-default import from non-esm module */undefined";
} else {
2018-02-25 09:00:20 +08:00
if (asiSafe) {
2018-03-26 22:56:10 +08:00
return `/*#__PURE__*/{ /* fake namespace object */ "default": ${importVar} }`;
} else {
2018-03-26 22:56:10 +08:00
return `/*#__PURE__*/Object({ /* fake namespace object */ "default": ${importVar} })`;
}
}
}
}
2018-02-25 09:00:20 +08:00
if (exportsType === "named") {
if (exportName === "default") {
return importVar;
2018-02-25 09:00:20 +08:00
} else if (!exportName) {
return `${importVar}_namespace`;
}
}
2018-02-25 09:00:20 +08:00
if (exportName) {
const used = module.isUsed(exportName);
2018-02-25 09:00:20 +08:00
const comment =
used !== exportName ? Template.toNormalComment(exportName) + " " : "";
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})`;
}
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) {
const comment = this.comment({
message
});
2017-12-23 15:11:28 +08:00
return `Promise.resolve(${comment.trim()})`;
}
2018-02-25 09:00:20 +08:00
const chunks = block.chunkGroup.chunks.filter(
chunk => !chunk.hasRuntime() && chunk.id !== null
);
const comment = this.comment({
message,
chunkName: block.chunkName,
chunkReason: block.chunkReason
});
2018-02-25 09:00:20 +08:00
if (chunks.length === 1) {
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(", ")}])`;
} else {
2017-12-23 15:11:28 +08:00
return `Promise.resolve(${comment.trim()})`;
}
}
onError() {
return "__webpack_require__.oe";
}
2018-02-25 09:00:20 +08:00
defineEsModuleFlagStatement({ exportsArgument }) {
return `__webpack_require__.r(${exportsArgument});\n`;
}
};