| 
									
										
										
										
											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"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-05 04:05:17 +08:00
										 |  |  | const InitFragment = require("./InitFragment"); | 
					
						
							| 
									
										
										
										
											2018-11-05 21:36:15 +08:00
										 |  |  | const RuntimeGlobals = require("./RuntimeGlobals"); | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | const Template = require("./Template"); | 
					
						
							| 
									
										
										
										
											2020-08-12 00:06:27 +08:00
										 |  |  | const { equals } = require("./util/ArrayHelpers"); | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | const compileBooleanMatcher = require("./util/compileBooleanMatcher"); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | const propertyAccess = require("./util/propertyAccess"); | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | const { forEachRuntime, subtractRuntime } = require("./util/runtime"); | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | /** @typedef {import("../declarations/WebpackOptions").Environment} Environment */ | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | /** @typedef {import("../declarations/WebpackOptions").OutputNormalized} OutputOptions */ | 
					
						
							| 
									
										
										
										
											2018-07-23 23:33:29 +08:00
										 |  |  | /** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */ | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | /** @typedef {import("./Chunk")} Chunk */ | 
					
						
							| 
									
										
										
										
											2018-08-23 02:17:49 +08:00
										 |  |  | /** @typedef {import("./ChunkGraph")} ChunkGraph */ | 
					
						
							| 
									
										
										
										
											2021-11-30 20:46:42 +08:00
										 |  |  | /** @typedef {import("./CodeGenerationResults")} CodeGenerationResults */ | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | /** @typedef {import("./CodeGenerationResults").CodeGenerationResult} CodeGenerationResult */ | 
					
						
							| 
									
										
										
										
											2021-03-11 23:41:19 +08:00
										 |  |  | /** @typedef {import("./Compilation")} Compilation */ | 
					
						
							| 
									
										
										
										
											2020-05-26 23:11:21 +08:00
										 |  |  | /** @typedef {import("./Dependency")} Dependency */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | /** @typedef {import("./Module")} Module */ | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | /** @typedef {import("./Module").BuildMeta} BuildMeta */ | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | /** @typedef {import("./Module").RuntimeRequirements} RuntimeRequirements */ | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | /** @typedef {import("./ModuleGraph")} ModuleGraph */ | 
					
						
							| 
									
										
										
										
											2018-07-31 03:36:46 +08:00
										 |  |  | /** @typedef {import("./RequestShortener")} RequestShortener */ | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | /** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */ | 
					
						
							| 
									
										
										
										
											2018-07-21 00:17:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {Module} module the module | 
					
						
							|  |  |  |  * @param {ChunkGraph} chunkGraph the chunk graph | 
					
						
							|  |  |  |  * @returns {string} error message | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | const noModuleIdErrorMessage = ( | 
					
						
							|  |  |  | 	module, | 
					
						
							|  |  |  | 	chunkGraph | 
					
						
							|  |  |  | ) => `Module ${module.identifier()} has no id assigned.
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | This should not happen. | 
					
						
							|  |  |  | It's in these chunks: ${ | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 	Array.from( | 
					
						
							|  |  |  | 		chunkGraph.getModuleChunksIterable(module), | 
					
						
							|  |  |  | 		c => c.name || c.id || c.debugId | 
					
						
							|  |  |  | 	).join(", ") || "none" | 
					
						
							|  |  |  | } (If module is in no chunk this indicates a bug in some chunk/module optimization logic) | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | Module has these incoming connections: ${Array.from( | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 	chunkGraph.moduleGraph.getIncomingConnections(module), | 
					
						
							|  |  |  | 	connection => | 
					
						
							|  |  |  | 		`\n - ${ | 
					
						
							|  |  |  | 			connection.originModule && connection.originModule.identifier() | 
					
						
							|  |  |  | 		} ${connection.dependency && connection.dependency.type} ${ | 
					
						
							|  |  |  | 			(connection.explanations && | 
					
						
							|  |  |  | 				Array.from(connection.explanations).join(", ")) || | 
					
						
							|  |  |  | 			"" | 
					
						
							|  |  |  | 		}`
 | 
					
						
							|  |  |  | ).join("")}`;
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-24 01:40:03 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  |  * @param {string | undefined} definition global object definition | 
					
						
							|  |  |  |  * @returns {string | undefined} save to use global object | 
					
						
							| 
									
										
										
										
											2021-11-24 01:40:03 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | function getGlobalObject(definition) { | 
					
						
							|  |  |  | 	if (!definition) return definition; | 
					
						
							|  |  |  | 	const trimmed = definition.trim(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if ( | 
					
						
							|  |  |  | 		// identifier, we do not need real identifier regarding ECMAScript/Unicode
 | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 		/^[_\p{L}][_0-9\p{L}]*$/iu.test(trimmed) || | 
					
						
							| 
									
										
										
										
											2021-11-24 01:40:03 +08:00
										 |  |  | 		// iife
 | 
					
						
							|  |  |  | 		// call expression
 | 
					
						
							|  |  |  | 		// expression in parentheses
 | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 		/^([_\p{L}][_0-9\p{L}]*)?\(.*\)$/iu.test(trimmed) | 
					
						
							| 
									
										
										
										
											2021-11-24 01:40:03 +08:00
										 |  |  | 	) | 
					
						
							|  |  |  | 		return trimmed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return `Object(${trimmed})`; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-05 21:36:15 +08:00
										 |  |  | class RuntimeTemplate { | 
					
						
							| 
									
										
										
										
											2018-07-31 03:36:46 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2021-03-11 23:41:19 +08:00
										 |  |  | 	 * @param {Compilation} compilation the compilation | 
					
						
							| 
									
										
										
										
											2019-07-16 19:33:45 +08:00
										 |  |  | 	 * @param {OutputOptions} outputOptions the compilation output options | 
					
						
							| 
									
										
										
										
											2018-07-31 03:36:46 +08:00
										 |  |  | 	 * @param {RequestShortener} requestShortener the request shortener | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2021-03-11 23:41:19 +08:00
										 |  |  | 	constructor(compilation, outputOptions, requestShortener) { | 
					
						
							|  |  |  | 		this.compilation = compilation; | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		this.outputOptions = /** @type {OutputOptions} */ (outputOptions || {}); | 
					
						
							| 
									
										
										
										
											2017-12-07 17:31:00 +08:00
										 |  |  | 		this.requestShortener = requestShortener; | 
					
						
							| 
									
										
										
										
											2024-03-11 22:56:35 +08:00
										 |  |  | 		this.globalObject = | 
					
						
							|  |  |  | 			/** @type {string} */ | 
					
						
							|  |  |  | 			(getGlobalObject(outputOptions.globalObject)); | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 		this.contentHashReplacement = "X".repeat( | 
					
						
							|  |  |  | 			/** @type {NonNullable<OutputOptions["hashDigestLength"]>} */ | 
					
						
							|  |  |  | 			(outputOptions.hashDigestLength) | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-12-07 17:31:00 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-09 04:29:46 +08:00
										 |  |  | 	isIIFE() { | 
					
						
							|  |  |  | 		return this.outputOptions.iife; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 15:35:14 +08:00
										 |  |  | 	isModule() { | 
					
						
							|  |  |  | 		return this.outputOptions.module; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-25 22:51:47 +08:00
										 |  |  | 	isNeutralPlatform() { | 
					
						
							|  |  |  | 		return ( | 
					
						
							|  |  |  | 			!this.outputOptions.environment.document && | 
					
						
							|  |  |  | 			!this.compilation.compiler.platform.node | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	supportsConst() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.const; | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	supportsArrowFunction() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.arrowFunction; | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-14 18:11:12 +08:00
										 |  |  | 	supportsAsyncFunction() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.asyncFunction; | 
					
						
							| 
									
										
										
										
											2024-01-14 18:11:12 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 01:51:36 +08:00
										 |  |  | 	supportsOptionalChaining() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.optionalChaining; | 
					
						
							| 
									
										
										
										
											2021-11-22 01:51:36 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	supportsForOf() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.forOf; | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-10 16:42:29 +08:00
										 |  |  | 	supportsDestructuring() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.destructuring; | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	supportsBigIntLiteral() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.bigIntLiteral; | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-12 04:47:37 +08:00
										 |  |  | 	supportsDynamicImport() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.dynamicImport; | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	supportsEcmaScriptModuleSyntax() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.module; | 
					
						
							| 
									
										
										
										
											2020-08-28 07:44:56 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 04:07:06 +08:00
										 |  |  | 	supportTemplateLiteral() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.templateLiteral; | 
					
						
							| 
									
										
										
										
											2020-09-17 04:07:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-12 00:16:15 +08:00
										 |  |  | 	supportNodePrefixForCoreModules() { | 
					
						
							| 
									
										
										
										
											2024-10-02 05:18:10 +08:00
										 |  |  | 		return this.outputOptions.environment.nodePrefixForCoreModules; | 
					
						
							| 
									
										
										
										
											2024-04-12 00:16:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {string} returnValue return value | 
					
						
							|  |  |  | 	 * @param {string} args arguments | 
					
						
							|  |  |  | 	 * @returns {string} returning function | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	returningFunction(returnValue, args = "") { | 
					
						
							|  |  |  | 		return this.supportsArrowFunction() | 
					
						
							| 
									
										
										
										
											2021-01-29 18:12:11 +08:00
										 |  |  | 			? `(${args}) => (${returnValue})` | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 			: `function(${args}) { return ${returnValue}; }`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {string} args arguments | 
					
						
							|  |  |  | 	 * @param {string | string[]} body body | 
					
						
							|  |  |  | 	 * @returns {string} basic function | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	basicFunction(args, body) { | 
					
						
							|  |  |  | 		return this.supportsArrowFunction() | 
					
						
							|  |  |  | 			? `(${args}) => {\n${Template.indent(body)}\n}` | 
					
						
							|  |  |  | 			: `function(${args}) {\n${Template.indent(body)}\n}`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 22:58:05 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Array<string|{expr: string}>} args args | 
					
						
							|  |  |  | 	 * @returns {string} result expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	concatenation(...args) { | 
					
						
							|  |  |  | 		const len = args.length; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (len === 2) return this._es5Concatenation(args); | 
					
						
							|  |  |  | 		if (len === 0) return '""'; | 
					
						
							| 
									
										
										
										
											2021-11-26 16:13:14 +08:00
										 |  |  | 		if (len === 1) { | 
					
						
							| 
									
										
										
										
											2021-11-22 22:58:05 +08:00
										 |  |  | 			return typeof args[0] === "string" | 
					
						
							|  |  |  | 				? JSON.stringify(args[0]) | 
					
						
							|  |  |  | 				: `"" + ${args[0].expr}`; | 
					
						
							| 
									
										
										
										
											2021-11-26 16:13:14 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-11-22 22:58:05 +08:00
										 |  |  | 		if (!this.supportTemplateLiteral()) return this._es5Concatenation(args); | 
					
						
							| 
									
										
										
										
											2021-11-22 01:51:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-26 16:13:14 +08:00
										 |  |  | 		// cost comparison between template literal and concatenation:
 | 
					
						
							|  |  |  | 		// both need equal surroundings: `xxx` vs "xxx"
 | 
					
						
							|  |  |  | 		// template literal has constant cost of 3 chars for each expression
 | 
					
						
							|  |  |  | 		// es5 concatenation has cost of 3 + n chars for n expressions in row
 | 
					
						
							|  |  |  | 		// when a es5 concatenation ends with an expression it reduces cost by 3
 | 
					
						
							|  |  |  | 		// when a es5 concatenation starts with an single expression it reduces cost by 3
 | 
					
						
							|  |  |  | 		// e. g. `${a}${b}${c}` (3*3 = 9) is longer than ""+a+b+c ((3+3)-3 = 3)
 | 
					
						
							|  |  |  | 		// e. g. `x${a}x${b}x${c}x` (3*3 = 9) is shorter than "x"+a+"x"+b+"x"+c+"x" (4+4+4 = 12)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		let templateCost = 0; | 
					
						
							|  |  |  | 		let concatenationCost = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		let lastWasExpr = false; | 
					
						
							|  |  |  | 		for (const arg of args) { | 
					
						
							|  |  |  | 			const isExpr = typeof arg !== "string"; | 
					
						
							|  |  |  | 			if (isExpr) { | 
					
						
							|  |  |  | 				templateCost += 3; | 
					
						
							|  |  |  | 				concatenationCost += lastWasExpr ? 1 : 4; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			lastWasExpr = isExpr; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (lastWasExpr) concatenationCost -= 3; | 
					
						
							|  |  |  | 		if (typeof args[0] !== "string" && typeof args[1] === "string") | 
					
						
							|  |  |  | 			concatenationCost -= 3; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (concatenationCost <= templateCost) return this._es5Concatenation(args); | 
					
						
							| 
									
										
										
										
											2021-11-22 01:51:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 22:58:05 +08:00
										 |  |  | 		return `\`${args | 
					
						
							|  |  |  | 			.map(arg => (typeof arg === "string" ? arg : `\${${arg.expr}}`)) | 
					
						
							|  |  |  | 			.join("")}\``; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2021-11-26 16:13:14 +08:00
										 |  |  | 	 * @param {Array<string|{expr: string}>} args args (len >= 2) | 
					
						
							| 
									
										
										
										
											2021-11-22 22:58:05 +08:00
										 |  |  | 	 * @returns {string} result expression | 
					
						
							|  |  |  | 	 * @private | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	_es5Concatenation(args) { | 
					
						
							|  |  |  | 		const str = args | 
					
						
							| 
									
										
										
										
											2021-11-26 16:13:14 +08:00
										 |  |  | 			.map(arg => (typeof arg === "string" ? JSON.stringify(arg) : arg.expr)) | 
					
						
							| 
									
										
										
										
											2021-11-22 22:58:05 +08:00
										 |  |  | 			.join(" + "); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-26 16:13:14 +08:00
										 |  |  | 		// when the first two args are expression, we need to prepend "" + to force string
 | 
					
						
							|  |  |  | 		// concatenation instead of number addition.
 | 
					
						
							| 
									
										
										
										
											2021-11-30 03:20:05 +08:00
										 |  |  | 		return typeof args[0] !== "string" && typeof args[1] !== "string" | 
					
						
							| 
									
										
										
										
											2021-11-26 16:13:14 +08:00
										 |  |  | 			? `"" + ${str}` | 
					
						
							|  |  |  | 			: str; | 
					
						
							| 
									
										
										
										
											2021-11-22 01:51:36 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {string} expression expression | 
					
						
							|  |  |  | 	 * @param {string} args arguments | 
					
						
							|  |  |  | 	 * @returns {string} expression function code | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2021-03-15 19:13:43 +08:00
										 |  |  | 	expressionFunction(expression, args = "") { | 
					
						
							|  |  |  | 		return this.supportsArrowFunction() | 
					
						
							|  |  |  | 			? `(${args}) => (${expression})` | 
					
						
							|  |  |  | 			: `function(${args}) { ${expression}; }`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {string} empty function code | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-12-11 21:32:42 +08:00
										 |  |  | 	emptyFunction() { | 
					
						
							|  |  |  | 		return this.supportsArrowFunction() ? "x => {}" : "function() {}"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {string[]} items items | 
					
						
							|  |  |  | 	 * @param {string} value value | 
					
						
							|  |  |  | 	 * @returns {string} destructure array code | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-08-28 07:44:56 +08:00
										 |  |  | 	destructureArray(items, value) { | 
					
						
							| 
									
										
										
										
											2020-09-10 16:42:29 +08:00
										 |  |  | 		return this.supportsDestructuring() | 
					
						
							| 
									
										
										
										
											2020-08-28 07:44:56 +08:00
										 |  |  | 			? `var [${items.join(", ")}] = ${value};` | 
					
						
							|  |  |  | 			: Template.asString( | 
					
						
							|  |  |  | 					items.map((item, i) => `var ${item} = ${value}[${i}];`) | 
					
						
							| 
									
										
										
										
											2024-07-31 05:43:19 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2020-08-28 07:44:56 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {string[]} items items | 
					
						
							|  |  |  | 	 * @param {string} value value | 
					
						
							|  |  |  | 	 * @returns {string} destructure object code | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 	destructureObject(items, value) { | 
					
						
							|  |  |  | 		return this.supportsDestructuring() | 
					
						
							|  |  |  | 			? `var {${items.join(", ")}} = ${value};` | 
					
						
							|  |  |  | 			: Template.asString( | 
					
						
							|  |  |  | 					items.map(item => `var ${item} = ${value}${propertyAccess([item])};`) | 
					
						
							| 
									
										
										
										
											2024-07-31 05:43:19 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2021-06-23 19:58:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {string} args arguments | 
					
						
							|  |  |  | 	 * @param {string} body body | 
					
						
							|  |  |  | 	 * @returns {string} IIFE code | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-12-03 21:27:39 +08:00
										 |  |  | 	iife(args, body) { | 
					
						
							|  |  |  | 		return `(${this.basicFunction(args, body)})()`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {string} variable variable | 
					
						
							|  |  |  | 	 * @param {string} array array | 
					
						
							|  |  |  | 	 * @param {string | string[]} body body | 
					
						
							|  |  |  | 	 * @returns {string} for each code | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +08:00
										 |  |  | 	forEach(variable, array, body) { | 
					
						
							|  |  |  | 		return this.supportsForOf() | 
					
						
							|  |  |  | 			? `for(const ${variable} of ${array}) {\n${Template.indent(body)}\n}` | 
					
						
							|  |  |  | 			: `${array}.forEach(function(${variable}) {\n${Template.indent( | 
					
						
							|  |  |  | 					body | 
					
						
							| 
									
										
										
										
											2024-07-31 05:43:19 +08:00
										 |  |  | 				)}\n});`;
 | 
					
						
							| 
									
										
										
										
											2019-08-27 02:21:07 +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 | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 	 * @param {(string | null)=} options.chunkName name of the chunk referenced | 
					
						
							| 
									
										
										
										
											2018-04-12 16:01:09 +08:00
										 |  |  | 	 * @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) { | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 			return `${Template.toComment(content)} `; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +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 }) { | 
					
						
							| 
									
										
										
										
											2020-02-22 14:20:30 +08:00
										 |  |  | 		return `Object(${this.throwMissingModuleErrorFunction({ request })}())`; | 
					
						
							| 
									
										
										
										
											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 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
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +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 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	 * @param {string=} options.request the request that should be printed as comment | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	 * @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 | 
					
						
							| 
									
										
										
										
											2024-07-31 05:43:19 +08:00
										 |  |  | 					? `"Module '" + ${idExpr} + "' is not available (weak dependency)"` | 
					
						
							|  |  |  | 					: JSON.stringify( | 
					
						
							|  |  |  | 							`Module '${moduleId}' is not available (weak dependency)` | 
					
						
							|  |  |  | 						); | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 		const comment = request ? `${Template.toNormalComment(request)} ` : ""; | 
					
						
							|  |  |  | 		const errorStatements = `var e = new Error(${errorMessage}); ${ | 
					
						
							|  |  |  | 			comment | 
					
						
							|  |  |  | 		}e.code = 'MODULE_NOT_FOUND'; throw e;`;
 | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 		switch (type) { | 
					
						
							|  |  |  | 			case "statements": | 
					
						
							|  |  |  | 				return errorStatements; | 
					
						
							|  |  |  | 			case "promise": | 
					
						
							| 
									
										
										
										
											2019-12-03 21:27:39 +08:00
										 |  |  | 				return `Promise.resolve().then(${this.basicFunction( | 
					
						
							|  |  |  | 					"", | 
					
						
							|  |  |  | 					errorStatements | 
					
						
							|  |  |  | 				)})`;
 | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 			case "expression": | 
					
						
							| 
									
										
										
										
											2019-12-03 21:27:39 +08:00
										 |  |  | 				return this.iife("", errorStatements); | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options object | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	 * @param {Module} options.module the module | 
					
						
							| 
									
										
										
										
											2018-08-28 17:50:33 +08:00
										 |  |  | 	 * @param {ChunkGraph} options.chunkGraph the chunk graph | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	 * @param {string=} options.request the request that should be printed as comment | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	 * @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( | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				`RuntimeTemplate.moduleId(): ${noModuleIdErrorMessage( | 
					
						
							|  |  |  | 					module, | 
					
						
							|  |  |  | 					chunkGraph | 
					
						
							|  |  |  | 				)}`
 | 
					
						
							| 
									
										
										
										
											2018-05-28 03:47:23 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options object | 
					
						
							| 
									
										
										
										
											2023-06-17 02:24:34 +08:00
										 |  |  | 	 * @param {Module | null} options.module the module | 
					
						
							| 
									
										
										
										
											2018-08-28 17:50:33 +08:00
										 |  |  | 	 * @param {ChunkGraph} options.chunkGraph the chunk graph | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	 * @param {string=} options.request the request that should be printed as comment | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	 * @param {boolean=} options.weak if the dependency is weak (will create a nice error message) | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	 * @returns {string} the expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 	moduleRaw({ module, chunkGraph, request, weak, runtimeRequirements }) { | 
					
						
							| 
									
										
										
										
											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( | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				`RuntimeTemplate.moduleId(): ${noModuleIdErrorMessage( | 
					
						
							|  |  |  | 					module, | 
					
						
							|  |  |  | 					chunkGraph | 
					
						
							|  |  |  | 				)}`
 | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 		runtimeRequirements.add(RuntimeGlobals.require); | 
					
						
							| 
									
										
										
										
											2023-05-19 23:55:47 +08:00
										 |  |  | 		return `${RuntimeGlobals.require}(${this.moduleId({ | 
					
						
							| 
									
										
										
										
											2018-08-28 17:50:33 +08:00
										 |  |  | 			module, | 
					
						
							|  |  |  | 			chunkGraph, | 
					
						
							|  |  |  | 			request, | 
					
						
							|  |  |  | 			weak | 
					
						
							|  |  |  | 		})})`;
 | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options object | 
					
						
							| 
									
										
										
										
											2023-06-17 02:24:34 +08:00
										 |  |  | 	 * @param {Module | null} 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) | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	 * @returns {string} the expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 	moduleExports({ module, chunkGraph, request, weak, runtimeRequirements }) { | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 			weak, | 
					
						
							|  |  |  | 			runtimeRequirements | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options object | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	 * @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) | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 	 * @returns {string} the expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	moduleNamespace({ | 
					
						
							|  |  |  | 		module, | 
					
						
							|  |  |  | 		chunkGraph, | 
					
						
							|  |  |  | 		request, | 
					
						
							|  |  |  | 		strict, | 
					
						
							|  |  |  | 		weak, | 
					
						
							|  |  |  | 		runtimeRequirements | 
					
						
							|  |  |  | 	}) { | 
					
						
							| 
									
										
										
										
											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( | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				`RuntimeTemplate.moduleNamespace(): ${noModuleIdErrorMessage( | 
					
						
							|  |  |  | 					module, | 
					
						
							|  |  |  | 					chunkGraph | 
					
						
							|  |  |  | 				)}`
 | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2020-08-18 03:32:47 +08:00
										 |  |  | 		const exportsType = module.getExportsType(chunkGraph.moduleGraph, strict); | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 		switch (exportsType) { | 
					
						
							|  |  |  | 			case "namespace": | 
					
						
							|  |  |  | 				return this.moduleRaw({ | 
					
						
							|  |  |  | 					module, | 
					
						
							|  |  |  | 					chunkGraph, | 
					
						
							|  |  |  | 					request, | 
					
						
							|  |  |  | 					weak, | 
					
						
							|  |  |  | 					runtimeRequirements | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			case "default-with-named": | 
					
						
							|  |  |  | 				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject); | 
					
						
							|  |  |  | 				return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 3)`; | 
					
						
							|  |  |  | 			case "default-only": | 
					
						
							|  |  |  | 				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject); | 
					
						
							|  |  |  | 				return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 1)`; | 
					
						
							|  |  |  | 			case "dynamic": | 
					
						
							|  |  |  | 				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject); | 
					
						
							|  |  |  | 				return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 7)`; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-23 23:33:29 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +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) | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2018-07-23 23:33:29 +08:00
										 |  |  | 	 * @returns {string} the promise expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-08-23 02:17:49 +08:00
										 |  |  | 	moduleNamespacePromise({ | 
					
						
							|  |  |  | 		chunkGraph, | 
					
						
							|  |  |  | 		block, | 
					
						
							|  |  |  | 		module, | 
					
						
							|  |  |  | 		request, | 
					
						
							|  |  |  | 		message, | 
					
						
							|  |  |  | 		strict, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		weak, | 
					
						
							|  |  |  | 		runtimeRequirements | 
					
						
							| 
									
										
										
										
											2018-08-23 02:17:49 +08:00
										 |  |  | 	}) { | 
					
						
							| 
									
										
										
										
											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( | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				`RuntimeTemplate.moduleNamespacePromise(): ${noModuleIdErrorMessage( | 
					
						
							|  |  |  | 					module, | 
					
						
							|  |  |  | 					chunkGraph | 
					
						
							|  |  |  | 				)}`
 | 
					
						
							| 
									
										
										
										
											2018-05-28 03:47:23 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 			message, | 
					
						
							|  |  |  | 			runtimeRequirements | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 		let appending; | 
					
						
							| 
									
										
										
										
											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-20 16:31:36 +08:00
										 |  |  | 			runtimeRequirements.add(RuntimeGlobals.moduleFactories); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2020-08-18 03:32:47 +08:00
										 |  |  | 		const exportsType = module.getExportsType(chunkGraph.moduleGraph, strict); | 
					
						
							| 
									
										
										
										
											2020-11-17 03:24:54 +08:00
										 |  |  | 		let fakeType = 16; | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 		switch (exportsType) { | 
					
						
							|  |  |  | 			case "namespace": | 
					
						
							|  |  |  | 				if (header) { | 
					
						
							|  |  |  | 					const rawModule = this.moduleRaw({ | 
					
						
							|  |  |  | 						module, | 
					
						
							|  |  |  | 						chunkGraph, | 
					
						
							|  |  |  | 						request, | 
					
						
							|  |  |  | 						weak, | 
					
						
							|  |  |  | 						runtimeRequirements | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 					appending = `.then(${this.basicFunction( | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 						"", | 
					
						
							|  |  |  | 						`${header}return ${rawModule};` | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 					)})`;
 | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 				} else { | 
					
						
							|  |  |  | 					runtimeRequirements.add(RuntimeGlobals.require); | 
					
						
							| 
									
										
										
										
											2023-05-19 23:55:47 +08:00
										 |  |  | 					appending = `.then(${RuntimeGlobals.require}.bind(${RuntimeGlobals.require}, ${comment}${idExpr}))`; | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			case "dynamic": | 
					
						
							| 
									
										
										
										
											2020-08-07 23:34:36 +08:00
										 |  |  | 				fakeType |= 4; | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 			/* fall through */ | 
					
						
							|  |  |  | 			case "default-with-named": | 
					
						
							| 
									
										
										
										
											2020-08-07 23:34:36 +08:00
										 |  |  | 				fakeType |= 2; | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 			/* fall through */ | 
					
						
							|  |  |  | 			case "default-only": | 
					
						
							|  |  |  | 				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject); | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 				if (chunkGraph.moduleGraph.isAsync(module)) { | 
					
						
							|  |  |  | 					if (header) { | 
					
						
							|  |  |  | 						const rawModule = this.moduleRaw({ | 
					
						
							|  |  |  | 							module, | 
					
						
							|  |  |  | 							chunkGraph, | 
					
						
							|  |  |  | 							request, | 
					
						
							|  |  |  | 							weak, | 
					
						
							|  |  |  | 							runtimeRequirements | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 						appending = `.then(${this.basicFunction( | 
					
						
							|  |  |  | 							"", | 
					
						
							|  |  |  | 							`${header}return ${rawModule};` | 
					
						
							|  |  |  | 						)})`;
 | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						runtimeRequirements.add(RuntimeGlobals.require); | 
					
						
							| 
									
										
										
										
											2023-05-19 23:55:47 +08:00
										 |  |  | 						appending = `.then(${RuntimeGlobals.require}.bind(${RuntimeGlobals.require}, ${comment}${idExpr}))`; | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					appending += `.then(${this.returningFunction( | 
					
						
							|  |  |  | 						`${RuntimeGlobals.createFakeNamespaceObject}(m, ${fakeType})`, | 
					
						
							|  |  |  | 						"m" | 
					
						
							|  |  |  | 					)})`;
 | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2020-08-07 23:34:36 +08:00
										 |  |  | 					fakeType |= 1; | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 					if (header) { | 
					
						
							|  |  |  | 						const returnExpression = `${RuntimeGlobals.createFakeNamespaceObject}(${moduleIdExpr}, ${fakeType})`; | 
					
						
							|  |  |  | 						appending = `.then(${this.basicFunction( | 
					
						
							|  |  |  | 							"", | 
					
						
							|  |  |  | 							`${header}return ${returnExpression};` | 
					
						
							|  |  |  | 						)})`;
 | 
					
						
							|  |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2023-05-19 23:55:47 +08:00
										 |  |  | 						appending = `.then(${RuntimeGlobals.createFakeNamespaceObject}.bind(${RuntimeGlobals.require}, ${comment}${idExpr}, ${fakeType}))`; | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 		return `${promise || "Promise.resolve()"}${appending}`; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options object | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | 	 * @param {ChunkGraph} options.chunkGraph the chunk graph | 
					
						
							|  |  |  | 	 * @param {RuntimeSpec=} options.runtime runtime for which this code will be generated | 
					
						
							|  |  |  | 	 * @param {RuntimeSpec | boolean=} options.runtimeCondition only execute the statement in some runtimes | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | 	 * @returns {string} expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	runtimeConditionExpression({ | 
					
						
							|  |  |  | 		chunkGraph, | 
					
						
							|  |  |  | 		runtimeCondition, | 
					
						
							|  |  |  | 		runtime, | 
					
						
							|  |  |  | 		runtimeRequirements | 
					
						
							|  |  |  | 	}) { | 
					
						
							|  |  |  | 		if (runtimeCondition === undefined) return "true"; | 
					
						
							|  |  |  | 		if (typeof runtimeCondition === "boolean") return `${runtimeCondition}`; | 
					
						
							| 
									
										
										
										
											2020-10-26 23:05:25 +08:00
										 |  |  | 		/** @type {Set<string>} */ | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | 		const positiveRuntimeIds = new Set(); | 
					
						
							|  |  |  | 		forEachRuntime(runtimeCondition, runtime => | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 			positiveRuntimeIds.add( | 
					
						
							|  |  |  | 				`${chunkGraph.getRuntimeId(/** @type {string} */ (runtime))}` | 
					
						
							|  |  |  | 			) | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2020-10-26 23:05:25 +08:00
										 |  |  | 		/** @type {Set<string>} */ | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | 		const negativeRuntimeIds = new Set(); | 
					
						
							|  |  |  | 		forEachRuntime(subtractRuntime(runtime, runtimeCondition), runtime => | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 			negativeRuntimeIds.add( | 
					
						
							|  |  |  | 				`${chunkGraph.getRuntimeId(/** @type {string} */ (runtime))}` | 
					
						
							|  |  |  | 			) | 
					
						
							| 
									
										
										
										
											2020-10-23 20:52:23 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		runtimeRequirements.add(RuntimeGlobals.runtimeId); | 
					
						
							|  |  |  | 		return compileBooleanMatcher.fromLists( | 
					
						
							|  |  |  | 			Array.from(positiveRuntimeIds), | 
					
						
							|  |  |  | 			Array.from(negativeRuntimeIds) | 
					
						
							|  |  |  | 		)(RuntimeGlobals.runtimeId); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-21 00:17:51 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options object | 
					
						
							| 
									
										
										
										
											2018-07-21 00:17:51 +08:00
										 |  |  | 	 * @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 | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 	 * @returns {[string, string]} the import statement and the compat statement | 
					
						
							| 
									
										
										
										
											2018-07-21 00:17:51 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-08-28 17:50:33 +08:00
										 |  |  | 	importStatement({ | 
					
						
							|  |  |  | 		update, | 
					
						
							|  |  |  | 		module, | 
					
						
							|  |  |  | 		chunkGraph, | 
					
						
							|  |  |  | 		request, | 
					
						
							|  |  |  | 		importVar, | 
					
						
							|  |  |  | 		originModule, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		weak, | 
					
						
							|  |  |  | 		runtimeRequirements | 
					
						
							| 
									
										
										
										
											2018-08-28 17:50:33 +08:00
										 |  |  | 	}) { | 
					
						
							| 
									
										
										
										
											2018-05-28 03:47:23 +08:00
										 |  |  | 		if (!module) { | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 			return [ | 
					
						
							| 
									
										
										
										
											2020-10-26 21:00:11 +08:00
										 |  |  | 				this.missingModuleStatement({ | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 					request | 
					
						
							| 
									
										
										
										
											2020-10-26 21:00:11 +08:00
										 |  |  | 				}), | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 				"" | 
					
						
							|  |  |  | 			]; | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 				return [ | 
					
						
							| 
									
										
										
										
											2020-10-26 21:00:11 +08:00
										 |  |  | 					this.weakError({ | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 						module, | 
					
						
							|  |  |  | 						chunkGraph, | 
					
						
							|  |  |  | 						request, | 
					
						
							|  |  |  | 						type: "statements" | 
					
						
							| 
									
										
										
										
											2020-10-26 21:00:11 +08:00
										 |  |  | 					}), | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 					"" | 
					
						
							|  |  |  | 				]; | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			throw new Error( | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 				`RuntimeTemplate.importStatement(): ${noModuleIdErrorMessage( | 
					
						
							|  |  |  | 					module, | 
					
						
							|  |  |  | 					chunkGraph | 
					
						
							|  |  |  | 				)}`
 | 
					
						
							| 
									
										
										
										
											2018-07-25 00:22:28 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											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 "; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 		const exportsType = module.getExportsType( | 
					
						
							| 
									
										
										
										
											2020-08-18 03:32:47 +08:00
										 |  |  | 			chunkGraph.moduleGraph, | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 			/** @type {BuildMeta} */ | 
					
						
							|  |  |  | 			(originModule.buildMeta).strictHarmonyModule | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 		runtimeRequirements.add(RuntimeGlobals.require); | 
					
						
							| 
									
										
										
										
											2023-05-19 23:55:47 +08:00
										 |  |  | 		const importContent = `/* harmony import */ ${optDeclaration}${importVar} = ${RuntimeGlobals.require}(${moduleId});\n`; | 
					
						
							| 
									
										
										
										
											2017-12-23 01:23:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 		if (exportsType === "dynamic") { | 
					
						
							| 
									
										
										
										
											2018-11-18 19:59:33 +08:00
										 |  |  | 			runtimeRequirements.add(RuntimeGlobals.compatGetDefaultExport); | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 			return [ | 
					
						
							|  |  |  | 				importContent, | 
					
						
							| 
									
										
										
										
											2020-10-26 21:00:11 +08:00
										 |  |  | 				`/* harmony import */ ${optDeclaration}${importVar}_default = /*#__PURE__*/${RuntimeGlobals.compatGetDefaultExport}(${importVar});\n` | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 			]; | 
					
						
							| 
									
										
										
										
											2017-12-23 01:23:20 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-05-15 22:24:11 +08:00
										 |  |  | 		return [importContent, ""]; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	 * @param {ModuleGraph} options.moduleGraph the module graph | 
					
						
							|  |  |  | 	 * @param {Module} options.module the module | 
					
						
							|  |  |  | 	 * @param {string} options.request the request | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 	 * @param {string | string[]} options.exportName the export name | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	 * @param {Module} options.originModule the origin module | 
					
						
							| 
									
										
										
										
											2020-09-01 17:06:14 +08:00
										 |  |  | 	 * @param {boolean|undefined} options.asiSafe true, if location is safe for ASI, a bracket can be emitted | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	 * @param {boolean} options.isCall true, if expression will be called | 
					
						
							| 
									
										
										
										
											2023-05-26 02:31:28 +08:00
										 |  |  | 	 * @param {boolean | null} options.callContext when false, call context will not be preserved | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 	 * @param {boolean} options.defaultInterop when true and accessing the default exports, interop code will be generated | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	 * @param {string} options.importVar the identifier name of the import variable | 
					
						
							| 
									
										
										
										
											2023-05-26 02:31:28 +08:00
										 |  |  | 	 * @param {InitFragment<TODO>[]} options.initFragments init fragments will be added here | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 	 * @param {RuntimeSpec} options.runtime runtime for which this code will be generated | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2018-08-07 01:39:43 +08:00
										 |  |  | 	 * @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, | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 		defaultInterop, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		importVar, | 
					
						
							| 
									
										
										
										
											2019-11-05 04:05:17 +08:00
										 |  |  | 		initFragments, | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		runtime, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 		runtimeRequirements | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 	}) { | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		if (!Array.isArray(exportName)) { | 
					
						
							|  |  |  | 			exportName = exportName ? [exportName] : []; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 		const exportsType = module.getExportsType( | 
					
						
							| 
									
										
										
										
											2020-08-18 03:32:47 +08:00
										 |  |  | 			moduleGraph, | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 			/** @type {BuildMeta} */ | 
					
						
							|  |  |  | 			(originModule.buildMeta).strictHarmonyModule | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 		if (defaultInterop) { | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 			if (exportName.length > 0 && exportName[0] === "default") { | 
					
						
							|  |  |  | 				switch (exportsType) { | 
					
						
							|  |  |  | 					case "dynamic": | 
					
						
							| 
									
										
										
										
											2019-12-05 05:54:26 +08:00
										 |  |  | 						if (isCall) { | 
					
						
							|  |  |  | 							return `${importVar}_default()${propertyAccess(exportName, 1)}`; | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2024-07-31 04:21:27 +08:00
										 |  |  | 						return asiSafe | 
					
						
							|  |  |  | 							? `(${importVar}_default()${propertyAccess(exportName, 1)})` | 
					
						
							|  |  |  | 							: asiSafe === false | 
					
						
							| 
									
										
										
										
											2024-07-31 05:43:19 +08:00
										 |  |  | 								? `;(${importVar}_default()${propertyAccess(exportName, 1)})` | 
					
						
							|  |  |  | 								: `${importVar}_default.a${propertyAccess(exportName, 1)}`; | 
					
						
							| 
									
										
										
										
											2024-07-31 04:21:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 					case "default-only": | 
					
						
							|  |  |  | 					case "default-with-named": | 
					
						
							|  |  |  | 						exportName = exportName.slice(1); | 
					
						
							|  |  |  | 						break; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 			} else if (exportName.length > 0) { | 
					
						
							|  |  |  | 				if (exportsType === "default-only") { | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 					return `/* non-default import from non-esm module */undefined${propertyAccess( | 
					
						
							|  |  |  | 						exportName, | 
					
						
							|  |  |  | 						1 | 
					
						
							|  |  |  | 					)}`;
 | 
					
						
							| 
									
										
										
										
											2020-11-17 00:19:36 +08:00
										 |  |  | 				} else if ( | 
					
						
							|  |  |  | 					exportsType !== "namespace" && | 
					
						
							|  |  |  | 					exportName[0] === "__esModule" | 
					
						
							|  |  |  | 				) { | 
					
						
							|  |  |  | 					return "/* __esModule */true"; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 			} else if ( | 
					
						
							|  |  |  | 				exportsType === "default-only" || | 
					
						
							|  |  |  | 				exportsType === "default-with-named" | 
					
						
							|  |  |  | 			) { | 
					
						
							|  |  |  | 				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject); | 
					
						
							|  |  |  | 				initFragments.push( | 
					
						
							|  |  |  | 					new InitFragment( | 
					
						
							|  |  |  | 						`var ${importVar}_namespace_cache;\n`, | 
					
						
							|  |  |  | 						InitFragment.STAGE_CONSTANTS, | 
					
						
							|  |  |  | 						-1, | 
					
						
							|  |  |  | 						`${importVar}_namespace_cache` | 
					
						
							|  |  |  | 					) | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				return `/*#__PURE__*/ ${ | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 					asiSafe ? "" : asiSafe === false ? ";" : "Object" | 
					
						
							| 
									
										
										
										
											2020-04-23 02:31:26 +08:00
										 |  |  | 				}(${importVar}_namespace_cache || (${importVar}_namespace_cache = ${ | 
					
						
							|  |  |  | 					RuntimeGlobals.createFakeNamespaceObject | 
					
						
							|  |  |  | 				}(${importVar}${exportsType === "default-only" ? "" : ", 2"})))`;
 | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 		if (exportName.length > 0) { | 
					
						
							|  |  |  | 			const exportsInfo = moduleGraph.getExportsInfo(module); | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			const used = exportsInfo.getUsedName(exportName, runtime); | 
					
						
							| 
									
										
										
										
											2018-06-08 16:34:38 +08:00
										 |  |  | 			if (!used) { | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 				const comment = Template.toNormalComment( | 
					
						
							| 
									
										
										
										
											2019-10-31 06:24:13 +08:00
										 |  |  | 					`unused export ${propertyAccess(exportName)}` | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-06-08 16:34:38 +08:00
										 |  |  | 				return `${comment} undefined`; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-08-12 00:06:27 +08:00
										 |  |  | 			const comment = equals(used, exportName) | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 				? "" | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 				: `${Template.toNormalComment(propertyAccess(exportName))} `; | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 			const access = `${importVar}${comment}${propertyAccess(used)}`; | 
					
						
							|  |  |  | 			if (isCall && callContext === false) { | 
					
						
							| 
									
										
										
										
											2020-08-29 22:02:10 +08:00
										 |  |  | 				return asiSafe | 
					
						
							|  |  |  | 					? `(0,${access})` | 
					
						
							|  |  |  | 					: asiSafe === false | 
					
						
							| 
									
										
										
										
											2024-07-31 05:43:19 +08:00
										 |  |  | 						? `;(0,${access})` | 
					
						
							|  |  |  | 						: `/*#__PURE__*/Object(${access})`; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			return access; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-07-31 04:21:27 +08:00
										 |  |  | 		return importVar; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 	 * @param {AsyncDependenciesBlock | undefined} options.block the async block | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	 * @param {string} options.message the message | 
					
						
							|  |  |  | 	 * @param {ChunkGraph} options.chunkGraph the chunk graph | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 	 * @returns {string} expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	blockPromise({ block, message, chunkGraph, runtimeRequirements }) { | 
					
						
							| 
									
										
										
										
											2018-08-23 02:17:49 +08:00
										 |  |  | 		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, | 
					
						
							| 
									
										
										
										
											2018-11-15 00:31:32 +08:00
										 |  |  | 			chunkName: block.chunkName | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											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-18 19:59:33 +08:00
										 |  |  | 			runtimeRequirements.add(RuntimeGlobals.ensureChunk); | 
					
						
							| 
									
										
										
										
											2023-06-13 05:17:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			const fetchPriority = chunkGroup.options.fetchPriority; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (fetchPriority) { | 
					
						
							|  |  |  | 				runtimeRequirements.add(RuntimeGlobals.hasFetchPriority); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			return `${RuntimeGlobals.ensureChunk}(${comment}${chunkId}${ | 
					
						
							|  |  |  | 				fetchPriority ? `, ${JSON.stringify(fetchPriority)}` : "" | 
					
						
							|  |  |  | 			})`;
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if (chunks.length > 0) { | 
					
						
							| 
									
										
										
										
											2018-11-20 19:05:12 +08:00
										 |  |  | 			runtimeRequirements.add(RuntimeGlobals.ensureChunk); | 
					
						
							| 
									
										
										
										
											2023-06-13 05:17:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			const fetchPriority = chunkGroup.options.fetchPriority; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (fetchPriority) { | 
					
						
							|  |  |  | 				runtimeRequirements.add(RuntimeGlobals.hasFetchPriority); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 			/** | 
					
						
							|  |  |  | 			 * @param {Chunk} chunk chunk | 
					
						
							|  |  |  | 			 * @returns {string} require chunk id code | 
					
						
							|  |  |  | 			 */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			const requireChunkId = chunk => | 
					
						
							| 
									
										
										
										
											2023-06-13 05:17:53 +08:00
										 |  |  | 				`${RuntimeGlobals.ensureChunk}(${JSON.stringify(chunk.id)}${ | 
					
						
							|  |  |  | 					fetchPriority ? `, ${JSON.stringify(fetchPriority)}` : "" | 
					
						
							|  |  |  | 				})`;
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-07-31 04:21:27 +08:00
										 |  |  | 		return `Promise.resolve(${comment.trim()})`; | 
					
						
							| 
									
										
										
										
											2017-12-19 22:50:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 	 * @param {AsyncDependenciesBlock} options.block the async block | 
					
						
							|  |  |  | 	 * @param {ChunkGraph} options.chunkGraph the chunk graph | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 	 * @param {string=} options.request request string used originally | 
					
						
							|  |  |  | 	 * @returns {string} expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	asyncModuleFactory({ block, chunkGraph, runtimeRequirements, request }) { | 
					
						
							|  |  |  | 		const dep = block.dependencies[0]; | 
					
						
							|  |  |  | 		const module = chunkGraph.moduleGraph.getModule(dep); | 
					
						
							| 
									
										
										
										
											2020-05-26 06:46:09 +08:00
										 |  |  | 		const ensureChunk = this.blockPromise({ | 
					
						
							|  |  |  | 			block, | 
					
						
							|  |  |  | 			message: "", | 
					
						
							|  |  |  | 			chunkGraph, | 
					
						
							|  |  |  | 			runtimeRequirements | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		const factory = this.returningFunction( | 
					
						
							|  |  |  | 			this.moduleRaw({ | 
					
						
							|  |  |  | 				module, | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 				chunkGraph, | 
					
						
							| 
									
										
										
										
											2020-05-26 06:46:09 +08:00
										 |  |  | 				request, | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 				runtimeRequirements | 
					
						
							| 
									
										
										
										
											2020-05-26 06:46:09 +08:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		return this.returningFunction( | 
					
						
							|  |  |  | 			ensureChunk.startsWith("Promise.resolve(") | 
					
						
							|  |  |  | 				? `${factory}` | 
					
						
							|  |  |  | 				: `${ensureChunk}.then(${this.returningFunction(factory)})` | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-26 23:11:21 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options | 
					
						
							| 
									
										
										
										
											2020-05-26 23:11:21 +08:00
										 |  |  | 	 * @param {Dependency} options.dependency the dependency | 
					
						
							|  |  |  | 	 * @param {ChunkGraph} options.chunkGraph the chunk graph | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2020-05-26 23:11:21 +08:00
										 |  |  | 	 * @param {string=} options.request request string used originally | 
					
						
							|  |  |  | 	 * @returns {string} expression | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	syncModuleFactory({ dependency, chunkGraph, runtimeRequirements, request }) { | 
					
						
							|  |  |  | 		const module = chunkGraph.moduleGraph.getModule(dependency); | 
					
						
							|  |  |  | 		const factory = this.returningFunction( | 
					
						
							|  |  |  | 			this.moduleRaw({ | 
					
						
							|  |  |  | 				module, | 
					
						
							|  |  |  | 				chunkGraph, | 
					
						
							|  |  |  | 				request, | 
					
						
							|  |  |  | 				runtimeRequirements | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		return this.returningFunction(factory); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 	 * @param {object} options options | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 	 * @param {string} options.exportsArgument the name of the exports object | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements | 
					
						
							| 
									
										
										
										
											2018-11-18 19:59:33 +08:00
										 |  |  | 	 * @returns {string} statement | 
					
						
							| 
									
										
										
										
											2018-11-17 01:18:44 +08:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	defineEsModuleFlagStatement({ exportsArgument, runtimeRequirements }) { | 
					
						
							|  |  |  | 		runtimeRequirements.add(RuntimeGlobals.makeNamespaceObject); | 
					
						
							|  |  |  | 		runtimeRequirements.add(RuntimeGlobals.exports); | 
					
						
							| 
									
										
										
										
											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; |