2017-12-07 17:31:00 +08:00
|
|
|
/*
|
|
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
|
|
Author Tobias Koppers @sokra
|
|
|
|
*/
|
2018-07-30 23:08:51 +08:00
|
|
|
|
2017-12-07 17:31:00 +08:00
|
|
|
"use strict";
|
|
|
|
|
2018-11-05 21:36:15 +08:00
|
|
|
const RuntimeGlobals = require("./RuntimeGlobals");
|
2017-12-19 22:50:09 +08:00
|
|
|
const Template = require("./Template");
|
|
|
|
|
2018-07-23 23:33:29 +08:00
|
|
|
/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
|
2018-08-23 02:17:49 +08:00
|
|
|
/** @typedef {import("./ChunkGraph")} ChunkGraph */
|
2018-07-30 23:08:51 +08:00
|
|
|
/** @typedef {import("./Module")} Module */
|
2018-08-07 01:39:43 +08:00
|
|
|
/** @typedef {import("./ModuleGraph")} ModuleGraph */
|
2018-07-31 03:36:46 +08:00
|
|
|
/** @typedef {import("./RequestShortener")} RequestShortener */
|
2018-07-21 00:17:51 +08:00
|
|
|
|
2018-11-05 21:36:15 +08:00
|
|
|
class RuntimeTemplate {
|
2018-07-31 03:36:46 +08:00
|
|
|
/**
|
|
|
|
* @param {TODO} outputOptions the compilation output options
|
|
|
|
* @param {RequestShortener} requestShortener the request shortener
|
|
|
|
*/
|
2017-12-07 17:31:00 +08:00
|
|
|
constructor(outputOptions, requestShortener) {
|
|
|
|
this.outputOptions = outputOptions || {};
|
2018-07-31 03:36:46 +08:00
|
|
|
/** @type {RequestShortener} */
|
2017-12-07 17:31:00 +08:00
|
|
|
this.requestShortener = requestShortener;
|
|
|
|
}
|
2017-12-19 22:50:09 +08:00
|
|
|
|
2018-04-12 00:25:50 +08:00
|
|
|
/**
|
|
|
|
* Add a comment
|
2018-04-12 16:01:09 +08:00
|
|
|
* @param {object} options Information content of the comment
|
|
|
|
* @param {string=} options.request request string used originally
|
|
|
|
* @param {string=} options.chunkName name of the chunk referenced
|
|
|
|
* @param {string=} options.chunkReason reason information of the chunk
|
|
|
|
* @param {string=} options.message additional message
|
|
|
|
* @param {string=} options.exportName name of the export
|
2018-05-08 20:31:51 +08:00
|
|
|
* @returns {string} comment
|
2018-04-12 00:25:50 +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-07-31 03:36:46 +08:00
|
|
|
/**
|
|
|
|
* @param {object} options generation options
|
|
|
|
* @param {string=} options.request request string used originally
|
|
|
|
* @returns {string} generated error block
|
|
|
|
*/
|
|
|
|
throwMissingModuleErrorBlock({ request }) {
|
2018-05-15 14:16:39 +08:00
|
|
|
const err = `Cannot find module '${request}'`;
|
2018-07-31 03:36:46 +08:00
|
|
|
return `var e = new Error(${JSON.stringify(
|
2018-02-25 09:00:20 +08:00
|
|
|
err
|
2018-07-31 03:36:46 +08:00
|
|
|
)}); e.code = 'MODULE_NOT_FOUND'; throw e;`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
2018-07-31 03:36:46 +08:00
|
|
|
/**
|
|
|
|
* @param {object} options generation options
|
|
|
|
* @param {string=} options.request request string used originally
|
|
|
|
* @returns {string} generated error function
|
|
|
|
*/
|
|
|
|
throwMissingModuleErrorFunction({ request }) {
|
|
|
|
return `function webpackMissingModule() { ${this.throwMissingModuleErrorBlock(
|
|
|
|
{ request }
|
|
|
|
)} }`;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {object} options generation options
|
|
|
|
* @param {string=} options.request request string used originally
|
|
|
|
* @returns {string} generated error IIFE
|
|
|
|
*/
|
2018-02-25 09:00:20 +08:00
|
|
|
missingModule({ request }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return `!(${this.throwMissingModuleErrorFunction({ request })}())`;
|
|
|
|
}
|
|
|
|
|
2018-07-31 03:36:46 +08:00
|
|
|
/**
|
|
|
|
* @param {object} options generation options
|
|
|
|
* @param {string=} options.request request string used originally
|
|
|
|
* @returns {string} generated error statement
|
|
|
|
*/
|
2018-02-25 09:00:20 +08:00
|
|
|
missingModuleStatement({ request }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return `${this.missingModule({ request })};\n`;
|
|
|
|
}
|
|
|
|
|
2018-07-31 03:36:46 +08:00
|
|
|
/**
|
|
|
|
* @param {object} options generation options
|
|
|
|
* @param {string=} options.request request string used originally
|
|
|
|
* @returns {string} generated error code
|
|
|
|
*/
|
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-07-25 00:22:28 +08:00
|
|
|
/**
|
|
|
|
* @param {Object} options options object
|
2018-08-28 17:50:33 +08:00
|
|
|
* @param {ChunkGraph} options.chunkGraph the chunk graph
|
2018-07-25 00:22:28 +08:00
|
|
|
* @param {Module} options.module the module
|
|
|
|
* @param {string} options.request the request that should be printed as comment
|
|
|
|
* @param {string=} options.idExpr expression to use as id expression
|
|
|
|
* @param {"expression" | "promise" | "statements"} options.type which kind of code should be returned
|
|
|
|
* @returns {string} the code
|
|
|
|
*/
|
2018-08-28 17:50:33 +08:00
|
|
|
weakError({ module, chunkGraph, request, idExpr, type }) {
|
2018-08-28 17:56:48 +08:00
|
|
|
const moduleId = chunkGraph.getModuleId(module);
|
2018-07-25 00:22:28 +08:00
|
|
|
const errorMessage =
|
2018-08-28 17:50:33 +08:00
|
|
|
moduleId === null
|
2018-07-25 00:22:28 +08:00
|
|
|
? JSON.stringify("Module is not available (weak dependency)")
|
|
|
|
: idExpr
|
|
|
|
? `"Module '" + ${idExpr} + "' is not available (weak dependency)"`
|
|
|
|
: JSON.stringify(
|
2018-08-28 17:50:33 +08:00
|
|
|
`Module '${moduleId}' is not available (weak dependency)`
|
2018-07-25 00:22:28 +08:00
|
|
|
);
|
|
|
|
const comment = request ? Template.toNormalComment(request) + " " : "";
|
|
|
|
const errorStatements =
|
|
|
|
`var e = new Error(${errorMessage}); ` +
|
|
|
|
comment +
|
|
|
|
"e.code = 'MODULE_NOT_FOUND'; throw e;";
|
|
|
|
switch (type) {
|
|
|
|
case "statements":
|
|
|
|
return errorStatements;
|
|
|
|
case "promise":
|
|
|
|
return `Promise.resolve().then(function() { ${errorStatements} })`;
|
|
|
|
case "expression":
|
|
|
|
return `(function() { ${errorStatements} }())`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Object} options options object
|
|
|
|
* @param {Module} options.module the module
|
2018-08-28 17:50:33 +08:00
|
|
|
* @param {ChunkGraph} options.chunkGraph the chunk graph
|
2018-07-25 00:22:28 +08:00
|
|
|
* @param {string} options.request the request that should be printed as comment
|
|
|
|
* @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
|
|
|
|
* @returns {string} the expression
|
|
|
|
*/
|
2018-08-28 17:50:33 +08:00
|
|
|
moduleId({ module, chunkGraph, request, weak }) {
|
2018-05-28 03:47:23 +08:00
|
|
|
if (!module) {
|
2018-02-25 09:00:20 +08:00
|
|
|
return this.missingModule({
|
|
|
|
request
|
|
|
|
});
|
2018-05-28 03:47:23 +08:00
|
|
|
}
|
2018-08-28 17:56:48 +08:00
|
|
|
const moduleId = chunkGraph.getModuleId(module);
|
2018-08-28 17:50:33 +08:00
|
|
|
if (moduleId === null) {
|
2018-07-25 00:22:28 +08:00
|
|
|
if (weak) {
|
|
|
|
return "null /* weak dependency, without id */";
|
|
|
|
}
|
2018-05-28 03:47:23 +08:00
|
|
|
throw new Error(
|
|
|
|
`RuntimeTemplate.moduleId(): Module ${module.identifier()} has no id. This should not happen.`
|
|
|
|
);
|
|
|
|
}
|
2018-08-28 17:50:33 +08:00
|
|
|
return `${this.comment({ request })}${JSON.stringify(moduleId)}`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
2018-07-25 00:22:28 +08:00
|
|
|
/**
|
|
|
|
* @param {Object} options options object
|
|
|
|
* @param {Module} options.module the module
|
2018-08-28 17:50:33 +08:00
|
|
|
* @param {ChunkGraph} options.chunkGraph the chunk graph
|
2018-07-25 00:22:28 +08:00
|
|
|
* @param {string} options.request the request that should be printed as comment
|
|
|
|
* @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
|
|
|
|
* @returns {string} the expression
|
|
|
|
*/
|
2018-08-28 17:50:33 +08:00
|
|
|
moduleRaw({ module, chunkGraph, request, weak }) {
|
2018-05-29 20:50:40 +08:00
|
|
|
if (!module) {
|
2018-02-25 09:00:20 +08:00
|
|
|
return this.missingModule({
|
|
|
|
request
|
|
|
|
});
|
2018-05-29 20:50:40 +08:00
|
|
|
}
|
2018-08-28 17:56:48 +08:00
|
|
|
const moduleId = chunkGraph.getModuleId(module);
|
2018-08-28 17:50:33 +08:00
|
|
|
if (moduleId === null) {
|
2018-07-25 00:22:28 +08:00
|
|
|
if (weak) {
|
|
|
|
// only weak referenced modules don't get an id
|
|
|
|
// we can always emit an error emitting code here
|
|
|
|
return this.weakError({
|
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
type: "expression"
|
|
|
|
});
|
|
|
|
}
|
|
|
|
throw new Error(
|
|
|
|
`RuntimeTemplate.moduleId(): Module ${module.identifier()} has no id. This should not happen.`
|
|
|
|
);
|
|
|
|
}
|
2018-08-28 17:50:33 +08:00
|
|
|
return `__webpack_require__(${this.moduleId({
|
|
|
|
module,
|
|
|
|
chunkGraph,
|
|
|
|
request,
|
|
|
|
weak
|
|
|
|
})})`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
2018-07-25 00:22:28 +08:00
|
|
|
/**
|
|
|
|
* @param {Object} options options object
|
|
|
|
* @param {Module} options.module the module
|
2018-08-28 17:50:33 +08:00
|
|
|
* @param {ChunkGraph} options.chunkGraph the chunk graph
|
2018-07-25 00:22:28 +08:00
|
|
|
* @param {string} options.request the request that should be printed as comment
|
|
|
|
* @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
|
|
|
|
* @returns {string} the expression
|
|
|
|
*/
|
2018-08-28 17:50:33 +08:00
|
|
|
moduleExports({ module, chunkGraph, request, weak }) {
|
2017-12-19 22:50:09 +08:00
|
|
|
return this.moduleRaw({
|
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
weak
|
2017-12-19 22:50:09 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-07-25 00:22:28 +08:00
|
|
|
/**
|
|
|
|
* @param {Object} options options object
|
|
|
|
* @param {Module} options.module the module
|
2018-08-28 17:50:33 +08:00
|
|
|
* @param {ChunkGraph} options.chunkGraph the chunk graph
|
2018-07-25 00:22:28 +08:00
|
|
|
* @param {string} options.request the request that should be printed as comment
|
|
|
|
* @param {boolean=} options.strict if the current module is in strict esm mode
|
|
|
|
* @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
|
|
|
|
* @returns {string} the expression
|
|
|
|
*/
|
2018-08-28 17:50:33 +08:00
|
|
|
moduleNamespace({ module, chunkGraph, request, strict, weak }) {
|
2018-05-29 20:50:40 +08:00
|
|
|
if (!module) {
|
2018-05-03 00:09:24 +08:00
|
|
|
return this.missingModule({
|
|
|
|
request
|
|
|
|
});
|
2018-05-29 20:50:40 +08:00
|
|
|
}
|
2018-08-28 17:56:48 +08:00
|
|
|
if (chunkGraph.getModuleId(module) === null) {
|
2018-07-25 00:22:28 +08:00
|
|
|
if (weak) {
|
|
|
|
// only weak referenced modules don't get an id
|
|
|
|
// we can always emit an error emitting code here
|
|
|
|
return this.weakError({
|
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
type: "expression"
|
|
|
|
});
|
|
|
|
}
|
|
|
|
throw new Error(
|
|
|
|
`RuntimeTemplate.moduleNamespace(): Module ${module.identifier()} has no id. This should not happen.`
|
|
|
|
);
|
|
|
|
}
|
2018-05-03 00:09:24 +08:00
|
|
|
const moduleId = this.moduleId({
|
2017-12-19 22:50:09 +08:00
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
weak
|
2017-12-19 22:50:09 +08:00
|
|
|
});
|
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") {
|
2018-05-03 00:09:24 +08:00
|
|
|
const rawModule = this.moduleRaw({
|
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
weak
|
2018-05-03 00:09:24 +08:00
|
|
|
});
|
2017-12-19 22:50:09 +08:00
|
|
|
return rawModule;
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (exportsType === "named") {
|
2018-11-05 21:36:15 +08:00
|
|
|
return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 3)`;
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (strict) {
|
2018-11-05 21:36:15 +08:00
|
|
|
return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 1)`;
|
2017-12-19 22:50:09 +08:00
|
|
|
} else {
|
2018-11-05 21:36:15 +08:00
|
|
|
return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 7)`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-23 23:33:29 +08:00
|
|
|
/**
|
|
|
|
* @param {Object} options options object
|
2018-08-23 02:17:49 +08:00
|
|
|
* @param {ChunkGraph} options.chunkGraph the chunk graph
|
2018-07-23 23:33:29 +08:00
|
|
|
* @param {AsyncDependenciesBlock=} options.block the current dependencies block
|
|
|
|
* @param {Module} options.module the module
|
|
|
|
* @param {string} options.request the request that should be printed as comment
|
|
|
|
* @param {string} options.message a message for the comment
|
|
|
|
* @param {boolean=} options.strict if the current module is in strict esm mode
|
|
|
|
* @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
|
|
|
|
* @returns {string} the promise expression
|
|
|
|
*/
|
2018-08-23 02:17:49 +08:00
|
|
|
moduleNamespacePromise({
|
|
|
|
chunkGraph,
|
|
|
|
block,
|
|
|
|
module,
|
|
|
|
request,
|
|
|
|
message,
|
|
|
|
strict,
|
|
|
|
weak
|
|
|
|
}) {
|
2018-05-28 03:47:23 +08:00
|
|
|
if (!module) {
|
2018-02-25 09:00:20 +08:00
|
|
|
return this.missingModulePromise({
|
|
|
|
request
|
|
|
|
});
|
2018-05-28 03:47:23 +08:00
|
|
|
}
|
2018-08-28 17:56:48 +08:00
|
|
|
const moduleId = chunkGraph.getModuleId(module);
|
2018-08-28 17:50:33 +08:00
|
|
|
if (moduleId === null) {
|
2018-07-25 00:22:28 +08:00
|
|
|
if (weak) {
|
|
|
|
// only weak referenced modules don't get an id
|
|
|
|
// we can always emit an error emitting code here
|
|
|
|
return this.weakError({
|
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
type: "promise"
|
|
|
|
});
|
|
|
|
}
|
2018-05-28 03:47:23 +08:00
|
|
|
throw new Error(
|
|
|
|
`RuntimeTemplate.moduleNamespacePromise(): Module ${module.identifier()} has no id. This should not happen.`
|
|
|
|
);
|
|
|
|
}
|
2017-12-19 22:50:09 +08:00
|
|
|
const promise = this.blockPromise({
|
2018-08-23 02:17:49 +08:00
|
|
|
chunkGraph,
|
2017-12-19 22:50:09 +08:00
|
|
|
block,
|
|
|
|
message
|
|
|
|
});
|
|
|
|
|
|
|
|
let getModuleFunction;
|
2018-08-28 17:56:48 +08:00
|
|
|
let idExpr = JSON.stringify(chunkGraph.getModuleId(module));
|
2017-12-19 22:50:09 +08:00
|
|
|
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-11-05 21:36:15 +08:00
|
|
|
header += `if(!${
|
|
|
|
RuntimeGlobals.moduleFactories
|
|
|
|
}[${idExpr}]) { ${this.weakError({
|
2018-07-25 00:22:28 +08:00
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
idExpr,
|
|
|
|
type: "statements"
|
|
|
|
})} } `;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
2018-08-28 17:50:33 +08:00
|
|
|
const moduleIdExpr = this.moduleId({
|
2017-12-19 22:50:09 +08:00
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
weak
|
2017-12-19 22:50:09 +08:00
|
|
|
});
|
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) {
|
2018-05-03 00:09:24 +08:00
|
|
|
const rawModule = this.moduleRaw({
|
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
weak
|
2018-05-03 00:09:24 +08:00
|
|
|
});
|
2017-12-19 22:50:09 +08:00
|
|
|
getModuleFunction = `function() { ${header}return ${rawModule}; }`;
|
|
|
|
} else {
|
2018-03-26 22:56:10 +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") {
|
2018-05-03 00:09:24 +08:00
|
|
|
if (header) {
|
2018-11-05 21:36:15 +08:00
|
|
|
getModuleFunction = `function() { ${header}return ${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}(${moduleIdExpr}, 3); }`;
|
2018-05-03 00:09:24 +08:00
|
|
|
} else {
|
2018-11-05 21:36:15 +08:00
|
|
|
getModuleFunction = `${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}.bind(null, ${comment}${idExpr}, 3)`;
|
2018-05-03 00:09:24 +08:00
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (strict) {
|
2018-05-03 00:09:24 +08:00
|
|
|
if (header) {
|
2018-11-05 21:36:15 +08:00
|
|
|
getModuleFunction = `function() { ${header}return ${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}(${moduleIdExpr}, 1); }`;
|
2018-05-03 00:09:24 +08:00
|
|
|
} else {
|
2018-11-05 21:36:15 +08:00
|
|
|
getModuleFunction = `${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}.bind(null, ${comment}${idExpr}, 1)`;
|
2018-05-03 00:09:24 +08:00
|
|
|
}
|
2017-12-19 22:50:09 +08:00
|
|
|
} else {
|
2018-05-03 00:09:24 +08:00
|
|
|
if (header) {
|
2018-11-05 21:36:15 +08:00
|
|
|
getModuleFunction = `function() { ${header}return ${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}(${moduleIdExpr}, 7); }`;
|
2018-05-03 00:09:24 +08:00
|
|
|
} else {
|
2018-11-05 21:36:15 +08:00
|
|
|
getModuleFunction = `${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}.bind(null, ${comment}${idExpr}, 7)`;
|
2018-05-03 00:09:24 +08:00
|
|
|
}
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return `${promise || "Promise.resolve()"}.then(${getModuleFunction})`;
|
|
|
|
}
|
|
|
|
|
2018-07-21 00:17:51 +08:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param {Object} options options object
|
|
|
|
* @param {boolean=} options.update whether a new variable should be created or the existing one updated
|
|
|
|
* @param {Module} options.module the module
|
2018-08-28 17:50:33 +08:00
|
|
|
* @param {ChunkGraph} options.chunkGraph the chunk graph
|
2018-07-21 00:17:51 +08:00
|
|
|
* @param {string} options.request the request that should be printed as comment
|
|
|
|
* @param {string} options.importVar name of the import variable
|
|
|
|
* @param {Module} options.originModule module in which the statement is emitted
|
2018-07-25 00:22:28 +08:00
|
|
|
* @param {boolean=} options.weak true, if this is a weak dependency
|
2018-07-21 00:17:51 +08:00
|
|
|
* @returns {string} the import statement
|
|
|
|
*/
|
2018-08-28 17:50:33 +08:00
|
|
|
importStatement({
|
|
|
|
update,
|
|
|
|
module,
|
|
|
|
chunkGraph,
|
|
|
|
request,
|
|
|
|
importVar,
|
|
|
|
originModule,
|
|
|
|
weak
|
|
|
|
}) {
|
2018-05-28 03:47:23 +08:00
|
|
|
if (!module) {
|
2018-02-25 09:00:20 +08:00
|
|
|
return this.missingModuleStatement({
|
|
|
|
request
|
|
|
|
});
|
2018-05-28 03:47:23 +08:00
|
|
|
}
|
2018-08-28 17:56:48 +08:00
|
|
|
if (chunkGraph.getModuleId(module) === null) {
|
2018-07-25 00:22:28 +08:00
|
|
|
if (weak) {
|
|
|
|
// only weak referenced modules don't get an id
|
|
|
|
// we can always emit an error emitting code here
|
|
|
|
return this.weakError({
|
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
type: "statements"
|
|
|
|
});
|
|
|
|
}
|
|
|
|
throw new Error(
|
|
|
|
`RuntimeTemplate.importStatment(): Module ${module.identifier()} has no id. This should not happen.`
|
|
|
|
);
|
|
|
|
}
|
2018-05-03 00:09:24 +08:00
|
|
|
const moduleId = this.moduleId({
|
|
|
|
module,
|
2018-08-28 17:50:33 +08:00
|
|
|
chunkGraph,
|
2018-07-25 00:22:28 +08:00
|
|
|
request,
|
|
|
|
weak
|
2017-12-19 22:50:09 +08:00
|
|
|
});
|
|
|
|
const optDeclaration = update ? "" : "var ";
|
|
|
|
|
2017-12-23 01:23:20 +08:00
|
|
|
const exportsType = module.buildMeta && module.buildMeta.exportsType;
|
2018-05-03 00:09:24 +08:00
|
|
|
let content = `/* harmony import */ ${optDeclaration}${importVar} = __webpack_require__(${moduleId});\n`;
|
2017-12-23 01:23:20 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
if (!exportsType && !originModule.buildMeta.strictHarmonyModule) {
|
2018-11-05 21:36:15 +08:00
|
|
|
content += `/* harmony import */ ${optDeclaration}${importVar}_default = /*#__PURE__*/${
|
|
|
|
RuntimeGlobals.compatGetDefaultExport
|
|
|
|
}(${importVar});\n`;
|
2017-12-23 01:23:20 +08:00
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
if (exportsType === "named") {
|
2018-05-29 20:50:40 +08:00
|
|
|
if (Array.isArray(module.buildMeta.providedExports)) {
|
2018-11-05 21:36:15 +08:00
|
|
|
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}(${moduleId}, 1);\n`;
|
2018-05-29 20:50:40 +08:00
|
|
|
} else {
|
2018-11-05 21:36:15 +08:00
|
|
|
content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}(${moduleId});\n`;
|
2018-05-29 20:50:40 +08:00
|
|
|
}
|
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
|
|
|
}
|
|
|
|
|
2018-08-07 01:39:43 +08:00
|
|
|
/**
|
|
|
|
* @param {Object} options options
|
|
|
|
* @param {ModuleGraph} options.moduleGraph the module graph
|
|
|
|
* @param {Module} options.module the module
|
|
|
|
* @param {string} options.request the request
|
|
|
|
* @param {string} options.exportName the export name
|
|
|
|
* @param {Module} options.originModule the origin module
|
|
|
|
* @param {boolean} options.asiSafe true, if location is safe for ASI, a bracket can be emitted
|
|
|
|
* @param {boolean} options.isCall true, if expression will be called
|
|
|
|
* @param {boolean} options.callContext when false, call context will not be preserved
|
|
|
|
* @param {string} options.importVar the identifier name of the import variable
|
|
|
|
* @returns {string} expression
|
|
|
|
*/
|
2017-12-19 22:50:09 +08:00
|
|
|
exportFromImport({
|
2018-08-07 01:39:43 +08:00
|
|
|
moduleGraph,
|
2017-12-19 22:50:09 +08:00
|
|
|
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-05-29 20:50:40 +08:00
|
|
|
if (!module) {
|
2018-02-25 09:00:20 +08:00
|
|
|
return this.missingModule({
|
|
|
|
request
|
|
|
|
});
|
2018-05-29 20:50:40 +08:00
|
|
|
}
|
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) {
|
2018-05-29 20:50:40 +08:00
|
|
|
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-04-12 00:23:21 +08:00
|
|
|
} else {
|
2018-11-05 21:36:15 +08:00
|
|
|
return `/*#__PURE__*/${
|
|
|
|
RuntimeGlobals.createFakeNamespaceObject
|
|
|
|
}(${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) {
|
2018-08-07 03:01:24 +08:00
|
|
|
const used = module.getUsedName(moduleGraph, exportName);
|
2018-06-08 16:34:38 +08:00
|
|
|
if (!used) {
|
|
|
|
const comment = Template.toNormalComment(`unused export ${exportName}`);
|
|
|
|
return `${comment} undefined`;
|
|
|
|
}
|
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) {
|
2018-05-29 20:50:40 +08:00
|
|
|
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-08-23 02:17:49 +08:00
|
|
|
blockPromise({ block, message, chunkGraph }) {
|
|
|
|
if (!block) {
|
|
|
|
const comment = this.comment({
|
|
|
|
message
|
|
|
|
});
|
|
|
|
return `Promise.resolve(${comment.trim()})`;
|
|
|
|
}
|
|
|
|
const chunkGroup = chunkGraph.getBlockChunkGroup(block);
|
|
|
|
if (!chunkGroup || 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-08-23 02:17:49 +08:00
|
|
|
const chunks = chunkGroup.chunks.filter(
|
2018-02-25 09:00:20 +08:00
|
|
|
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);
|
2018-11-05 21:36:15 +08:00
|
|
|
return `${RuntimeGlobals.ensureChunk}(${comment}${chunkId})`;
|
2018-02-25 09:00:20 +08:00
|
|
|
} else if (chunks.length > 0) {
|
|
|
|
const requireChunkId = chunk =>
|
2018-11-05 21:36:15 +08:00
|
|
|
`${RuntimeGlobals.ensureChunk}(${JSON.stringify(chunk.id)})`;
|
2018-02-25 09:00:20 +08:00
|
|
|
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() {
|
2018-11-05 21:36:15 +08:00
|
|
|
return RuntimeGlobals.uncaughtErrorHandler;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
defineEsModuleFlagStatement({ exportsArgument }) {
|
2018-11-05 21:36:15 +08:00
|
|
|
return `${RuntimeGlobals.makeNamespaceObject}(${exportsArgument});\n`;
|
2017-12-19 22:50:09 +08:00
|
|
|
}
|
2018-11-05 21:36:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = RuntimeTemplate;
|