| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Jason Anderson @diurnalist | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-06 23:11:30 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-01 22:47:32 +08:00
										 |  |  | const mime = require("mime-types"); | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | const { basename, extname } = require("path"); | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | const util = require("util"); | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | const Chunk = require("./Chunk"); | 
					
						
							| 
									
										
										
										
											2018-08-23 01:23:48 +08:00
										 |  |  | const Module = require("./Module"); | 
					
						
							| 
									
										
										
										
											2020-07-16 14:01:22 +08:00
										 |  |  | const { parseResource } = require("./util/identifier"); | 
					
						
							| 
									
										
										
										
											2018-08-23 01:23:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | /** @typedef {import("./ChunkGraph")} ChunkGraph */ | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | /** @typedef {import("./Compilation").AssetInfo} AssetInfo */ | 
					
						
							| 
									
										
										
										
											2018-08-23 01:23:48 +08:00
										 |  |  | /** @typedef {import("./Compilation").PathData} PathData */ | 
					
						
							| 
									
										
										
										
											2018-11-03 04:05:46 +08:00
										 |  |  | /** @typedef {import("./Compiler")} Compiler */ | 
					
						
							| 
									
										
										
										
											2018-08-23 01:23:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | const REGEXP = /\[\\*([\w:]+)\\*\]/gi; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {string | number} id id | 
					
						
							|  |  |  |  * @returns {string | number} result | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-09-06 03:20:22 +08:00
										 |  |  | const prepareId = id => { | 
					
						
							|  |  |  | 	if (typeof id !== "string") return id; | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 03:20:22 +08:00
										 |  |  | 	if (/^"\s\+*.*\+\s*"$/.test(id)) { | 
					
						
							|  |  |  | 		const match = /^"\s\+*\s*(.*)\s*\+\s*"$/.exec(id); | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | 		return `" + (${/** @type {string[]} */ (match)[1]} + "").replace(/(^[.-]|[^a-zA-Z0-9_-])+/g, "_") + "`; | 
					
						
							| 
									
										
										
										
											2018-09-06 03:20:22 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 03:20:22 +08:00
										 |  |  | 	return id.replace(/(^[.-]|[^a-zA-Z0-9_-])+/g, "_"); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | const hashLength = (replacer, handler, assetInfo, hashName) => { | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 	const fn = (match, arg, input) => { | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | 		let result; | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 		const length = arg && parseInt(arg, 10); | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (length && handler) { | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | 			result = handler(length); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			const hash = replacer(match, arg, input); | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | 			result = length ? hash.slice(0, length) : hash; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (assetInfo) { | 
					
						
							|  |  |  | 			assetInfo.immutable = true; | 
					
						
							|  |  |  | 			if (Array.isArray(assetInfo[hashName])) { | 
					
						
							|  |  |  | 				assetInfo[hashName] = [...assetInfo[hashName], result]; | 
					
						
							|  |  |  | 			} else if (assetInfo[hashName]) { | 
					
						
							|  |  |  | 				assetInfo[hashName] = [assetInfo[hashName], result]; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				assetInfo[hashName] = result; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return result; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 03:49:41 +08:00
										 |  |  | 	return fn; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | const replacer = (value, allowEmpty) => { | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 	const fn = (match, arg, input) => { | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		if (typeof value === "function") { | 
					
						
							|  |  |  | 			value = value(); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (value === null || value === undefined) { | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			if (!allowEmpty) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				throw new Error( | 
					
						
							|  |  |  | 					`Path variable ${match} not implemented in this context: ${input}` | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 			return ""; | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2017-01-06 23:11:30 +08:00
										 |  |  | 			return `${value}`; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-09 03:49:41 +08:00
										 |  |  | 	return fn; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | const deprecationCache = new Map(); | 
					
						
							| 
									
										
										
										
											2018-11-30 18:19:14 +08:00
										 |  |  | const deprecatedFunction = (() => () => {})(); | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | const deprecated = (fn, message, code) => { | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 	let d = deprecationCache.get(message); | 
					
						
							|  |  |  | 	if (d === undefined) { | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 		d = util.deprecate(deprecatedFunction, message, code); | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 		deprecationCache.set(message, d); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return (...args) => { | 
					
						
							|  |  |  | 		d(); | 
					
						
							|  |  |  | 		return fn(...args); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-23 01:23:48 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  |  * @param {string | function(PathData, AssetInfo=): string} path the raw path | 
					
						
							| 
									
										
										
										
											2018-08-23 01:23:48 +08:00
										 |  |  |  * @param {PathData} data context data | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  |  * @param {AssetInfo} assetInfo extra info about the asset (will be written to) | 
					
						
							| 
									
										
										
										
											2018-08-23 01:23:48 +08:00
										 |  |  |  * @returns {string} the interpolated path | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-09-11 17:13:46 +08:00
										 |  |  | const replacePathVariables = (path, data, assetInfo) => { | 
					
						
							| 
									
										
										
										
											2018-08-23 01:23:48 +08:00
										 |  |  | 	const chunkGraph = data.chunkGraph; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 19:13:09 +08:00
										 |  |  | 	/** @type {Map<string, Function>} */ | 
					
						
							| 
									
										
										
										
											2018-10-30 17:49:49 +08:00
										 |  |  | 	const replacements = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 	// Filename context
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Placeholders
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2020-07-16 14:01:22 +08:00
										 |  |  | 	// for /some/path/file.js?query#fragment:
 | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 	// [file] - /some/path/file.js
 | 
					
						
							|  |  |  | 	// [query] - ?query
 | 
					
						
							| 
									
										
										
										
											2020-07-16 14:01:22 +08:00
										 |  |  | 	// [fragment] - #fragment
 | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 	// [base] - file.js
 | 
					
						
							|  |  |  | 	// [path] - /some/path/
 | 
					
						
							|  |  |  | 	// [name] - file
 | 
					
						
							|  |  |  | 	// [ext] - .js
 | 
					
						
							| 
									
										
										
										
											2021-06-29 18:06:45 +08:00
										 |  |  | 	if (typeof data.filename === "string") { | 
					
						
							| 
									
										
										
										
											2022-02-01 22:47:32 +08:00
										 |  |  | 		// check that filename is data uri
 | 
					
						
							|  |  |  | 		let match = data.filename.match(/^data:([^;,]+)/); | 
					
						
							|  |  |  | 		if (match) { | 
					
						
							|  |  |  | 			const ext = mime.extension(match[1]); | 
					
						
							|  |  |  | 			const emptyReplacer = replacer("", true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			replacements.set("file", emptyReplacer); | 
					
						
							|  |  |  | 			replacements.set("query", emptyReplacer); | 
					
						
							|  |  |  | 			replacements.set("fragment", emptyReplacer); | 
					
						
							|  |  |  | 			replacements.set("path", emptyReplacer); | 
					
						
							|  |  |  | 			replacements.set("base", emptyReplacer); | 
					
						
							|  |  |  | 			replacements.set("name", emptyReplacer); | 
					
						
							|  |  |  | 			replacements.set("ext", replacer(ext ? `.${ext}` : "", true)); | 
					
						
							|  |  |  | 			// Legacy
 | 
					
						
							|  |  |  | 			replacements.set( | 
					
						
							|  |  |  | 				"filebase", | 
					
						
							|  |  |  | 				deprecated( | 
					
						
							|  |  |  | 					emptyReplacer, | 
					
						
							|  |  |  | 					"[filebase] is now [base]", | 
					
						
							|  |  |  | 					"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME" | 
					
						
							|  |  |  | 				) | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			const { path: file, query, fragment } = parseResource(data.filename); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			const ext = extname(file); | 
					
						
							|  |  |  | 			const base = basename(file); | 
					
						
							|  |  |  | 			const name = base.slice(0, base.length - ext.length); | 
					
						
							|  |  |  | 			const path = file.slice(0, file.length - base.length); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			replacements.set("file", replacer(file)); | 
					
						
							|  |  |  | 			replacements.set("query", replacer(query, true)); | 
					
						
							|  |  |  | 			replacements.set("fragment", replacer(fragment, true)); | 
					
						
							|  |  |  | 			replacements.set("path", replacer(path, true)); | 
					
						
							|  |  |  | 			replacements.set("base", replacer(base)); | 
					
						
							|  |  |  | 			replacements.set("name", replacer(name)); | 
					
						
							|  |  |  | 			replacements.set("ext", replacer(ext, true)); | 
					
						
							|  |  |  | 			// Legacy
 | 
					
						
							|  |  |  | 			replacements.set( | 
					
						
							|  |  |  | 				"filebase", | 
					
						
							|  |  |  | 				deprecated( | 
					
						
							|  |  |  | 					replacer(base), | 
					
						
							|  |  |  | 					"[filebase] is now [base]", | 
					
						
							|  |  |  | 					"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME" | 
					
						
							|  |  |  | 				) | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-12-20 10:03:15 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 	// Compilation context
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Placeholders
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2018-11-05 16:13:40 +08:00
										 |  |  | 	// [fullhash] - data.hash (3a4b5c6e7f)
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Legacy Placeholders
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 	// [hash] - data.hash (3a4b5c6e7f)
 | 
					
						
							|  |  |  | 	if (data.hash) { | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | 		const hashReplacer = hashLength( | 
					
						
							|  |  |  | 			replacer(data.hash), | 
					
						
							|  |  |  | 			data.hashWithLength, | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | 			assetInfo, | 
					
						
							|  |  |  | 			"fullhash" | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 19:13:09 +08:00
										 |  |  | 		replacements.set("fullhash", hashReplacer); | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Legacy
 | 
					
						
							|  |  |  | 		replacements.set( | 
					
						
							| 
									
										
										
										
											2018-10-30 19:13:09 +08:00
										 |  |  | 			"hash", | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 			deprecated( | 
					
						
							|  |  |  | 				hashReplacer, | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 				"[hash] is now [fullhash] (also consider using [chunkhash] or [contenthash], see documentation for details)", | 
					
						
							|  |  |  | 				"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_HASH" | 
					
						
							| 
									
										
										
										
											2018-03-23 02:52:11 +08:00
										 |  |  | 			) | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 	// Chunk Context
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Placeholders
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// [id] - chunk.id (0.js)
 | 
					
						
							|  |  |  | 	// [name] - chunk.name (app.js)
 | 
					
						
							|  |  |  | 	// [chunkhash] - chunk.hash (7823t4t4.js)
 | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | 	// [contenthash] - chunk.contentHash[type] (3256u3zg.js)
 | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 	if (data.chunk) { | 
					
						
							|  |  |  | 		const chunk = data.chunk; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const contentHashType = data.contentHashType; | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		const idReplacer = replacer(chunk.id); | 
					
						
							|  |  |  | 		const nameReplacer = replacer(chunk.name || chunk.id); | 
					
						
							|  |  |  | 		const chunkhashReplacer = hashLength( | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 			replacer(chunk instanceof Chunk ? chunk.renderedHash : chunk.hash), | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | 			"hashWithLength" in chunk ? chunk.hashWithLength : undefined, | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | 			assetInfo, | 
					
						
							|  |  |  | 			"chunkhash" | 
					
						
							| 
									
										
										
										
											2018-10-30 17:49:49 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 		const contenthashReplacer = hashLength( | 
					
						
							|  |  |  | 			replacer( | 
					
						
							|  |  |  | 				data.contentHash || | 
					
						
							|  |  |  | 					(contentHashType && | 
					
						
							|  |  |  | 						chunk.contentHash && | 
					
						
							|  |  |  | 						chunk.contentHash[contentHashType]) | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			data.contentHashWithLength || | 
					
						
							|  |  |  | 				("contentHashWithLength" in chunk && chunk.contentHashWithLength | 
					
						
							|  |  |  | 					? chunk.contentHashWithLength[contentHashType] | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | 					: undefined), | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | 			assetInfo, | 
					
						
							|  |  |  | 			"contenthash" | 
					
						
							| 
									
										
										
										
											2018-10-30 17:49:49 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 19:13:09 +08:00
										 |  |  | 		replacements.set("id", idReplacer); | 
					
						
							|  |  |  | 		replacements.set("name", nameReplacer); | 
					
						
							|  |  |  | 		replacements.set("chunkhash", chunkhashReplacer); | 
					
						
							|  |  |  | 		replacements.set("contenthash", contenthashReplacer); | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Module Context
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Placeholders
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// [id] - module.id (2.png)
 | 
					
						
							|  |  |  | 	// [hash] - module.hash (6237543873.png)
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// Legacy Placeholders
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// [moduleid] - module.id (2.png)
 | 
					
						
							|  |  |  | 	// [modulehash] - module.hash (6237543873.png)
 | 
					
						
							|  |  |  | 	if (data.module) { | 
					
						
							|  |  |  | 		const module = data.module; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 		const idReplacer = replacer(() => | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 			prepareId( | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | 				module instanceof Module | 
					
						
							|  |  |  | 					? /** @type {ChunkGraph} */ (chunkGraph).getModuleId(module) | 
					
						
							|  |  |  | 					: module.id | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			) | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2020-07-17 20:57:11 +08:00
										 |  |  | 		const moduleHashReplacer = hashLength( | 
					
						
							| 
									
										
										
										
											2020-07-28 00:09:48 +08:00
										 |  |  | 			replacer(() => | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 				module instanceof Module | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | 					? /** @type {ChunkGraph} */ (chunkGraph).getRenderedModuleHash( | 
					
						
							|  |  |  | 							module, | 
					
						
							|  |  |  | 							data.runtime | 
					
						
							|  |  |  | 						) | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 					: module.hash | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 			), | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | 			"hashWithLength" in module ? module.hashWithLength : undefined, | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | 			assetInfo, | 
					
						
							|  |  |  | 			"modulehash" | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2020-07-17 20:57:11 +08:00
										 |  |  | 		const contentHashReplacer = hashLength( | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | 			replacer(/** @type {string} */ (data.contentHash)), | 
					
						
							| 
									
										
										
										
											2020-07-17 20:57:11 +08:00
										 |  |  | 			undefined, | 
					
						
							| 
									
										
										
										
											2020-08-19 03:14:43 +08:00
										 |  |  | 			assetInfo, | 
					
						
							|  |  |  | 			"contenthash" | 
					
						
							| 
									
										
										
										
											2020-07-17 20:57:11 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 19:13:09 +08:00
										 |  |  | 		replacements.set("id", idReplacer); | 
					
						
							| 
									
										
										
										
											2020-07-17 20:57:11 +08:00
										 |  |  | 		replacements.set("modulehash", moduleHashReplacer); | 
					
						
							|  |  |  | 		replacements.set("contenthash", contentHashReplacer); | 
					
						
							|  |  |  | 		replacements.set( | 
					
						
							|  |  |  | 			"hash", | 
					
						
							|  |  |  | 			data.contentHash ? contentHashReplacer : moduleHashReplacer | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-10-30 17:49:49 +08:00
										 |  |  | 		// Legacy
 | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 		replacements.set( | 
					
						
							| 
									
										
										
										
											2018-10-30 19:13:09 +08:00
										 |  |  | 			"moduleid", | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 			deprecated( | 
					
						
							|  |  |  | 				idReplacer, | 
					
						
							|  |  |  | 				"[moduleid] is now [id]", | 
					
						
							|  |  |  | 				"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_MODULE_ID" | 
					
						
							|  |  |  | 			) | 
					
						
							| 
									
										
										
										
											2018-10-30 18:50:54 +08:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-30 17:49:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-17 22:02:33 +08:00
										 |  |  | 	// Other things
 | 
					
						
							|  |  |  | 	if (data.url) { | 
					
						
							|  |  |  | 		replacements.set("url", replacer(data.url)); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-11-28 19:42:03 +08:00
										 |  |  | 	if (typeof data.runtime === "string") { | 
					
						
							|  |  |  | 		replacements.set( | 
					
						
							|  |  |  | 			"runtime", | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | 			replacer(() => prepareId(/** @type {string} */ (data.runtime))) | 
					
						
							| 
									
										
										
										
											2020-11-28 19:42:03 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		replacements.set("runtime", replacer("_")); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-07-17 22:02:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-30 17:49:49 +08:00
										 |  |  | 	if (typeof path === "function") { | 
					
						
							| 
									
										
										
										
											2019-09-13 17:12:26 +08:00
										 |  |  | 		path = path(data, assetInfo); | 
					
						
							| 
									
										
										
										
											2018-10-30 17:49:49 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-05 18:15:03 +08:00
										 |  |  | 	path = path.replace(REGEXP, (match, content) => { | 
					
						
							|  |  |  | 		if (content.length + 2 === match.length) { | 
					
						
							|  |  |  | 			const contentMatch = /^(\w+)(?::(\w+))?$/.exec(content); | 
					
						
							|  |  |  | 			if (!contentMatch) return match; | 
					
						
							|  |  |  | 			const [, kind, arg] = contentMatch; | 
					
						
							|  |  |  | 			const replacer = replacements.get(kind); | 
					
						
							|  |  |  | 			if (replacer !== undefined) { | 
					
						
							|  |  |  | 				return replacer(match, arg, path); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else if (match.startsWith("[\\") && match.endsWith("\\]")) { | 
					
						
							|  |  |  | 			return `[${match.slice(2, -2)}]`; | 
					
						
							| 
									
										
										
										
											2018-10-30 19:13:09 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return match; | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2018-10-30 17:49:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return path; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | const plugin = "TemplatedPathPlugin"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-06 23:11:30 +08:00
										 |  |  | class TemplatedPathPlugin { | 
					
						
							| 
									
										
										
										
											2018-11-03 04:05:46 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Apply the plugin | 
					
						
							|  |  |  | 	 * @param {Compiler} compiler the compiler instance | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2017-01-06 23:11:30 +08:00
										 |  |  | 	apply(compiler) { | 
					
						
							| 
									
										
										
										
											2018-09-28 19:10:37 +08:00
										 |  |  | 		compiler.hooks.compilation.tap(plugin, compilation => { | 
					
						
							| 
									
										
										
										
											2019-10-04 18:24:52 +08:00
										 |  |  | 			compilation.hooks.assetPath.tap(plugin, replacePathVariables); | 
					
						
							| 
									
										
										
										
											2015-06-25 05:17:12 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-06 23:11:30 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = TemplatedPathPlugin; |