| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const Template = require("./Template");/** @typedef {import("./Module")} Module */module.exports = class RuntimeTemplate {	constructor(outputOptions, requestShortener) {		this.outputOptions = outputOptions || {};		this.requestShortener = requestShortener;	}	/**	 * Add a comment	 * @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	 * @returns {string} comment	 */	comment({ request, chunkName, chunkReason, message, exportName }) {		let content;		if (this.outputOptions.pathinfo) {			content = [message, request, chunkName, chunkReason]				.filter(Boolean)				.map(item => this.requestShortener.shorten(item))				.join(" | ");		} else {			content = [message, chunkName, chunkReason]				.filter(Boolean)				.map(item => this.requestShortener.shorten(item))				.join(" | ");		}		if (!content) return "";		if (this.outputOptions.pathinfo) {			return Template.toComment(content) + " ";		} else {			return Template.toNormalComment(content) + " ";		}	}	throwMissingModuleErrorFunction({ request }) {		const err = `Cannot find module '${request}'`;		return `function webpackMissingModule() { var e = new Error(${JSON.stringify(			err		)}); e.code = 'MODULE_NOT_FOUND'; throw e; }`;	}	missingModule({ request }) {		return `!(${this.throwMissingModuleErrorFunction({ request })}())`;	}	missingModuleStatement({ request }) {		return `${this.missingModule({ request })};\n`;	}	missingModulePromise({ request }) {		return `Promise.resolve().then(${this.throwMissingModuleErrorFunction({			request		})})`;	}	moduleId({ module, request }) {		if (!module) {			return this.missingModule({				request			});		}		if (module.id === null) {			throw new Error(				`RuntimeTemplate.moduleId(): Module ${module.identifier()} has no id. This should not happen.`			);		}		return `${this.comment({ request })}${JSON.stringify(module.id)}`;	}	moduleRaw({ module, request }) {		if (!module) {			return this.missingModule({				request			});		}		return `__webpack_require__(${this.moduleId({ module, request })})`;	}	moduleExports({ module, request }) {		return this.moduleRaw({			module,			request		});	}	moduleNamespace({ module, request, strict }) {		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 `__webpack_require__.t(${moduleId}, 3)`;		} else if (strict) {			return `__webpack_require__.t(${moduleId}, 1)`;		} else {			return `__webpack_require__.t(${moduleId}, 7)`;		}	}	moduleNamespacePromise({ block, module, request, message, strict, weak }) {		if (!module) {			return this.missingModulePromise({				request			});		}		if (module.id === null) {			throw new Error(				`RuntimeTemplate.moduleNamespacePromise(): Module ${module.identifier()} has no id. This should not happen.`			);		}		const promise = this.blockPromise({			block,			message		});		let getModuleFunction;		let idExpr = JSON.stringify(module.id);		const comment = this.comment({			request		});		let header = "";		if (weak) {			if (idExpr.length > 8) {				// 'var x="nnnnnn";x,"+x+",x' vs '"nnnnnn",nnnnnn,"nnnnnn"'				header += `var id = ${idExpr}; `;				idExpr = "id";			}			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 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") {			if (header) {				getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 3); }`;			} else {				getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 3)`;			}		} else if (strict) {			if (header) {				getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 1); }`;			} else {				getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 1)`;			}		} else {			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})`;	}	/**	 *	 * @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	 * @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	 * @returns {string} the import statement	 */	importStatement({ update, module, request, importVar, originModule }) {		if (!module) {			return this.missingModuleStatement({				request			});		}		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__(${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__*/__webpack_require__.t(${moduleId}, 1);\n`;			} else {				content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/__webpack_require__.t(${moduleId});\n`;			}		}		return content;	}	exportFromImport({		module,		request,		exportName,		originModule,		asiSafe,		isCall,		callContext,		importVar	}) {		if (!module) {			return this.missingModule({				request			});		}		const exportsType = module.buildMeta && module.buildMeta.exportsType;		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;				}			} else if (originModule.buildMeta.strictHarmonyModule) {				if (exportName) {					return "/* non-default import from non-esm module */undefined";				} else {					return `/*#__PURE__*/__webpack_require__.t(${importVar})`;				}			}		}		if (exportsType === "named") {			if (exportName === "default") {				return importVar;			} else if (!exportName) {				return `${importVar}_namespace`;			}		}		if (exportName) {			const used = module.isUsed(exportName);			if (!used) {				const comment = Template.toNormalComment(`unused export ${exportName}`);				return `${comment} undefined`;			}			const comment =				used !== exportName ? Template.toNormalComment(exportName) + " " : "";			const access = `${importVar}[${comment}${JSON.stringify(used)}]`;			if (isCall) {				if (callContext === false && asiSafe) {					return `(0,${access})`;				} else if (callContext === false) {					return `Object(${access})`;				}			}			return access;		} else {			return importVar;		}	}	blockPromise({ block, message }) {		if (!block || !block.chunkGroup || block.chunkGroup.chunks.length === 0) {			const comment = this.comment({				message			});			return `Promise.resolve(${comment.trim()})`;		}		const chunks = block.chunkGroup.chunks.filter(			chunk => !chunk.hasRuntime() && chunk.id !== null		);		const comment = this.comment({			message,			chunkName: block.chunkName,			chunkReason: block.chunkReason		});		if (chunks.length === 1) {			const chunkId = JSON.stringify(chunks[0].id);			return `__webpack_require__.e(${comment}${chunkId})`;		} 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 {			return `Promise.resolve(${comment.trim()})`;		}	}	onError() {		return "__webpack_require__.oe";	}	defineEsModuleFlagStatement({ exportsArgument }) {		return `__webpack_require__.r(${exportsArgument});\n`;	}};
 |