| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2025-07-03 17:06:45 +08:00
										 |  |  | 	JAVASCRIPT_MODULE_TYPE_DYNAMIC, | 
					
						
							|  |  |  | 	JAVASCRIPT_MODULE_TYPE_ESM | 
					
						
							| 
									
										
										
										
											2023-04-01 00:26:38 +08:00
										 |  |  | } = 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"); | 
					
						
							| 
									
										
										
										
											2024-12-04 16:56:05 +08:00
										 |  |  | const { VariableInfo } = require("./javascript/JavascriptParser"); | 
					
						
							| 
									
										
										
										
											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 */ | 
					
						
							| 
									
										
										
										
											2025-04-26 01:43:01 +08:00
										 |  |  | /** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */ | 
					
						
							| 
									
										
										
										
											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 */ | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | /** @typedef {import("./Module").ValueCacheVersions} ValueCacheVersions */ | 
					
						
							| 
									
										
										
										
											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-04-13 02:40:28 +08:00
										 |  |  | /** @typedef {import("./javascript/JavascriptParser").DestructuringAssignmentProperty} DestructuringAssignmentProperty */ | 
					
						
							| 
									
										
										
										
											2024-04-13 02:52:37 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-14 00:34:04 +08:00
										 |  |  | /** @typedef {null | undefined | RegExp | EXPECTED_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
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  |  * @typedef {object} RuntimeValueOptions | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  |  * @property {string[]=} fileDependencies | 
					
						
							|  |  |  |  * @property {string[]=} contextDependencies | 
					
						
							|  |  |  |  * @property {string[]=} missingDependencies | 
					
						
							|  |  |  |  * @property {string[]=} buildDependencies | 
					
						
							| 
									
										
										
										
											2025-03-12 09:56:14 +08:00
										 |  |  |  * @property {string| (() => string)=} version | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | /** @typedef {string | Set<string>} ValueCacheVersion */ | 
					
						
							| 
									
										
										
										
											2025-03-12 09:56:14 +08:00
										 |  |  | /** @typedef {(value: { module: NormalModule, key: string, readonly version: ValueCacheVersion }) => CodeValuePrimitive} GeneratorFn */ | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | class RuntimeValue { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 	 * @param {GeneratorFn} fn generator function | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	 * @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 | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 	 * @param {ValueCacheVersions} 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) { | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					/** @type {NonNullable<BuildInfo["fileDependencies"]>} */ | 
					
						
							|  |  |  | 					(buildInfo.fileDependencies).add(dep); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (this.options.contextDependencies) { | 
					
						
							|  |  |  | 				for (const dep of this.options.contextDependencies) { | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					/** @type {NonNullable<BuildInfo["contextDependencies"]>} */ | 
					
						
							|  |  |  | 					(buildInfo.contextDependencies).add(dep); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (this.options.missingDependencies) { | 
					
						
							|  |  |  | 				for (const dep of this.options.missingDependencies) { | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					/** @type {NonNullable<BuildInfo["missingDependencies"]>} */ | 
					
						
							|  |  |  | 					(buildInfo.missingDependencies).add(dep); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (this.options.buildDependencies) { | 
					
						
							|  |  |  | 				for (const dep of this.options.buildDependencies) { | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					/** @type {NonNullable<BuildInfo["buildDependencies"]>} */ | 
					
						
							|  |  |  | 					(buildInfo.buildDependencies).add(dep); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											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() { | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 				return /** @type {ValueCacheVersion} */ ( | 
					
						
							|  |  |  | 					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
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-13 02:40:28 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {Set<DestructuringAssignmentProperty> | undefined} properties properties | 
					
						
							|  |  |  |  * @returns {Set<string> | undefined} used keys | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function getObjKeys(properties) { | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 	if (!properties) return; | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 	return new Set([...properties].map((p) => p.id)); | 
					
						
							| 
									
										
										
										
											2024-04-13 02:40:28 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | /** @typedef {Set<string> | null} ObjKeys */ | 
					
						
							|  |  |  | /** @typedef {boolean | undefined | null} AsiSafe */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  |  * @param {EXPECTED_ANY[] | {[k: string]: EXPECTED_ANY}} obj obj | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  |  * @param {JavascriptParser} parser Parser | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  |  * @param {ValueCacheVersions} 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 | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  |  * @param {AsiSafe=} asiSafe asi safe (undefined: unknown, null: unneeded) | 
					
						
							|  |  |  |  * @param {ObjKeys=} 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; | 
					
						
							| 
									
										
										
										
											2024-07-31 04:09:42 +08:00
										 |  |  | 	const arr = Array.isArray(obj); | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 	if (arr) { | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 		code = `[${obj | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 			.map((code) => | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 				toCode( | 
					
						
							|  |  |  | 					code, | 
					
						
							|  |  |  | 					parser, | 
					
						
							|  |  |  | 					valueCacheVersions, | 
					
						
							|  |  |  | 					key, | 
					
						
							|  |  |  | 					runtimeTemplate, | 
					
						
							|  |  |  | 					logger, | 
					
						
							|  |  |  | 					null | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 				) | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +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) { | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 			keys = objKeys.size === 0 ? [] : keys.filter((k) => objKeys.has(k)); | 
					
						
							| 
									
										
										
										
											2023-04-08 03:29:32 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		code = `{${keys | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 			.map((key) => { | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 				const code = obj[key]; | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 				return `${JSON.stringify(key)}:${toCode( | 
					
						
							|  |  |  | 					code, | 
					
						
							|  |  |  | 					parser, | 
					
						
							|  |  |  | 					valueCacheVersions, | 
					
						
							|  |  |  | 					key, | 
					
						
							|  |  |  | 					runtimeTemplate, | 
					
						
							|  |  |  | 					logger, | 
					
						
							|  |  |  | 					null | 
					
						
							|  |  |  | 				)}`;
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  |  * @param {ValueCacheVersions} 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 | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  |  * @param {boolean | undefined | null=} asiSafe asi safe (undefined: unknown, null: unneeded) | 
					
						
							|  |  |  |  * @param {ObjKeys=} 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) { | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 			return `(${code.toString()})`; | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		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}")`; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 		return `${code}`; | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const strCode = transformToCode(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-20 02:46:07 +08:00
										 |  |  | 	logger.debug(`Replaced "${key}" with "${strCode}"`); | 
					
						
							| 
									
										
										
										
											2023-04-24 02:42:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	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 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | const toCacheVersion = (code) => { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	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) { | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 		return `(${code.toString()})`; | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if (typeof code === "object") { | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 		const items = Object.keys(code).map((key) => ({ | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 			key, | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 			value: toCacheVersion( | 
					
						
							|  |  |  | 				/** @type {Record<string, EXPECTED_ANY>} */ | 
					
						
							|  |  |  | 				(code)[key] | 
					
						
							|  |  |  | 			) | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 		})); | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 		if (items.some(({ value }) => value === undefined)) return; | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 		return `{${items.map(({ key, value }) => `${key}: ${value}`).join(", ")}}`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (typeof code === "bigint") { | 
					
						
							|  |  |  | 		return `${code}n`; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 	return `${code}`; | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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+/; | 
					
						
							| 
									
										
										
										
											2024-02-27 23:19:53 +08:00
										 |  |  | const WEBPACK_REQUIRE_FUNCTION_REGEXP = new RegExp( | 
					
						
							| 
									
										
										
										
											2024-02-28 00:05:14 +08:00
										 |  |  | 	`${RuntimeGlobals.require}\\s*(!?\\.)` | 
					
						
							| 
									
										
										
										
											2024-02-27 19:14:15 +08:00
										 |  |  | ); | 
					
						
							| 
									
										
										
										
											2024-02-27 23:19:53 +08:00
										 |  |  | const WEBPACK_REQUIRE_IDENTIFIER_REGEXP = new RegExp(RuntimeGlobals.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
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 	 * @param {GeneratorFn} fn generator function | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 	 * @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; | 
					
						
							| 
									
										
										
										
											2025-07-03 19:16:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/** | 
					
						
							|  |  |  | 		 * @type {Map<string, Set<string>>} | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		const finalByNestedKey = new Map(); | 
					
						
							|  |  |  | 		/** | 
					
						
							|  |  |  | 		 * @type {Map<string, Set<string>>} | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		const nestedByFinalKey = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 				const mainHash = createHash( | 
					
						
							| 
									
										
										
										
											2025-04-26 01:43:01 +08:00
										 |  |  | 					/** @type {HashFunction} */ | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					(compilation.outputOptions.hashFunction) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2021-09-29 21:01:31 +08:00
										 |  |  | 				mainHash.update( | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					/** @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
										 |  |  | 				 */ | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 				const handler = (parser) => { | 
					
						
							| 
									
										
										
										
											2025-07-03 19:16:40 +08:00
										 |  |  | 					const hooked = new Set(); | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 					const mainValue = | 
					
						
							|  |  |  | 						/** @type {ValueCacheVersion} */ | 
					
						
							|  |  |  | 						(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 | 
					
						
							|  |  |  | 						); | 
					
						
							| 
									
										
										
										
											2025-07-02 20:10:54 +08:00
										 |  |  | 						if (!buildInfo.valueDependencies) { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 							buildInfo.valueDependencies = new Map(); | 
					
						
							| 
									
										
										
										
											2025-07-02 20:10:54 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 					const addValueDependency = (key) => { | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 						const buildInfo = | 
					
						
							|  |  |  | 							/** @type {BuildInfo} */ | 
					
						
							|  |  |  | 							(parser.state.module.buildInfo); | 
					
						
							|  |  |  | 						/** @type {NonNullable<BuildInfo["valueDependencies"]>} */ | 
					
						
							|  |  |  | 						(buildInfo.valueDependencies).set( | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 							VALUE_DEP_PREFIX + key, | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 							/** @type {ValueCacheVersion} */ | 
					
						
							|  |  |  | 							(compilation.valueCacheVersions.get(VALUE_DEP_PREFIX + key)) | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						); | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					/** | 
					
						
							| 
									
										
										
										
											2025-03-14 00:34:04 +08:00
										 |  |  | 					 * @template T | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					 * @param {string} key key | 
					
						
							| 
									
										
										
										
											2025-03-14 00:34:04 +08:00
										 |  |  | 					 * @param {(expression: Expression) => T} fn fn | 
					
						
							|  |  |  | 					 * @returns {(expression: Expression) => T} result | 
					
						
							| 
									
										
										
										
											2024-08-09 23:42:37 +08:00
										 |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											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) => { | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 						for (const key of Object.keys(definitions)) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							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), | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 									`${prefix + key}.` | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 								); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 								applyObjectDefine(prefix + key, code); | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 								continue; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							} | 
					
						
							|  |  |  | 							applyDefineKey(prefix, key); | 
					
						
							|  |  |  | 							applyDefine(prefix + key, code); | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					}; | 
					
						
							| 
									
										
										
										
											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("."); | 
					
						
							| 
									
										
										
										
											2024-12-04 16:56:05 +08:00
										 |  |  | 						const firstKey = splittedKey[0]; | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 						for (const [i, _] of splittedKey.slice(1).entries()) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 							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); | 
					
						
							| 
									
										
										
										
											2024-12-04 16:56:05 +08:00
										 |  |  | 								if ( | 
					
						
							|  |  |  | 									parser.scope.definitions.get(firstKey) instanceof VariableInfo | 
					
						
							|  |  |  | 								) { | 
					
						
							|  |  |  | 									return false; | 
					
						
							|  |  |  | 								} | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 								return true; | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2025-07-03 19:16:40 +08:00
										 |  |  | 						if (prefix === "") { | 
					
						
							|  |  |  | 							const final = splittedKey[splittedKey.length - 1]; | 
					
						
							|  |  |  | 							const nestedSet = nestedByFinalKey.get(final); | 
					
						
							|  |  |  | 							if (!nestedSet || nestedSet.size <= 0) return; | 
					
						
							|  |  |  | 							for (const nested of /** @type {Set<string>} */ (nestedSet)) { | 
					
						
							|  |  |  | 								if (nested && !hooked.has(nested)) { | 
					
						
							|  |  |  | 									// only detect the same nested key once
 | 
					
						
							|  |  |  | 									hooked.add(nested); | 
					
						
							|  |  |  | 									parser.hooks.expression.for(nested).tap( | 
					
						
							|  |  |  | 										{ | 
					
						
							|  |  |  | 											name: PLUGIN_NAME, | 
					
						
							|  |  |  | 											// why 100? Ensures it runs after object define
 | 
					
						
							|  |  |  | 											stage: 100 | 
					
						
							|  |  |  | 										}, | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 										(expr) => { | 
					
						
							| 
									
										
										
										
											2025-07-03 19:16:40 +08:00
										 |  |  | 											const destructed = | 
					
						
							|  |  |  | 												parser.destructuringAssignmentPropertiesFor(expr); | 
					
						
							|  |  |  | 											if (destructed === undefined) { | 
					
						
							|  |  |  | 												return; | 
					
						
							|  |  |  | 											} | 
					
						
							|  |  |  | 											/** @type {Record<string, CodeValue>} */ | 
					
						
							|  |  |  | 											const obj = {}; | 
					
						
							|  |  |  | 											const finalSet = finalByNestedKey.get(nested); | 
					
						
							|  |  |  | 											for (const { id } of destructed) { | 
					
						
							|  |  |  | 												const fullKey = `${nested}.${id}`; | 
					
						
							|  |  |  | 												if ( | 
					
						
							|  |  |  | 													!finalSet || | 
					
						
							|  |  |  | 													!finalSet.has(id) || | 
					
						
							|  |  |  | 													!definitions[fullKey] | 
					
						
							|  |  |  | 												) { | 
					
						
							|  |  |  | 													return; | 
					
						
							|  |  |  | 												} | 
					
						
							|  |  |  | 												obj[id] = definitions[fullKey]; | 
					
						
							|  |  |  | 											} | 
					
						
							|  |  |  | 											let strCode = stringifyObj( | 
					
						
							|  |  |  | 												obj, | 
					
						
							|  |  |  | 												parser, | 
					
						
							|  |  |  | 												compilation.valueCacheVersions, | 
					
						
							|  |  |  | 												key, | 
					
						
							|  |  |  | 												runtimeTemplate, | 
					
						
							|  |  |  | 												logger, | 
					
						
							|  |  |  | 												!parser.isAsiPosition( | 
					
						
							|  |  |  | 													/** @type {Range} */ (expr.range)[0] | 
					
						
							|  |  |  | 												), | 
					
						
							|  |  |  | 												getObjKeys(destructed) | 
					
						
							|  |  |  | 											); | 
					
						
							|  |  |  | 											if (parser.scope.inShorthand) { | 
					
						
							|  |  |  | 												strCode = `${parser.scope.inShorthand}:${strCode}`; | 
					
						
							|  |  |  | 											} | 
					
						
							|  |  |  | 											return toConstantDependency(parser, strCode)(expr); | 
					
						
							|  |  |  | 										} | 
					
						
							|  |  |  | 									); | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +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; | 
					
						
							|  |  |  | 								}); | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +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]), | 
					
						
							| 
									
										
										
										
											2024-06-06 01:15:03 +08:00
										 |  |  | 									null | 
					
						
							| 
									
										
										
										
											2020-08-29 00:46:56 +08:00
										 |  |  | 								); | 
					
						
							| 
									
										
										
										
											2023-05-20 17:02:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 								if (parser.scope.inShorthand) { | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 									strCode = `${parser.scope.inShorthand}:${strCode}`; | 
					
						
							| 
									
										
										
										
											2023-05-20 17:02:09 +08:00
										 |  |  | 								} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 								} | 
					
						
							| 
									
										
										
										
											2024-07-31 04:21:27 +08:00
										 |  |  | 								return toConstantDependency(parser, strCode)(expr); | 
					
						
							| 
									
										
										
										
											2018-03-19 11:20:44 +08:00
										 |  |  | 							}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +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 | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 							const typeofCode = isTypeof ? 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; | 
					
						
							|  |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +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 | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 							const typeofCode = isTypeof ? 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 | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  | 					 * @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; | 
					
						
							|  |  |  | 						}); | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 						parser.hooks.evaluateIdentifier | 
					
						
							|  |  |  | 							.for(key) | 
					
						
							|  |  |  | 							.tap(PLUGIN_NAME, (expr) => { | 
					
						
							|  |  |  | 								addValueDependency(key); | 
					
						
							|  |  |  | 								return new BasicEvaluatedExpression() | 
					
						
							|  |  |  | 									.setTruthy() | 
					
						
							|  |  |  | 									.setSideEffects(false) | 
					
						
							|  |  |  | 									.setRange(/** @type {Range} */ (expr.range)); | 
					
						
							|  |  |  | 							}); | 
					
						
							| 
									
										
										
										
											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")) | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +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]), | 
					
						
							| 
									
										
										
										
											2024-04-13 02:40:28 +08:00
										 |  |  | 								getObjKeys(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) { | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 								strCode = `${parser.scope.inShorthand}:${strCode}`; | 
					
						
							| 
									
										
										
										
											2023-05-20 17:02:09 +08:00
										 |  |  | 							} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 							} | 
					
						
							| 
									
										
										
										
											2024-07-31 04:21:27 +08:00
										 |  |  | 							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) => { | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 					for (const key of Object.keys(definitions)) { | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						const code = definitions[key]; | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | 						const version = /** @type {string} */ (toCacheVersion(code)); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						const name = VALUE_DEP_PREFIX + prefix + key; | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +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), | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 								`${prefix + key}.` | 
					
						
							| 
									
										
										
										
											2024-01-27 00:17:45 +08:00
										 |  |  | 							); | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2024-08-02 02:36:27 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2021-03-15 21:28:49 +08:00
										 |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-03 19:16:40 +08:00
										 |  |  | 				/** | 
					
						
							|  |  |  | 				 * @param {Record<string, CodeValue>} definitions Definitions map | 
					
						
							|  |  |  | 				 * @returns {void} | 
					
						
							|  |  |  | 				 */ | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 				const walkDefinitionsForKeys = (definitions) => { | 
					
						
							| 
									
										
										
										
											2025-07-03 19:16:40 +08:00
										 |  |  | 					/** | 
					
						
							|  |  |  | 					 * @param {Map<string, Set<string>>} map Map | 
					
						
							|  |  |  | 					 * @param {string} key key | 
					
						
							|  |  |  | 					 * @param {string} value v | 
					
						
							|  |  |  | 					 * @returns {void} | 
					
						
							|  |  |  | 					 */ | 
					
						
							|  |  |  | 					const addToMap = (map, key, value) => { | 
					
						
							|  |  |  | 						if (map.has(key)) { | 
					
						
							|  |  |  | 							/** @type {Set<string>} */ | 
					
						
							|  |  |  | 							(map.get(key)).add(value); | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							map.set(key, new Set([value])); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}; | 
					
						
							|  |  |  | 					for (const key of Object.keys(definitions)) { | 
					
						
							|  |  |  | 						const code = definitions[key]; | 
					
						
							|  |  |  | 						if ( | 
					
						
							|  |  |  | 							!code || | 
					
						
							|  |  |  | 							typeof code === "object" || | 
					
						
							|  |  |  | 							TYPEOF_OPERATOR_REGEXP.test(key) | 
					
						
							|  |  |  | 						) { | 
					
						
							|  |  |  | 							continue; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						const idx = key.lastIndexOf("."); | 
					
						
							|  |  |  | 						if (idx <= 0 || idx >= key.length - 1) { | 
					
						
							|  |  |  | 							continue; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						const nested = key.slice(0, idx); | 
					
						
							|  |  |  | 						const final = key.slice(idx + 1); | 
					
						
							|  |  |  | 						addToMap(finalByNestedKey, nested, final); | 
					
						
							|  |  |  | 						addToMap(nestedByFinalKey, final, nested); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				walkDefinitionsForKeys(definitions); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2025-07-02 20:10:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-31 00:34:29 +08:00
										 |  |  | module.exports = DefinePlugin; |