| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 00:34:29 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2013-09-13 17:17:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | const { | 
					
						
							|  |  |  | 	JAVASCRIPT_MODULE_TYPE_AUTO, | 
					
						
							|  |  |  | 	JAVASCRIPT_MODULE_TYPE_ESM, | 
					
						
							|  |  |  | 	JAVASCRIPT_MODULE_TYPE_DYNAMIC | 
					
						
							|  |  |  | } = require("./ModuleTypeConstants"); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:45:36 +08:00
										 |  |  | const RuntimeGlobals = require("./RuntimeGlobals"); | 
					
						
							|  |  |  | const WebpackError = require("./WebpackError"); | 
					
						
							|  |  |  | const ConstDependency = require("./dependencies/ConstDependency"); | 
					
						
							|  |  |  | const BasicEvaluatedExpression = require("./javascript/BasicEvaluatedExpression"); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-03 16:24:29 +08:00
										 |  |  | const { | 
					
						
							|  |  |  | 	evaluateToString, | 
					
						
							| 
									
										
										
										
											2018-11-06 02:03:12 +08:00
										 |  |  | 	toConstantDependency | 
					
						
							| 
									
										
										
										
											2019-10-22 15:27:52 +08:00
										 |  |  | } = require("./javascript/JavascriptParserHelpers"); | 
					
						
							| 
									
										
										
										
											2021-09-29 21:01:31 +08:00
										 |  |  | const createHash = require("./util/createHash"); | 
					
						
							| 
									
										
										
										
											2014-06-16 21:18:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | /** @typedef {import("estree").Expression} Expression */ | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | /** @typedef {import("./Compiler")} Compiler */ | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | /** @typedef {import("./Module").BuildInfo} BuildInfo */ | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | /** @typedef {import("./NormalModule")} NormalModule */ | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | /** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */ | 
					
						
							| 
									
										
										
										
											2019-10-11 21:46:57 +08:00
										 |  |  | /** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */ | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | /** @typedef {import("./javascript/JavascriptParser").Range} Range */ | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | /** @typedef {import("./logging/Logger").Logger} Logger */ | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-21 21:01:38 +08:00
										 |  |  | /** @typedef {null|undefined|RegExp|Function|string|number|boolean|bigint|undefined} CodeValuePrimitive */ | 
					
						
							|  |  |  | /** @typedef {RecursiveArrayOrRecord<CodeValuePrimitive|RuntimeValue>} CodeValue */ | 
					
						
							| 
									
										
										
										
											2018-07-04 07:46:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} RuntimeValueOptions | 
					
						
							|  |  |  |  * @property {string[]=} fileDependencies | 
					
						
							|  |  |  |  * @property {string[]=} contextDependencies | 
					
						
							|  |  |  |  * @property {string[]=} missingDependencies | 
					
						
							|  |  |  |  * @property {string[]=} buildDependencies | 
					
						
							|  |  |  |  * @property {string|function(): string=} version | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | class RuntimeValue { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {function({ module: NormalModule, key: string, readonly version: string | undefined }): CodeValuePrimitive} fn generator function | 
					
						
							|  |  |  | 	 * @param {true | string[] | RuntimeValueOptions=} options options | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	constructor(fn, options) { | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 		this.fn = fn; | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 		if (Array.isArray(options)) { | 
					
						
							|  |  |  | 			options = { | 
					
						
							|  |  |  | 				fileDependencies: options | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		this.options = options || {}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	get fileDependencies() { | 
					
						
							|  |  |  | 		return this.options === true ? true : this.options.fileDependencies; | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {JavascriptParser} parser the parser | 
					
						
							| 
									
										
										
										
											2021-04-12 18:21:49 +08:00
										 |  |  | 	 * @param {Map<string, string | Set<string>>} valueCacheVersions valueCacheVersions | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	 * @param {string} key the defined key | 
					
						
							|  |  |  | 	 * @returns {CodeValuePrimitive} code | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	exec(parser, valueCacheVersions, key) { | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 		const buildInfo = /** @type {BuildInfo} */ (parser.state.module.buildInfo); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 		if (this.options === true) { | 
					
						
							| 
									
										
										
										
											2019-01-09 20:23:26 +08:00
										 |  |  | 			buildInfo.cacheable = false; | 
					
						
							| 
									
										
										
										
											2018-10-25 03:34:03 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 			if (this.options.fileDependencies) { | 
					
						
							|  |  |  | 				for (const dep of this.options.fileDependencies) { | 
					
						
							|  |  |  | 					buildInfo.fileDependencies.add(dep); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (this.options.contextDependencies) { | 
					
						
							|  |  |  | 				for (const dep of this.options.contextDependencies) { | 
					
						
							|  |  |  | 					buildInfo.contextDependencies.add(dep); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (this.options.missingDependencies) { | 
					
						
							|  |  |  | 				for (const dep of this.options.missingDependencies) { | 
					
						
							|  |  |  | 					buildInfo.missingDependencies.add(dep); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (this.options.buildDependencies) { | 
					
						
							|  |  |  | 				for (const dep of this.options.buildDependencies) { | 
					
						
							|  |  |  | 					buildInfo.buildDependencies.add(dep); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2018-10-25 03:34:03 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 		return this.fn({ | 
					
						
							|  |  |  | 			module: parser.state.module, | 
					
						
							|  |  |  | 			key, | 
					
						
							|  |  |  | 			get version() { | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 				return /** @type {string} */ ( | 
					
						
							|  |  |  | 					valueCacheVersions.get(VALUE_DEP_PREFIX + key) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	getCacheVersion() { | 
					
						
							|  |  |  | 		return this.options === true | 
					
						
							|  |  |  | 			? undefined | 
					
						
							|  |  |  | 			: (typeof this.options.version === "function" | 
					
						
							|  |  |  | 					? this.options.version() | 
					
						
							|  |  |  | 					: this.options.version) || "unset"; | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {any[]|{[k: string]: any}} obj obj | 
					
						
							|  |  |  |  * @param {JavascriptParser} parser Parser | 
					
						
							| 
									
										
										
										
											2021-04-12 18:21:49 +08:00
										 |  |  |  * @param {Map<string, string | Set<string>>} valueCacheVersions valueCacheVersions | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  |  * @param {string} key the defined key | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  |  * @param {RuntimeTemplate} runtimeTemplate the runtime template | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  |  * @param {Logger} logger the logger object | 
					
						
							| 
									
										
										
										
											2020-09-01 17:06:14 +08:00
										 |  |  |  * @param {boolean|undefined|null=} asiSafe asi safe (undefined: unknown, null: unneeded) | 
					
						
							| 
									
										
										
										
											2023-04-08 03:29:32 +08:00
										 |  |  |  * @param {Set<string>|undefined=} objKeys used keys | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  |  * @returns {string} code converted to string that evaluates | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | const stringifyObj = ( | 
					
						
							|  |  |  | 	obj, | 
					
						
							|  |  |  | 	parser, | 
					
						
							|  |  |  | 	valueCacheVersions, | 
					
						
							|  |  |  | 	key, | 
					
						
							|  |  |  | 	runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 	logger, | 
					
						
							| 
									
										
										
										
											2023-04-08 03:29:32 +08:00
										 |  |  | 	asiSafe, | 
					
						
							|  |  |  | 	objKeys | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | ) => { | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 	let code; | 
					
						
							|  |  |  | 	let arr = Array.isArray(obj); | 
					
						
							|  |  |  | 	if (arr) { | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 		code = `[${ | 
					
						
							|  |  |  | 			/** @type {any[]} */ (obj) | 
					
						
							|  |  |  | 				.map(code => | 
					
						
							|  |  |  | 					toCode( | 
					
						
							|  |  |  | 						code, | 
					
						
							|  |  |  | 						parser, | 
					
						
							|  |  |  | 						valueCacheVersions, | 
					
						
							|  |  |  | 						key, | 
					
						
							|  |  |  | 						runtimeTemplate, | 
					
						
							|  |  |  | 						logger, | 
					
						
							|  |  |  | 						null | 
					
						
							|  |  |  | 					) | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 				) | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 				.join(",") | 
					
						
							|  |  |  | 		}]`;
 | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2023-04-08 03:29:32 +08:00
										 |  |  | 		let keys = Object.keys(obj); | 
					
						
							|  |  |  | 		if (objKeys) { | 
					
						
							|  |  |  | 			if (objKeys.size === 0) keys = []; | 
					
						
							| 
									
										
										
										
											2023-04-09 15:44:09 +08:00
										 |  |  | 			else keys = keys.filter(k => objKeys.has(k)); | 
					
						
							| 
									
										
										
										
											2023-04-08 03:29:32 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		code = `{${keys | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			.map(key => { | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 				const code = /** @type {{[k: string]: any}} */ (obj)[key]; | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 				return ( | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | 					JSON.stringify(key) + | 
					
						
							|  |  |  | 					":" + | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 					toCode( | 
					
						
							|  |  |  | 						code, | 
					
						
							|  |  |  | 						parser, | 
					
						
							|  |  |  | 						valueCacheVersions, | 
					
						
							|  |  |  | 						key, | 
					
						
							|  |  |  | 						runtimeTemplate, | 
					
						
							|  |  |  | 						logger, | 
					
						
							|  |  |  | 						null | 
					
						
							|  |  |  | 					) | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 			.join(",")}}`;
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (asiSafe) { | 
					
						
							|  |  |  | 		case null: | 
					
						
							|  |  |  | 			return code; | 
					
						
							|  |  |  | 		case true: | 
					
						
							|  |  |  | 			return arr ? code : `(${code})`; | 
					
						
							|  |  |  | 		case false: | 
					
						
							|  |  |  | 			return arr ? `;${code}` : `;(${code})`; | 
					
						
							|  |  |  | 		default: | 
					
						
							| 
									
										
										
										
											2021-10-17 15:55:59 +08:00
										 |  |  | 			return `/*#__PURE__*/Object(${code})`; | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Convert code to a string that evaluates | 
					
						
							| 
									
										
										
										
											2018-06-23 05:17:55 +08:00
										 |  |  |  * @param {CodeValue} code Code to evaluate | 
					
						
							| 
									
										
										
										
											2018-07-17 17:32:15 +08:00
										 |  |  |  * @param {JavascriptParser} parser Parser | 
					
						
							| 
									
										
										
										
											2021-04-12 18:21:49 +08:00
										 |  |  |  * @param {Map<string, string | Set<string>>} valueCacheVersions valueCacheVersions | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  |  * @param {string} key the defined key | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  |  * @param {RuntimeTemplate} runtimeTemplate the runtime template | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  |  * @param {Logger} logger the logger object | 
					
						
							| 
									
										
										
										
											2020-09-01 17:06:14 +08:00
										 |  |  |  * @param {boolean|undefined|null=} asiSafe asi safe (undefined: unknown, null: unneeded) | 
					
						
							| 
									
										
										
										
											2023-04-08 03:29:32 +08:00
										 |  |  |  * @param {Set<string>|undefined=} objKeys used keys | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  |  * @returns {string} code converted to string that evaluates | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | const toCode = ( | 
					
						
							|  |  |  | 	code, | 
					
						
							|  |  |  | 	parser, | 
					
						
							|  |  |  | 	valueCacheVersions, | 
					
						
							|  |  |  | 	key, | 
					
						
							|  |  |  | 	runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 	logger, | 
					
						
							| 
									
										
										
										
											2023-04-08 03:29:32 +08:00
										 |  |  | 	asiSafe, | 
					
						
							|  |  |  | 	objKeys | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | ) => { | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 	const transformToCode = () => { | 
					
						
							|  |  |  | 		if (code === null) { | 
					
						
							|  |  |  | 			return "null"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (code === undefined) { | 
					
						
							|  |  |  | 			return "undefined"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (Object.is(code, -0)) { | 
					
						
							|  |  |  | 			return "-0"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (code instanceof RuntimeValue) { | 
					
						
							|  |  |  | 			return toCode( | 
					
						
							|  |  |  | 				code.exec(parser, valueCacheVersions, key), | 
					
						
							|  |  |  | 				parser, | 
					
						
							|  |  |  | 				valueCacheVersions, | 
					
						
							|  |  |  | 				key, | 
					
						
							|  |  |  | 				runtimeTemplate, | 
					
						
							|  |  |  | 				logger, | 
					
						
							|  |  |  | 				asiSafe | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (code instanceof RegExp && code.toString) { | 
					
						
							|  |  |  | 			return code.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (typeof code === "function" && code.toString) { | 
					
						
							|  |  |  | 			return "(" + code.toString() + ")"; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (typeof code === "object") { | 
					
						
							|  |  |  | 			return stringifyObj( | 
					
						
							|  |  |  | 				code, | 
					
						
							|  |  |  | 				parser, | 
					
						
							|  |  |  | 				valueCacheVersions, | 
					
						
							|  |  |  | 				key, | 
					
						
							|  |  |  | 				runtimeTemplate, | 
					
						
							|  |  |  | 				logger, | 
					
						
							|  |  |  | 				asiSafe, | 
					
						
							|  |  |  | 				objKeys | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (typeof code === "bigint") { | 
					
						
							|  |  |  | 			return runtimeTemplate.supportsBigIntLiteral() | 
					
						
							|  |  |  | 				? `${code}n` | 
					
						
							|  |  |  | 				: `BigInt("${code}")`; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return code + ""; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const strCode = transformToCode(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	logger.log(`Replaced "${key}" with "${strCode}"`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return strCode; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {CodeValue} code code | 
					
						
							|  |  |  |  * @returns {string | undefined} result | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | const toCacheVersion = code => { | 
					
						
							|  |  |  | 	if (code === null) { | 
					
						
							|  |  |  | 		return "null"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (code === undefined) { | 
					
						
							|  |  |  | 		return "undefined"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (Object.is(code, -0)) { | 
					
						
							|  |  |  | 		return "-0"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (code instanceof RuntimeValue) { | 
					
						
							|  |  |  | 		return code.getCacheVersion(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (code instanceof RegExp && code.toString) { | 
					
						
							|  |  |  | 		return code.toString(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (typeof code === "function" && code.toString) { | 
					
						
							|  |  |  | 		return "(" + code.toString() + ")"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (typeof code === "object") { | 
					
						
							|  |  |  | 		const items = Object.keys(code).map(key => ({ | 
					
						
							|  |  |  | 			key, | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 			value: toCacheVersion(/** @type {Record<string, any>} */ (code)[key]) | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 		})); | 
					
						
							|  |  |  | 		if (items.some(({ value }) => value === undefined)) return undefined; | 
					
						
							|  |  |  | 		return `{${items.map(({ key, value }) => `${key}: ${value}`).join(", ")}}`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (typeof code === "bigint") { | 
					
						
							|  |  |  | 		return `${code}n`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return code + ""; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | const PLUGIN_NAME = "DefinePlugin"; | 
					
						
							|  |  |  | const VALUE_DEP_PREFIX = `webpack/${PLUGIN_NAME} `; | 
					
						
							|  |  |  | const VALUE_DEP_MAIN = `webpack/${PLUGIN_NAME}_hash`; | 
					
						
							|  |  |  | const TYPEOF_OPERATOR_REGEXP = /^typeof\s+/; | 
					
						
							|  |  |  | const WEBPACK_REQUIRE_FUNCTION_REGEXP = /__webpack_require__\s*(!?\.)/; | 
					
						
							|  |  |  | const WEBPACK_REQUIRE_IDENTIFIER_REGEXP = /__webpack_require__/; | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 00:34:29 +08:00
										 |  |  | class DefinePlugin { | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Create a new define plugin | 
					
						
							| 
									
										
										
										
											2018-07-13 09:06:21 +08:00
										 |  |  | 	 * @param {Record<string, CodeValue>} definitions A map of global object definitions | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-12-31 00:34:29 +08:00
										 |  |  | 	constructor(definitions) { | 
					
						
							|  |  |  | 		this.definitions = definitions; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {function({ module: NormalModule, key: string, readonly version: string | undefined }): CodeValuePrimitive} fn generator function | 
					
						
							|  |  |  | 	 * @param {true | string[] | RuntimeValueOptions=} options options | 
					
						
							|  |  |  | 	 * @returns {RuntimeValue} runtime value | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	static runtimeValue(fn, options) { | 
					
						
							|  |  |  | 		return new RuntimeValue(fn, options); | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Apply the plugin | 
					
						
							| 
									
										
										
										
											2020-04-23 16:48:36 +08:00
										 |  |  | 	 * @param {Compiler} compiler the compiler instance | 
					
						
							| 
									
										
										
										
											2018-06-10 10:37:09 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2016-12-31 00:34:29 +08:00
										 |  |  | 	apply(compiler) { | 
					
						
							| 
									
										
										
										
											2017-02-05 07:22:33 +08:00
										 |  |  | 		const definitions = this.definitions; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		compiler.hooks.compilation.tap( | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 			PLUGIN_NAME, | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			(compilation, { normalModuleFactory }) => { | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 				const logger = compilation.getLogger("webpack.DefinePlugin"); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				compilation.dependencyTemplates.set( | 
					
						
							|  |  |  | 					ConstDependency, | 
					
						
							|  |  |  | 					new ConstDependency.Template() | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | 				const { runtimeTemplate } = compilation; | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 21:01:31 +08:00
										 |  |  | 				const mainHash = createHash(compilation.outputOptions.hashFunction); | 
					
						
							|  |  |  | 				mainHash.update( | 
					
						
							|  |  |  | 					/** @type {string} */ ( | 
					
						
							|  |  |  | 						compilation.valueCacheVersions.get(VALUE_DEP_MAIN) | 
					
						
							|  |  |  | 					) || "" | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2021-04-12 18:21:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 				/** | 
					
						
							|  |  |  | 				 * Handler | 
					
						
							| 
									
										
										
										
											2018-07-17 17:32:15 +08:00
										 |  |  | 				 * @param {JavascriptParser} parser Parser | 
					
						
							| 
									
										
										
										
											2018-06-10 10:37:09 +08:00
										 |  |  | 				 * @returns {void} | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 				 */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				const handler = parser => { | 
					
						
							| 
									
										
										
										
											2021-09-29 21:01:31 +08:00
										 |  |  | 					const mainValue = compilation.valueCacheVersions.get(VALUE_DEP_MAIN); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 					parser.hooks.program.tap(PLUGIN_NAME, () => { | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 						const buildInfo = /** @type {BuildInfo} */ ( | 
					
						
							|  |  |  | 							parser.state.module.buildInfo | 
					
						
							|  |  |  | 						); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						if (!buildInfo.valueDependencies) | 
					
						
							|  |  |  | 							buildInfo.valueDependencies = new Map(); | 
					
						
							| 
									
										
										
										
											2021-04-12 18:21:49 +08:00
										 |  |  | 						buildInfo.valueDependencies.set(VALUE_DEP_MAIN, mainValue); | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 					/** | 
					
						
							|  |  |  | 					 * @param {string} key key | 
					
						
							|  |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											2021-04-12 18:21:49 +08:00
										 |  |  | 					const addValueDependency = key => { | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 						const buildInfo = /** @type {BuildInfo} */ ( | 
					
						
							|  |  |  | 							parser.state.module.buildInfo | 
					
						
							|  |  |  | 						); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						buildInfo.valueDependencies.set( | 
					
						
							|  |  |  | 							VALUE_DEP_PREFIX + key, | 
					
						
							|  |  |  | 							compilation.valueCacheVersions.get(VALUE_DEP_PREFIX + key) | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 					const withValueDependency = | 
					
						
							|  |  |  | 						(key, fn) => | 
					
						
							|  |  |  | 						(...args) => { | 
					
						
							|  |  |  | 							addValueDependency(key); | 
					
						
							|  |  |  | 							return fn(...args); | 
					
						
							|  |  |  | 						}; | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-10 10:37:09 +08:00
										 |  |  | 					/** | 
					
						
							|  |  |  | 					 * Walk definitions | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 					 * @param {Record<string, CodeValue>} definitions Definitions map | 
					
						
							| 
									
										
										
										
											2018-06-10 10:37:09 +08:00
										 |  |  | 					 * @param {string} prefix Prefix string | 
					
						
							|  |  |  | 					 * @returns {void} | 
					
						
							|  |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					const walkDefinitions = (definitions, prefix) => { | 
					
						
							|  |  |  | 						Object.keys(definitions).forEach(key => { | 
					
						
							|  |  |  | 							const code = definitions[key]; | 
					
						
							|  |  |  | 							if ( | 
					
						
							|  |  |  | 								code && | 
					
						
							|  |  |  | 								typeof code === "object" && | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 								!(code instanceof RuntimeValue) && | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 								!(code instanceof RegExp) | 
					
						
							|  |  |  | 							) { | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 								walkDefinitions( | 
					
						
							|  |  |  | 									/** @type {Record<string, CodeValue>} */ (code), | 
					
						
							|  |  |  | 									prefix + key + "." | 
					
						
							|  |  |  | 								); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 								applyObjectDefine(prefix + key, code); | 
					
						
							|  |  |  | 								return; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 							applyDefineKey(prefix, key); | 
					
						
							|  |  |  | 							applyDefine(prefix + key, code); | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2015-07-13 06:20:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 					/** | 
					
						
							|  |  |  | 					 * Apply define key | 
					
						
							|  |  |  | 					 * @param {string} prefix Prefix | 
					
						
							|  |  |  | 					 * @param {string} key Key | 
					
						
							| 
									
										
										
										
											2018-06-10 10:37:09 +08:00
										 |  |  | 					 * @returns {void} | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					const applyDefineKey = (prefix, key) => { | 
					
						
							|  |  |  | 						const splittedKey = key.split("."); | 
					
						
							|  |  |  | 						splittedKey.slice(1).forEach((_, i) => { | 
					
						
							|  |  |  | 							const fullKey = prefix + splittedKey.slice(0, i + 1).join("."); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 							parser.hooks.canRename.for(fullKey).tap(PLUGIN_NAME, () => { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								addValueDependency(key); | 
					
						
							|  |  |  | 								return true; | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						}); | 
					
						
							|  |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2016-12-31 00:34:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 					/** | 
					
						
							|  |  |  | 					 * Apply Code | 
					
						
							|  |  |  | 					 * @param {string} key Key | 
					
						
							| 
									
										
										
										
											2018-06-23 05:17:55 +08:00
										 |  |  | 					 * @param {CodeValue} code Code | 
					
						
							| 
									
										
										
										
											2018-06-10 10:37:09 +08:00
										 |  |  | 					 * @returns {void} | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					const applyDefine = (key, code) => { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						const originalKey = key; | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 						const isTypeof = TYPEOF_OPERATOR_REGEXP.test(key); | 
					
						
							|  |  |  | 						if (isTypeof) key = key.replace(TYPEOF_OPERATOR_REGEXP, ""); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						let recurse = false; | 
					
						
							|  |  |  | 						let recurseTypeof = false; | 
					
						
							|  |  |  | 						if (!isTypeof) { | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 							parser.hooks.canRename.for(key).tap(PLUGIN_NAME, () => { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								addValueDependency(originalKey); | 
					
						
							|  |  |  | 								return true; | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							parser.hooks.evaluateIdentifier | 
					
						
							|  |  |  | 								.for(key) | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 								.tap(PLUGIN_NAME, expr => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 									/** | 
					
						
							|  |  |  | 									 * this is needed in case there is a recursion in the DefinePlugin | 
					
						
							|  |  |  | 									 * to prevent an endless recursion | 
					
						
							|  |  |  | 									 * e.g.: new DefinePlugin({ | 
					
						
							|  |  |  | 									 * "a": "b", | 
					
						
							|  |  |  | 									 * "b": "a" | 
					
						
							|  |  |  | 									 * }); | 
					
						
							|  |  |  | 									 */ | 
					
						
							|  |  |  | 									if (recurse) return; | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 									addValueDependency(originalKey); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 									recurse = true; | 
					
						
							| 
									
										
										
										
											2020-03-02 19:09:54 +08:00
										 |  |  | 									const res = parser.evaluate( | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 										toCode( | 
					
						
							|  |  |  | 											code, | 
					
						
							|  |  |  | 											parser, | 
					
						
							|  |  |  | 											compilation.valueCacheVersions, | 
					
						
							|  |  |  | 											key, | 
					
						
							|  |  |  | 											runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 											logger, | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 											null | 
					
						
							|  |  |  | 										) | 
					
						
							| 
									
										
										
										
											2020-03-02 19:09:54 +08:00
										 |  |  | 									); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 									recurse = false; | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 									res.setRange(/** @type {Range} */ (expr.range)); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 									return res; | 
					
						
							|  |  |  | 								}); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 							parser.hooks.expression.for(key).tap(PLUGIN_NAME, expr => { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								addValueDependency(originalKey); | 
					
						
							| 
									
										
										
										
											2023-05-20 17:02:09 +08:00
										 |  |  | 								let strCode = toCode( | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 									code, | 
					
						
							|  |  |  | 									parser, | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 									compilation.valueCacheVersions, | 
					
						
							|  |  |  | 									originalKey, | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | 									runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 									logger, | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 									!parser.isAsiPosition(/** @type {Range} */ (expr.range)[0]), | 
					
						
							| 
									
										
										
										
											2023-04-09 15:44:09 +08:00
										 |  |  | 									parser.destructuringAssignmentPropertiesFor(expr) | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 								); | 
					
						
							| 
									
										
										
										
											2023-05-20 17:02:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 								if (parser.scope.inShorthand) { | 
					
						
							|  |  |  | 									strCode = parser.scope.inShorthand + ":" + strCode; | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 								if (WEBPACK_REQUIRE_FUNCTION_REGEXP.test(strCode)) { | 
					
						
							| 
									
										
										
										
											2018-11-06 02:03:12 +08:00
										 |  |  | 									return toConstantDependency(parser, strCode, [ | 
					
						
							|  |  |  | 										RuntimeGlobals.require | 
					
						
							|  |  |  | 									])(expr); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 								} else if (WEBPACK_REQUIRE_IDENTIFIER_REGEXP.test(strCode)) { | 
					
						
							| 
									
										
										
										
											2019-09-30 16:08:08 +08:00
										 |  |  | 									return toConstantDependency(parser, strCode, [ | 
					
						
							|  |  |  | 										RuntimeGlobals.requireScope | 
					
						
							|  |  |  | 									])(expr); | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 								} else { | 
					
						
							| 
									
										
										
										
											2018-07-05 04:08:31 +08:00
										 |  |  | 									return toConstantDependency(parser, strCode)(expr); | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 								} | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 						parser.hooks.evaluateTypeof.for(key).tap(PLUGIN_NAME, expr => { | 
					
						
							| 
									
										
										
										
											2017-02-06 19:51:26 +08:00
										 |  |  | 							/** | 
					
						
							|  |  |  | 							 * this is needed in case there is a recursion in the DefinePlugin | 
					
						
							|  |  |  | 							 * to prevent an endless recursion | 
					
						
							|  |  |  | 							 * e.g.: new DefinePlugin({ | 
					
						
							| 
									
										
										
										
											2018-02-26 10:49:41 +08:00
										 |  |  | 							 * "typeof a": "typeof b", | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							 * "typeof b": "typeof a" | 
					
						
							| 
									
										
										
										
											2017-02-06 19:51:26 +08:00
										 |  |  | 							 * }); | 
					
						
							|  |  |  | 							 */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							if (recurseTypeof) return; | 
					
						
							|  |  |  | 							recurseTypeof = true; | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 							addValueDependency(originalKey); | 
					
						
							|  |  |  | 							const codeCode = toCode( | 
					
						
							|  |  |  | 								code, | 
					
						
							|  |  |  | 								parser, | 
					
						
							|  |  |  | 								compilation.valueCacheVersions, | 
					
						
							|  |  |  | 								originalKey, | 
					
						
							|  |  |  | 								runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 								logger, | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								null | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 							const typeofCode = isTypeof | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								? codeCode | 
					
						
							|  |  |  | 								: "typeof (" + codeCode + ")"; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							const res = parser.evaluate(typeofCode); | 
					
						
							|  |  |  | 							recurseTypeof = false; | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 							res.setRange(/** @type {Range} */ (expr.range)); | 
					
						
							| 
									
										
										
										
											2016-12-31 00:34:29 +08:00
										 |  |  | 							return res; | 
					
						
							|  |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 						parser.hooks.typeof.for(key).tap(PLUGIN_NAME, expr => { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 							addValueDependency(originalKey); | 
					
						
							|  |  |  | 							const codeCode = toCode( | 
					
						
							|  |  |  | 								code, | 
					
						
							|  |  |  | 								parser, | 
					
						
							|  |  |  | 								compilation.valueCacheVersions, | 
					
						
							|  |  |  | 								originalKey, | 
					
						
							|  |  |  | 								runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 								logger, | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								null | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 							const typeofCode = isTypeof | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								? codeCode | 
					
						
							|  |  |  | 								: "typeof (" + codeCode + ")"; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							const res = parser.evaluate(typeofCode); | 
					
						
							|  |  |  | 							if (!res.isString()) return; | 
					
						
							| 
									
										
										
										
											2018-07-03 16:24:29 +08:00
										 |  |  | 							return toConstantDependency( | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 								parser, | 
					
						
							|  |  |  | 								JSON.stringify(res.string) | 
					
						
							|  |  |  | 							).bind(parser)(expr); | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2016-09-14 18:04:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 					/** | 
					
						
							|  |  |  | 					 * Apply Object | 
					
						
							|  |  |  | 					 * @param {string} key Key | 
					
						
							|  |  |  | 					 * @param {Object} obj Object | 
					
						
							| 
									
										
										
										
											2018-06-10 10:37:09 +08:00
										 |  |  | 					 * @returns {void} | 
					
						
							| 
									
										
										
										
											2018-05-20 15:32:59 +08:00
										 |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					const applyObjectDefine = (key, obj) => { | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 						parser.hooks.canRename.for(key).tap(PLUGIN_NAME, () => { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 							addValueDependency(key); | 
					
						
							|  |  |  | 							return true; | 
					
						
							|  |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 						parser.hooks.evaluateIdentifier.for(key).tap(PLUGIN_NAME, expr => { | 
					
						
							|  |  |  | 							addValueDependency(key); | 
					
						
							|  |  |  | 							return new BasicEvaluatedExpression() | 
					
						
							|  |  |  | 								.setTruthy() | 
					
						
							|  |  |  | 								.setSideEffects(false) | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 								.setRange(/** @type {Range} */ (expr.range)); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						parser.hooks.evaluateTypeof | 
					
						
							|  |  |  | 							.for(key) | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 							.tap( | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 								PLUGIN_NAME, | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								withValueDependency(key, evaluateToString("object")) | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 						parser.hooks.expression.for(key).tap(PLUGIN_NAME, expr => { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 							addValueDependency(key); | 
					
						
							| 
									
										
										
										
											2023-05-20 17:02:09 +08:00
										 |  |  | 							let strCode = stringifyObj( | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 								obj, | 
					
						
							|  |  |  | 								parser, | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								compilation.valueCacheVersions, | 
					
						
							|  |  |  | 								key, | 
					
						
							| 
									
										
										
										
											2020-09-09 22:37:53 +08:00
										 |  |  | 								runtimeTemplate, | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 								logger, | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 								!parser.isAsiPosition(/** @type {Range} */ (expr.range)[0]), | 
					
						
							| 
									
										
										
										
											2023-04-09 15:44:09 +08:00
										 |  |  | 								parser.destructuringAssignmentPropertiesFor(expr) | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-20 17:02:09 +08:00
										 |  |  | 							if (parser.scope.inShorthand) { | 
					
						
							|  |  |  | 								strCode = parser.scope.inShorthand + ":" + strCode; | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 							if (WEBPACK_REQUIRE_FUNCTION_REGEXP.test(strCode)) { | 
					
						
							| 
									
										
										
										
											2018-11-06 02:03:12 +08:00
										 |  |  | 								return toConstantDependency(parser, strCode, [ | 
					
						
							|  |  |  | 									RuntimeGlobals.require | 
					
						
							|  |  |  | 								])(expr); | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 							} else if (WEBPACK_REQUIRE_IDENTIFIER_REGEXP.test(strCode)) { | 
					
						
							| 
									
										
										
										
											2019-09-30 16:08:08 +08:00
										 |  |  | 								return toConstantDependency(parser, strCode, [ | 
					
						
							|  |  |  | 									RuntimeGlobals.requireScope | 
					
						
							|  |  |  | 								])(expr); | 
					
						
							| 
									
										
										
										
											2018-07-05 04:08:31 +08:00
										 |  |  | 							} else { | 
					
						
							|  |  |  | 								return toConstantDependency(parser, strCode)(expr); | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 							} | 
					
						
							|  |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						parser.hooks.typeof | 
					
						
							|  |  |  | 							.for(key) | 
					
						
							|  |  |  | 							.tap( | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 								PLUGIN_NAME, | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								withValueDependency( | 
					
						
							|  |  |  | 									key, | 
					
						
							|  |  |  | 									toConstantDependency(parser, JSON.stringify("object")) | 
					
						
							|  |  |  | 								) | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							); | 
					
						
							|  |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					walkDefinitions(definitions, ""); | 
					
						
							|  |  |  | 				}; | 
					
						
							| 
									
										
										
										
											2017-12-14 17:22:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				normalModuleFactory.hooks.parser | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 					.for(JAVASCRIPT_MODULE_TYPE_AUTO) | 
					
						
							|  |  |  | 					.tap(PLUGIN_NAME, handler); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				normalModuleFactory.hooks.parser | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC) | 
					
						
							|  |  |  | 					.tap(PLUGIN_NAME, handler); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				normalModuleFactory.hooks.parser | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 					.for(JAVASCRIPT_MODULE_TYPE_ESM) | 
					
						
							|  |  |  | 					.tap(PLUGIN_NAME, handler); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				/** | 
					
						
							|  |  |  | 				 * Walk definitions | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 				 * @param {Record<string, CodeValue>} definitions Definitions map | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 				 * @param {string} prefix Prefix string | 
					
						
							|  |  |  | 				 * @returns {void} | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				const walkDefinitionsForValues = (definitions, prefix) => { | 
					
						
							|  |  |  | 					Object.keys(definitions).forEach(key => { | 
					
						
							|  |  |  | 						const code = definitions[key]; | 
					
						
							|  |  |  | 						const version = toCacheVersion(code); | 
					
						
							|  |  |  | 						const name = VALUE_DEP_PREFIX + prefix + key; | 
					
						
							| 
									
										
										
										
											2021-09-29 21:01:31 +08:00
										 |  |  | 						mainHash.update("|" + prefix + key); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						const oldVersion = compilation.valueCacheVersions.get(name); | 
					
						
							|  |  |  | 						if (oldVersion === undefined) { | 
					
						
							|  |  |  | 							compilation.valueCacheVersions.set(name, version); | 
					
						
							|  |  |  | 						} else if (oldVersion !== version) { | 
					
						
							|  |  |  | 							const warning = new WebpackError( | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | 								`${PLUGIN_NAME}\nConflicting values for '${prefix + key}'` | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 							); | 
					
						
							|  |  |  | 							warning.details = `'${oldVersion}' !== '${version}'`; | 
					
						
							|  |  |  | 							warning.hideStack = true; | 
					
						
							|  |  |  | 							compilation.warnings.push(warning); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						if ( | 
					
						
							|  |  |  | 							code && | 
					
						
							|  |  |  | 							typeof code === "object" && | 
					
						
							|  |  |  | 							!(code instanceof RuntimeValue) && | 
					
						
							|  |  |  | 							!(code instanceof RegExp) | 
					
						
							|  |  |  | 						) { | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 							walkDefinitionsForValues( | 
					
						
							|  |  |  | 								/** @type {Record<string, CodeValue>} */ (code), | 
					
						
							|  |  |  | 								prefix + key + "." | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				walkDefinitionsForValues(definitions, ""); | 
					
						
							| 
									
										
										
										
											2021-09-29 21:01:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				compilation.valueCacheVersions.set( | 
					
						
							|  |  |  | 					VALUE_DEP_MAIN, | 
					
						
							|  |  |  | 					/** @type {string} */ (mainHash.digest("hex").slice(0, 8)) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2016-12-31 00:34:29 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = DefinePlugin; |