| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-04 15:04:05 +08:00
										 |  |  | const util = require("util"); | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | const SortableSet = require("./util/SortableSet"); | 
					
						
							| 
									
										
										
										
											2018-12-20 15:51:54 +08:00
										 |  |  | const { | 
					
						
							|  |  |  | 	compareChunks, | 
					
						
							| 
									
										
										
										
											2025-07-03 17:06:45 +08:00
										 |  |  | 	compareIterables, | 
					
						
							|  |  |  | 	compareLocations | 
					
						
							| 
									
										
										
										
											2018-12-20 15:51:54 +08:00
										 |  |  | } = require("./util/comparators"); | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-05 20:22:10 +08:00
										 |  |  | /** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */ | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | /** @typedef {import("./Chunk")} Chunk */ | 
					
						
							| 
									
										
										
										
											2018-08-14 17:18:22 +08:00
										 |  |  | /** @typedef {import("./ChunkGraph")} ChunkGraph */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | /** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */ | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | /** @typedef {import("./Entrypoint")} Entrypoint */ | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | /** @typedef {import("./Module")} Module */ | 
					
						
							| 
									
										
										
										
											2018-08-16 22:11:20 +08:00
										 |  |  | /** @typedef {import("./ModuleGraph")} ModuleGraph */ | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-02 22:12:40 +08:00
										 |  |  | /** @typedef {{ module: Module | null, loc: DependencyLocation, request: string }} OriginRecord */ | 
					
						
							| 
									
										
										
										
											2019-06-14 17:44:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  |  * @typedef {object} RawChunkGroupOptions | 
					
						
							| 
									
										
										
										
											2019-06-14 17:44:54 +08:00
										 |  |  |  * @property {number=} preloadOrder | 
					
						
							|  |  |  |  * @property {number=} prefetchOrder | 
					
						
							| 
									
										
										
										
											2023-05-24 08:26:50 +08:00
										 |  |  |  * @property {("low" | "high" | "auto")=} fetchPriority | 
					
						
							| 
									
										
										
										
											2019-06-14 17:44:54 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-25 02:13:59 +08:00
										 |  |  | /** @typedef {RawChunkGroupOptions & { name?: string | null }} ChunkGroupOptions */ | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | let debugId = 5000; | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2018-06-05 05:22:20 +08:00
										 |  |  |  * @template T | 
					
						
							| 
									
										
										
										
											2018-06-20 06:32:15 +08:00
										 |  |  |  * @param {SortableSet<T>} set set to convert to array. | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  |  * @returns {T[]} the array format of existing set | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | const getArray = (set) => [...set]; | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * A convenience method used to sort chunks based on their id's | 
					
						
							| 
									
										
										
										
											2018-07-05 13:07:46 +08:00
										 |  |  |  * @param {ChunkGroup} a first sorting comparator | 
					
						
							|  |  |  |  * @param {ChunkGroup} b second sorting comparator | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  |  * @returns {1|0|-1} a sorting index to determine order | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | const sortById = (a, b) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	if (a.id < b.id) return -1; | 
					
						
							|  |  |  | 	if (b.id < a.id) return 1; | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2018-06-06 12:11:24 +08:00
										 |  |  |  * @param {OriginRecord} a the first comparator in sort | 
					
						
							|  |  |  |  * @param {OriginRecord} b the second comparator in sort | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  |  * @returns {1|-1|0} returns sorting order as index | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-01-20 18:28:45 +08:00
										 |  |  | const sortOrigin = (a, b) => { | 
					
						
							|  |  |  | 	const aIdent = a.module ? a.module.identifier() : ""; | 
					
						
							|  |  |  | 	const bIdent = b.module ? b.module.identifier() : ""; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	if (aIdent < bIdent) return -1; | 
					
						
							|  |  |  | 	if (aIdent > bIdent) return 1; | 
					
						
							| 
									
										
										
										
											2018-01-20 18:28:45 +08:00
										 |  |  | 	return compareLocations(a.loc, b.loc); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | class ChunkGroup { | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Creates an instance of ChunkGroup. | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | 	 * @param {string | ChunkGroupOptions=} options chunk group options passed to chunkGroup | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 	constructor(options) { | 
					
						
							|  |  |  | 		if (typeof options === "string") { | 
					
						
							|  |  |  | 			options = { name: options }; | 
					
						
							|  |  |  | 		} else if (!options) { | 
					
						
							|  |  |  | 			options = { name: undefined }; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 		/** @type {number} */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		this.groupDebugId = debugId++; | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 		this.options = /** @type {ChunkGroupOptions} */ (options); | 
					
						
							| 
									
										
										
										
											2018-07-05 13:07:46 +08:00
										 |  |  | 		/** @type {SortableSet<ChunkGroup>} */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		this._children = new SortableSet(undefined, sortById); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		/** @type {SortableSet<ChunkGroup>} */ | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 		this._parents = new SortableSet(undefined, sortById); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		/** @type {SortableSet<ChunkGroup>} */ | 
					
						
							|  |  |  | 		this._asyncEntrypoints = new SortableSet(undefined, sortById); | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		this._blocks = new SortableSet(); | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 		/** @type {Chunk[]} */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		this.chunks = []; | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 		/** @type {OriginRecord[]} */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		this.origins = []; | 
					
						
							| 
									
										
										
										
											2019-08-10 02:06:23 +08:00
										 |  |  | 		/** Indices in top-down order */ | 
					
						
							| 
									
										
										
										
											2024-06-11 20:32:02 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * @private | 
					
						
							|  |  |  | 		 * @type {Map<Module, number>} | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2018-10-12 23:51:28 +08:00
										 |  |  | 		this._modulePreOrderIndices = new Map(); | 
					
						
							| 
									
										
										
										
											2019-08-10 02:06:23 +08:00
										 |  |  | 		/** Indices in bottom-up order */ | 
					
						
							| 
									
										
										
										
											2024-06-11 20:32:02 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * @private | 
					
						
							|  |  |  | 		 * @type {Map<Module, number>} | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2018-10-12 23:51:28 +08:00
										 |  |  | 		this._modulePostOrderIndices = new Map(); | 
					
						
							| 
									
										
										
										
											2023-06-04 01:52:25 +08:00
										 |  |  | 		/** @type {number | undefined} */ | 
					
						
							| 
									
										
										
										
											2019-09-26 21:51:40 +08:00
										 |  |  | 		this.index = undefined; | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * when a new chunk is added to a chunkGroup, addingOptions will occur. | 
					
						
							|  |  |  | 	 * @param {ChunkGroupOptions} options the chunkGroup options passed to addOptions | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 	addOptions(options) { | 
					
						
							| 
									
										
										
										
											2025-09-11 08:10:10 +08:00
										 |  |  | 		for (const key of /** @type {(keyof ChunkGroupOptions)[]} */ ( | 
					
						
							|  |  |  | 			Object.keys(options) | 
					
						
							|  |  |  | 		)) { | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 			if (this.options[key] === undefined) { | 
					
						
							| 
									
										
										
										
											2025-09-11 08:10:10 +08:00
										 |  |  | 				/** @type {ChunkGroupOptions[keyof ChunkGroupOptions]} */ | 
					
						
							|  |  |  | 				(this.options[key]) = options[key]; | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 			} else if (this.options[key] !== options[key]) { | 
					
						
							| 
									
										
										
										
											2018-04-17 00:00:34 +08:00
										 |  |  | 				if (key.endsWith("Order")) { | 
					
						
							| 
									
										
										
										
											2025-05-20 18:36:47 +08:00
										 |  |  | 					const orderKey = | 
					
						
							|  |  |  | 						/** @type {Exclude<keyof ChunkGroupOptions, "name" | "fetchPriority">} */ | 
					
						
							|  |  |  | 						(key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					this.options[orderKey] = Math.max( | 
					
						
							|  |  |  | 						/** @type {number} */ | 
					
						
							|  |  |  | 						(this.options[orderKey]), | 
					
						
							|  |  |  | 						/** @type {number} */ | 
					
						
							|  |  |  | 						(options[orderKey]) | 
					
						
							| 
									
										
										
										
											2024-03-18 23:28:40 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 				} else { | 
					
						
							|  |  |  | 					throw new Error( | 
					
						
							|  |  |  | 						`ChunkGroup.addOptions: No option merge strategy for ${key}` | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * returns the name of current ChunkGroup | 
					
						
							| 
									
										
										
										
											2025-09-11 08:10:10 +08:00
										 |  |  | 	 * @returns {ChunkGroupOptions["name"]} returns the ChunkGroup name | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 	get name() { | 
					
						
							|  |  |  | 		return this.options.name; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * sets a new name for current ChunkGroup | 
					
						
							| 
									
										
										
										
											2023-06-04 01:52:25 +08:00
										 |  |  | 	 * @param {string | undefined} value the new name for ChunkGroup | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 	set name(value) { | 
					
						
							|  |  |  | 		this.options.name = value; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-17 17:52:08 +08:00
										 |  |  | 	/* istanbul ignore next */ | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * get a uniqueId for ChunkGroup, made up of its member Chunk debugId's | 
					
						
							|  |  |  | 	 * @returns {string} a unique concatenation of chunk debugId's | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	get debugId() { | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 		return Array.from(this.chunks, (x) => x.debugId).join("+"); | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * get a unique id for ChunkGroup, made up of its member Chunk id's | 
					
						
							|  |  |  | 	 * @returns {string} a unique concatenation of chunk ids | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	get id() { | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 		return Array.from(this.chunks, (x) => x.id).join("+"); | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Performs an unshift of a specific chunk | 
					
						
							|  |  |  | 	 * @param {Chunk} chunk chunk being unshifted | 
					
						
							|  |  |  | 	 * @returns {boolean} returns true if attempted chunk shift is accepted | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	unshiftChunk(chunk) { | 
					
						
							|  |  |  | 		const oldIdx = this.chunks.indexOf(chunk); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (oldIdx > 0) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			this.chunks.splice(oldIdx, 1); | 
					
						
							|  |  |  | 			this.chunks.unshift(chunk); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if (oldIdx < 0) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			this.chunks.unshift(chunk); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * inserts a chunk before another existing chunk in group | 
					
						
							|  |  |  | 	 * @param {Chunk} chunk Chunk being inserted | 
					
						
							|  |  |  | 	 * @param {Chunk} before Placeholder/target chunk marking new chunk insertion point | 
					
						
							|  |  |  | 	 * @returns {boolean} return true if insertion was successful | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	insertChunk(chunk, before) { | 
					
						
							|  |  |  | 		const oldIdx = this.chunks.indexOf(chunk); | 
					
						
							|  |  |  | 		const idx = this.chunks.indexOf(before); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (idx < 0) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			throw new Error("before chunk not found"); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (oldIdx >= 0 && oldIdx > idx) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			this.chunks.splice(oldIdx, 1); | 
					
						
							|  |  |  | 			this.chunks.splice(idx, 0, chunk); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if (oldIdx < 0) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			this.chunks.splice(idx, 0, chunk); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * add a chunk into ChunkGroup. Is pushed on or prepended | 
					
						
							|  |  |  | 	 * @param {Chunk} chunk chunk being pushed into ChunkGroupS | 
					
						
							| 
									
										
										
										
											2019-08-10 01:52:26 +08:00
										 |  |  | 	 * @returns {boolean} returns true if chunk addition was successful. | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	pushChunk(chunk) { | 
					
						
							|  |  |  | 		const oldIdx = this.chunks.indexOf(chunk); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (oldIdx >= 0) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		this.chunks.push(chunk); | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Chunk} oldChunk chunk to be replaced | 
					
						
							| 
									
										
										
										
											2019-08-10 01:53:49 +08:00
										 |  |  | 	 * @param {Chunk} newChunk New chunk that will be replaced with | 
					
						
							| 
									
										
										
										
											2024-02-21 22:55:02 +08:00
										 |  |  | 	 * @returns {boolean | undefined} returns true if the replacement was successful | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	replaceChunk(oldChunk, newChunk) { | 
					
						
							|  |  |  | 		const oldIdx = this.chunks.indexOf(oldChunk); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (oldIdx < 0) return false; | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		const newIdx = this.chunks.indexOf(newChunk); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (newIdx < 0) { | 
					
						
							| 
									
										
										
										
											2018-01-20 18:28:45 +08:00
										 |  |  | 			this.chunks[oldIdx] = newChunk; | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (newIdx < oldIdx) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			this.chunks.splice(oldIdx, 1); | 
					
						
							|  |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if (newIdx !== oldIdx) { | 
					
						
							| 
									
										
										
										
											2018-01-20 18:28:45 +08:00
										 |  |  | 			this.chunks[oldIdx] = newChunk; | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			this.chunks.splice(newIdx, 1); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Chunk} chunk chunk to remove | 
					
						
							|  |  |  | 	 * @returns {boolean} returns true if chunk was removed | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	removeChunk(chunk) { | 
					
						
							|  |  |  | 		const idx = this.chunks.indexOf(chunk); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (idx >= 0) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			this.chunks.splice(idx, 1); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {boolean} true, when this chunk group will be loaded on initial page load | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	isInitial() { | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 	 * @param {ChunkGroup} group chunk group to add | 
					
						
							|  |  |  | 	 * @returns {boolean} returns true if chunk group was added | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	addChild(group) { | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		const size = this._children.size; | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 		this._children.add(group); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		return size !== this._children.size; | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {ChunkGroup[]} returns the children of this group | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	getChildren() { | 
					
						
							|  |  |  | 		return this._children.getFromCache(getArray); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	getNumberOfChildren() { | 
					
						
							|  |  |  | 		return this._children.size; | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	get childrenIterable() { | 
					
						
							|  |  |  | 		return this._children; | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ChunkGroup} group the chunk group to remove | 
					
						
							|  |  |  | 	 * @returns {boolean} returns true if the chunk group was removed | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	removeChild(group) { | 
					
						
							|  |  |  | 		if (!this._children.has(group)) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 		this._children.delete(group); | 
					
						
							|  |  |  | 		group.removeParent(this); | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ChunkGroup} parentChunk the parent group to be added into | 
					
						
							|  |  |  | 	 * @returns {boolean} returns true if this chunk group was added to the parent group | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	addParent(parentChunk) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (!this._parents.has(parentChunk)) { | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 			this._parents.add(parentChunk); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {ChunkGroup[]} returns the parents of this group | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	getParents() { | 
					
						
							|  |  |  | 		return this._parents.getFromCache(getArray); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	getNumberOfParents() { | 
					
						
							|  |  |  | 		return this._parents.size; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ChunkGroup} parent the parent group | 
					
						
							|  |  |  | 	 * @returns {boolean} returns true if the parent group contains this group | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | 	hasParent(parent) { | 
					
						
							|  |  |  | 		return this._parents.has(parent); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	get parentsIterable() { | 
					
						
							|  |  |  | 		return this._parents; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ChunkGroup} chunkGroup the parent group | 
					
						
							|  |  |  | 	 * @returns {boolean} returns true if this group has been removed from the parent | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-08-14 17:18:22 +08:00
										 |  |  | 	removeParent(chunkGroup) { | 
					
						
							|  |  |  | 		if (this._parents.delete(chunkGroup)) { | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 			chunkGroup.removeChild(this); | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Entrypoint} entrypoint entrypoint to add | 
					
						
							|  |  |  | 	 * @returns {boolean} returns true if entrypoint was added | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	addAsyncEntrypoint(entrypoint) { | 
					
						
							|  |  |  | 		const size = this._asyncEntrypoints.size; | 
					
						
							|  |  |  | 		this._asyncEntrypoints.add(entrypoint); | 
					
						
							|  |  |  | 		return size !== this._asyncEntrypoints.size; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	get asyncEntrypointsIterable() { | 
					
						
							|  |  |  | 		return this._asyncEntrypoints; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2025-08-28 18:34:30 +08:00
										 |  |  | 	 * @returns {AsyncDependenciesBlock[]} an array containing the blocks | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	getBlocks() { | 
					
						
							|  |  |  | 		return this._blocks.getFromCache(getArray); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	getNumberOfBlocks() { | 
					
						
							|  |  |  | 		return this._blocks.size; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-25 06:41:32 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {AsyncDependenciesBlock} block block | 
					
						
							|  |  |  | 	 * @returns {boolean} true, if block exists | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	hasBlock(block) { | 
					
						
							|  |  |  | 		return this._blocks.has(block); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-05 20:22:10 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {Iterable<AsyncDependenciesBlock>} blocks | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	get blocksIterable() { | 
					
						
							|  |  |  | 		return this._blocks; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-05 20:22:10 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {AsyncDependenciesBlock} block a block | 
					
						
							|  |  |  | 	 * @returns {boolean} false, if block was already added | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	addBlock(block) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (!this._blocks.has(block)) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			this._blocks.add(block); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-13 23:27:31 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2024-08-07 23:22:25 +08:00
										 |  |  | 	 * @param {Module | null} module origin module | 
					
						
							| 
									
										
										
										
											2018-07-13 23:27:31 +08:00
										 |  |  | 	 * @param {DependencyLocation} loc location of the reference in the origin module | 
					
						
							|  |  |  | 	 * @param {string} request request name of the reference | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	addOrigin(module, loc, request) { | 
					
						
							|  |  |  | 		this.origins.push({ | 
					
						
							|  |  |  | 			module, | 
					
						
							|  |  |  | 			loc, | 
					
						
							|  |  |  | 			request | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 17:49:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {string[]} the files contained this chunk group | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 	getFiles() { | 
					
						
							|  |  |  | 		const files = new Set(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for (const chunk of this.chunks) { | 
					
						
							|  |  |  | 			for (const file of chunk.files) { | 
					
						
							|  |  |  | 				files.add(file); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-03 17:06:45 +08:00
										 |  |  | 		return [...files]; | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-08-14 22:40:37 +08:00
										 |  |  | 	remove() { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		// cleanup parents
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const parentChunkGroup of this._parents) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			// remove this chunk from its parents
 | 
					
						
							|  |  |  | 			parentChunkGroup._children.delete(this); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// cleanup "sub chunks"
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			for (const chunkGroup of this._children) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 				/** | 
					
						
							|  |  |  | 				 * remove this chunk as "intermediary" and connect | 
					
						
							|  |  |  | 				 * it "sub chunks" and parents directly | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				// add parent to each "sub chunk"
 | 
					
						
							|  |  |  | 				chunkGroup.addParent(parentChunkGroup); | 
					
						
							|  |  |  | 				// add "sub chunk" to parent
 | 
					
						
							|  |  |  | 				parentChunkGroup.addChild(chunkGroup); | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/** | 
					
						
							|  |  |  | 		 * we need to iterate again over the children | 
					
						
							| 
									
										
										
										
											2019-08-10 01:57:28 +08:00
										 |  |  | 		 * to remove this from the child's parents. | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		 * This can not be done in the above loop | 
					
						
							| 
									
										
										
										
											2018-02-26 10:30:35 +08:00
										 |  |  | 		 * as it is not guaranteed that `this._parents` contains anything. | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const chunkGroup of this._children) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			// remove this as parent of every "sub chunk"
 | 
					
						
							|  |  |  | 			chunkGroup._parents.delete(this); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// remove chunks
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const chunk of this.chunks) { | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 			chunk.removeGroup(this); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sortItems() { | 
					
						
							| 
									
										
										
										
											2018-01-20 18:28:45 +08:00
										 |  |  | 		this.origins.sort(sortOrigin); | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Sorting predicate which allows current ChunkGroup to be compared against another. | 
					
						
							|  |  |  | 	 * Sorting values are based off of number of chunks in ChunkGroup. | 
					
						
							| 
									
										
										
										
											2018-08-14 17:18:22 +08:00
										 |  |  | 	 * @param {ChunkGraph} chunkGraph the chunk graph | 
					
						
							| 
									
										
										
										
											2018-04-25 05:27:25 +08:00
										 |  |  | 	 * @param {ChunkGroup} otherGroup the chunkGroup to compare this against | 
					
						
							|  |  |  | 	 * @returns {-1|0|1} sort position for comparison | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-08-22 17:49:27 +08:00
										 |  |  | 	compareTo(chunkGraph, otherGroup) { | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 		if (this.chunks.length > otherGroup.chunks.length) return -1; | 
					
						
							|  |  |  | 		if (this.chunks.length < otherGroup.chunks.length) return 1; | 
					
						
							| 
									
										
										
										
											2018-08-28 21:07:28 +08:00
										 |  |  | 		return compareIterables(compareChunks(chunkGraph))( | 
					
						
							|  |  |  | 			this.chunks, | 
					
						
							|  |  |  | 			otherGroup.chunks | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-16 22:11:20 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ModuleGraph} moduleGraph the module graph | 
					
						
							|  |  |  | 	 * @param {ChunkGraph} chunkGraph the chunk graph | 
					
						
							|  |  |  | 	 * @returns {Record<string, ChunkGroup[]>} mapping from children type to ordered list of ChunkGroups | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	getChildrenByOrders(moduleGraph, chunkGraph) { | 
					
						
							|  |  |  | 		/** @type {Map<string, {order: number, group: ChunkGroup}[]>} */ | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 		const lists = new Map(); | 
					
						
							|  |  |  | 		for (const childGroup of this._children) { | 
					
						
							| 
									
										
										
										
											2018-06-27 17:40:24 +08:00
										 |  |  | 			for (const key of Object.keys(childGroup.options)) { | 
					
						
							|  |  |  | 				if (key.endsWith("Order")) { | 
					
						
							| 
									
										
										
										
											2022-03-14 05:54:18 +08:00
										 |  |  | 					const name = key.slice(0, key.length - "Order".length); | 
					
						
							| 
									
										
										
										
											2018-06-27 17:40:24 +08:00
										 |  |  | 					let list = lists.get(name); | 
					
						
							|  |  |  | 					if (list === undefined) { | 
					
						
							|  |  |  | 						lists.set(name, (list = [])); | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-06-27 17:40:24 +08:00
										 |  |  | 					list.push({ | 
					
						
							| 
									
										
										
										
											2023-06-04 01:52:25 +08:00
										 |  |  | 						order: | 
					
						
							|  |  |  | 							/** @type {number} */ | 
					
						
							|  |  |  | 							( | 
					
						
							|  |  |  | 								childGroup.options[/** @type {keyof ChunkGroupOptions} */ (key)] | 
					
						
							|  |  |  | 							), | 
					
						
							| 
									
										
										
										
											2018-06-27 17:40:24 +08:00
										 |  |  | 						group: childGroup | 
					
						
							|  |  |  | 					}); | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-08-16 22:11:20 +08:00
										 |  |  | 		/** @type {Record<string, ChunkGroup[]>} */ | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 		const result = Object.create(null); | 
					
						
							|  |  |  | 		for (const [name, list] of lists) { | 
					
						
							|  |  |  | 			list.sort((a, b) => { | 
					
						
							| 
									
										
										
										
											2018-04-17 00:00:34 +08:00
										 |  |  | 				const cmp = b.order - a.order; | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 				if (cmp !== 0) return cmp; | 
					
						
							| 
									
										
										
										
											2018-08-22 17:49:27 +08:00
										 |  |  | 				return a.group.compareTo(chunkGraph, b.group); | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | 			result[name] = list.map((i) => i.group); | 
					
						
							| 
									
										
										
										
											2018-04-16 16:27:22 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return result; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-12 00:12:30 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Sets the top-down index of a module in this ChunkGroup | 
					
						
							|  |  |  | 	 * @param {Module} module module for which the index should be set | 
					
						
							|  |  |  | 	 * @param {number} index the index of the module | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-04 15:04:05 +08:00
										 |  |  | 	setModulePreOrderIndex(module, index) { | 
					
						
							| 
									
										
										
										
											2018-10-12 23:51:28 +08:00
										 |  |  | 		this._modulePreOrderIndices.set(module, index); | 
					
						
							| 
									
										
										
										
											2018-05-12 00:12:30 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Gets the top-down index of a module in this ChunkGroup | 
					
						
							|  |  |  | 	 * @param {Module} module the module | 
					
						
							| 
									
										
										
										
											2023-06-04 01:52:25 +08:00
										 |  |  | 	 * @returns {number | undefined} index | 
					
						
							| 
									
										
										
										
											2018-05-12 00:12:30 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-04 15:04:05 +08:00
										 |  |  | 	getModulePreOrderIndex(module) { | 
					
						
							| 
									
										
										
										
											2018-10-12 23:51:28 +08:00
										 |  |  | 		return this._modulePreOrderIndices.get(module); | 
					
						
							| 
									
										
										
										
											2018-05-12 00:12:30 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Sets the bottom-up index of a module in this ChunkGroup | 
					
						
							|  |  |  | 	 * @param {Module} module module for which the index should be set | 
					
						
							|  |  |  | 	 * @param {number} index the index of the module | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-04 15:04:05 +08:00
										 |  |  | 	setModulePostOrderIndex(module, index) { | 
					
						
							| 
									
										
										
										
											2018-10-12 23:51:28 +08:00
										 |  |  | 		this._modulePostOrderIndices.set(module, index); | 
					
						
							| 
									
										
										
										
											2018-05-12 00:12:30 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Gets the bottom-up index of a module in this ChunkGroup | 
					
						
							|  |  |  | 	 * @param {Module} module the module | 
					
						
							| 
									
										
										
										
											2023-06-04 01:52:25 +08:00
										 |  |  | 	 * @returns {number | undefined} index | 
					
						
							| 
									
										
										
										
											2018-05-12 00:12:30 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-04 15:04:05 +08:00
										 |  |  | 	getModulePostOrderIndex(module) { | 
					
						
							| 
									
										
										
										
											2018-10-12 23:51:28 +08:00
										 |  |  | 		return this._modulePostOrderIndices.get(module); | 
					
						
							| 
									
										
										
										
											2018-05-12 00:12:30 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-17 17:52:08 +08:00
										 |  |  | 	/* istanbul ignore next */ | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 	checkConstraints() { | 
					
						
							|  |  |  | 		const chunk = this; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const child of chunk._children) { | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			if (!child._parents.has(chunk)) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				throw new Error( | 
					
						
							| 
									
										
										
										
											2019-06-09 17:23:42 +08:00
										 |  |  | 					`checkConstraints: child missing parent ${chunk.debugId} -> ${child.debugId}` | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		for (const parentChunk of chunk._parents) { | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			if (!parentChunk._children.has(chunk)) { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				throw new Error( | 
					
						
							| 
									
										
										
										
											2019-06-09 17:23:42 +08:00
										 |  |  | 					`checkConstraints: parent missing child ${parentChunk.debugId} <- ${chunk.debugId}` | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-01-20 00:06:59 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-04 15:04:05 +08:00
										 |  |  | ChunkGroup.prototype.getModuleIndex = util.deprecate( | 
					
						
							|  |  |  | 	ChunkGroup.prototype.getModulePreOrderIndex, | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 	"ChunkGroup.getModuleIndex was renamed to getModulePreOrderIndex", | 
					
						
							|  |  |  | 	"DEP_WEBPACK_CHUNK_GROUP_GET_MODULE_INDEX" | 
					
						
							| 
									
										
										
										
											2018-09-04 15:04:05 +08:00
										 |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ChunkGroup.prototype.getModuleIndex2 = util.deprecate( | 
					
						
							|  |  |  | 	ChunkGroup.prototype.getModulePostOrderIndex, | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 	"ChunkGroup.getModuleIndex2 was renamed to getModulePostOrderIndex", | 
					
						
							|  |  |  | 	"DEP_WEBPACK_CHUNK_GROUP_GET_MODULE_INDEX_2" | 
					
						
							| 
									
										
										
										
											2018-09-04 15:04:05 +08:00
										 |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-10 05:39:16 +08:00
										 |  |  | module.exports = ChunkGroup; |